2014-06-18 14 views
6

Mam następujący kod (po produkcji plik guide pisemnej Intel 80x86):binarny z opcode w montażu

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 

jestem koncentrując się na wierszu 19, a ja zupełnie nie rozumiem to. Rozumiem, że binarną opcją pętli jest E2.

Ale skąd pochodzi bajt D9? jak to zostało obliczone?

+0

Czy to nie wyszczególniłoby rejestru? Dlaczego nie zmienić wartości i zobaczyć, jak zmienia się demontaż? – sashoalm

+0

Traktuj D9 jako dwójkę uzupełnienia ... –

Odpowiedz

9

19 0000002F E2D9 loop r, ecx

Skąd sekund opcode (D9) pochodzi?

Drugi kod operacji (0xD9 w tym przypadku) jest adres względem przeznaczenia w dwóch uzupełnień - skoro są skoki wstecz, jest negatywna w tym przypadku:

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) 

Uwaga że docelowy adres jest obliczany na podstawie adresu po instrukcji pętli.

Zobacz także http://www.mathemainzel.info/files/x86asmref.html#loop

+2

0xFFFFFFD9 z rozszerzeniem znaku. – diapir

+0

Dziękujemy! teraz jest bardzo jasne. – Mickey