当我遇到这种情况时,我一直在玩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中的第一条指令开始于{{ 1}}。
我也注意到了我一直在玩弄的所有其他asm代码中的这种差异。令人惊讶的是,他们每个人都有效。
我错过了什么吗?有人能帮我理解为什么会这样吗?第4行不应该是0E
;指向字节EB0E
,main下的第一条指令?
答案 0 :(得分:2)
0xEB是一个短暂的相对跳跃,因此它是跳转后的IP(0x2)加上偏移量(0xC)使其成为0xE。
答案 1 :(得分:0)
EB
是一个短暂的相对跳跃......
JMP SHORT imm自排量以来最大范围为128个字节 被指定为只有8位,但占用的代码空间更少。
这意味着操作数不是绝对地址,而是当前地址的正偏移或负偏移,如500 - Internal Server Error 所述。