我有以下代码(在生成列表文件之后,为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字节?如何计算?
答案 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)
请注意,目标地址是根据之后>>循环指令计算的。