汇编中操作码的二进制

时间:2014-06-18 07:29:59

标签: assembly x86 opcode

我有以下代码(在生成列表文件之后,为intel 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行,我并不完全理解它。 我知道操作码'loop'的二进制文件是E2。

但是从哪里D9字节?如何计算?

1 个答案:

答案 0 :(得分:9)

19 0000002F E2D9 loop r, ecx

  

第二个操作码(D9)来自哪里?

第二个操作码(在这种情况下为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