1

当我遇到这种情况时,我一直在玩弄 NASM 并研究它是如何编译 asm 代码的。我使用以下命令行编译了我的汇编代码

nasm -f bin crash_test_172.asm -o crash_test -l crash_test_172.lst

它是一个非常简单的 asm 文件,其内容是

bits 16
org 0x7c00

jmp main

Message db "Hello World", 0x0

main:
   cli
   mov ax,cs
   mov ds,ax
   mov es,ax
   mov ss,ax
   sti

当我打开列表文件crash_test_172.lst 时,我发现了这个相当有趣的观察结果。这是列表文件的内容。

 1                                  bits 16
 2                                  org 0x7c00
 3
 4 00000000 EB0C                    jmp main
 5
 6 00000002 48656C6C6F20576F72-     Message db "Hello World", 0x0
 7 0000000B 6C6400
 8
 9                                  main:
10 0000000E FA                         cli
11 0000000F 8CC8                       mov ax,cs
12 00000011 8ED8                       mov ds,ax
13 00000013 8EC0                       mov es,ax
14 00000015 8ED0                       mov ss,ax
15 00000017 FB                         sti
16

如果我没有正确理解这一点,在第 4 行,jmp指令指向字节0C,而根据清单, main 中的第一条指令从0E.

我还注意到我一直在玩弄的所有其他 asm 代码中的这种差异。令人惊讶的是,他们每个人都有效。

我错过了什么吗?有人可以帮我理解为什么会这样吗?第 4 行不应该是EB0E; 指向 byte 0E,main 下的第一条指令?

4

2 回答 2

2

0xEB 是一个短的相对跳转,因此它是跳转后的 IP (0x2) 加上偏移量 (0xC),使其成为 0xE。

于 2013-03-13T22:59:32.210 回答
0

EB是一个短暂的相对跳跃...

JMP SHORT imm 的最大范围为 128 字节,因为位移仅指定为 8 位,但占用的代码空间更少。

这意味着操作数不是绝对地址,而是与当前地址的正偏移或负偏移,如500 - Internal Server Error 所述。

于 2013-03-13T23:07:39.207 回答