2014-06-18 13 views
6

ho il seguente codice (dopo aver prodotto il file profilo, scritto per Intel 80x86):Il binario di codice operativo in assemblea

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 

mi sto concentrando ora in fila 19, e non del tutto a capire esso. Capisco che il codice binario dell'opcode 'loop' sia E2.

Ma da dove il byte D9? come è stato calcolato?

+0

Non specificare il registro? Perché non cambiare il valore e vedere come cambia lo smontaggio? – sashoalm

+0

Tratta D9 come una rappresentazione complementare di due ... –

risposta

9

19 0000002F E2D9 loop r, ecx

Da dove viene il secondo codice operativo (D9) viene?

Il secondo codice operativo (0xD9 in questo caso) è l'indirizzo relativa destinazione in complemento a due - dal momento che si stanno saltando all'indietro, è negativo in questo caso:

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) 

Nota che la destinazione l'indirizzo è calcolato in base all'indirizzo dopo l' l'istruzione loop.

Vedere anche http://www.mathemainzel.info/files/x86asmref.html#loop

+2

0xFFFFFFD9 con estensione di segno. – diapir

+0

Grazie! ora è molto chiaro. – Mickey