我正在尝试为内核编写引导加载程序。目前我正在用程序集加载 GDT,但我想编写一些 C 代码来生成 GDT(和 IDT)问题是引导扇区总是在地址 0x7c00 加载,所以我需要一种方法来抵消我的标签与那个地址。如果我组装成一个 bin 文件,我可以只使用 [org 0x7c00] 但我想将引导加载程序组装成一个目标文件(NASM 不支持这种格式的 org),以便我可以使用外部符号。如果没有 org,我的汇编代码中有这个:
gdt_descriptor:
dw gdt_end - gdt_start - 1
dd gdt_start
.
.
.
lgdt [gdt_descriptor]
组装后的样子:
lgdt 0x71
什么时候应该
lgdt 0x7c71
该表本身也是错误的,因为 gdt 起始位置没有考虑偏移量。
除了我自己手动添加偏移量(我必须有很多地方),有没有我可以用来设置起始地址的指令?
编辑:从 0xc700 更改为 0x7c00