2014-06-18 12 views
6

में opcode के द्विआधारी मैं निम्नलिखित कोड है (सूची फ़ाइल, इंटेल 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 पर अब ध्यान केंद्रित कर रहा हूँ, और मैं पूरी तरह समझ में नहीं आता यह। मैं समझता हूं कि ऑपोड 'लूप' की बाइनरी ई 2 है।

लेकिन जहां से डी 9 बाइट? इसकी गणना कैसे की गई थी?

+0

क्या यह रजिस्टर निर्दिष्ट नहीं करेगा? मान को क्यों न बदलें, और देखें कि डिस्सेप्लर कैसे बदलते हैं? – sashoalm

+0

दो बार पूरक प्रतिनिधित्व के रूप में डी 9 का इलाज करें ... –

उत्तर

9

19 0000002F E2D9 loop r, ecx

कहाँ दूसरा opcode (D9) से आता है?

दूसरा opcode (0xD9 इस मामले में) दो के पूरक में रिश्तेदार गंतव्य पता है - आप पीछे की ओर कूद रहे हैं के बाद से, यह इस मामले में नकारात्मक है:

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

संबंधित मुद्दे