0

我正在尝试为内核编写引导加载程序。目前我正在用程序集加载 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

4

1 回答 1

0

如果您组装到一个目标文件,您可能会链接它。你可以告诉链接器在哪里放置东西。你可能需要把你的东西放在一个单独的部分。

另请注意,引导扇区代码是 16 位实模式,而 C 代码通常是 32/64 位保护模式代码。因此,将它们链接在一起通常并不容易,而且我真的不知道您将如何从 C 中“生成” GDT ...

于 2015-05-19T21:10:39.380 回答