主要通过它来验证汇编中的标号实际是表示段内偏移呢,还是实际的内存地址。
原代码:
nasm boot.asm -o boot.bin
执行ndisasm -o 0x7c00 boot.bin 反汇编后的代码:
看其中一行:
jmp word 0x7c16
比较确定: 标号代表实际的物理地址。
可是仔细一想, 实际的物理地址不是20位的吗? 这里怎么才16位?
看了书才知道:段基址是0x0000, 所以这个还是段内偏移。
为什么需要在最前面加上一条"org 7c00h"?
从后面的代码可以看到, 所有的地址都是以7c00h为基准的。 如果在最前面改为“org 0000h”,那么刚才的
“jmp word 0x7c16”就会变成“jmp word 0x0016”
可是引导代码都是被BIOS加载到0x7c00执行的, 如果执行上述的那条跳转指令, 程序就走到0000:0016去了,显然跑飞了。
所以, 在编写汇编代码时, 一定要知道你的代码在内存中的首地址,否则一旦执行跳转指令,肯定跑飞。