조립

2014-06-18 4 views
6

에서 오피 코드의 바이너리 나는 다음과 같은 코드가 (인텔 80X86 작성된 목록 파일 생성 후) :조립

1         global _start 
2         
3         section .data 
4 00000000 03000000    x: dd 3 
5         
6         ;section .text 
7         
8         _start: 
9 00000004 8B0D[00000000]    mov ecx, [x] 
10 0000000A 000D[16000000]   r: add byte [l+6], cl 
11 00000010 C605[00000000]30  l: mov byte [x], 48 
12 00000017 51       push ecx 
13 00000018 B804000000     mov eax, 4  ; For "Write" system call 
14 0000001D BB01000000     mov ebx, 1  ; to standard output 
15 00000022 B9[00000000]    mov ecx, x  ; "buffer" 
16 00000027 BA01000000     mov edx, 1  ; byte counter 
17 0000002C CD80      int 0x80 
18 0000002E 59       pop ecx 
19 0000002F E2D9      loop r, ecx 
20          
21 00000031 BB00000000     mov ebx, 0 
22 00000036 B801000000     mov eax, 1  ; For "exit" system call 
23 0000003B CD80      int 0x80 

내가 행 19에 지금 집중하고있어, 내가 완전히 이해하지를 그것. opcode 'loop'의 이진수가 E2라는 것을 알고 있습니다.

그러나 어디에서 D9 바이트? 어떻게 계산 되었습니까?

+0

레지스터를 지정하지 않으시겠습니까? 값을 변경하지 않고 해체가 어떻게 변하는 지 확인하십시오. – sashoalm

+0

D9를 2의 보수 표현으로 취급하십시오 ... –

답변

9

19 0000002F E2D9 loop r, ecx

두 번째 연산 코드 (D9)는 어디에서 오는가?

(이 경우 0xD9) 제 2 오피 코드는 2의 보수에서 상대 목적지 주소 - 당신은 뒤로 점프되기 때문에,이 경우 음수 :

0x00000031 (The address following the loop instruction) 
+ 0xFFFFFFD9 (Signed-extended representation of 0xD9 - actually a negative number, -39 decimal) 
============ 
    0x0000000A (The address of the r label) 

주 대상이 그 주소는 루프 명령 다음에 주소 을 기반으로 계산됩니다.

도 참조 http://www.mathemainzel.info/files/x86asmref.html#loop

+2

0xFFFFFFD9 부호 확장 기호. – diapir

+0

감사합니다! 이제는 아주 분명합니다. – Mickey