当我遇到这种情况时,我一直在玩弄 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 下的第一条指令?