NASM如何在没有org的情况下相对于加载地址设置标签地址

时间:2015-05-19 20:53:43

标签: assembly nasm bootloader gdt

我正在尝试为内核编写引导加载程序。目前我正在使用汇编加载GDT,但我想编写一些C代码来生成GDT(和IDT)问题是引导扇区总是加载到地址0x7c00所以我需要一种方法来抵消我的标签用那个地址。如果我汇编到bin文件,我可以使用[org 0x7c00],但我想将引导加载程序组装到目标文件(NASM不支持这种格式的组织),以便我可以使用外部符号。 没有组织,我在汇编代码中有这个:

ContainingClass.privateStaticField

组装时看起来像:

gdt_descriptor:
dw gdt_end - gdt_start - 1
dd gdt_start            
.
.
.
lgdt [gdt_descriptor]

什么时候应该

lgdt 0x71

表本身也是错误的,因为gdt起始位置没有考虑偏移量。

保存我自己手动添加偏移量(我可能会有很多地方),是否有可用于设置起始地址的指令?

编辑:从0xc700更改为0x7c00

1 个答案:

答案 0 :(得分:0)

如果你组装到一个目标文件,你可能会链接它。您可以告诉链接器放置的位置。您可能需要将您的资料放入单独的部分。

另请注意,bootsector代码是16位实模式,而C代码通常是32/64位保护模式代码。因此,将这些链接在一起通常并不容易,我也不会真正看到你将如何产生"来自C的GDT ......