Assembly NASM如何设置标签地址相对于没有组织的加载地址

Assembly NASM如何设置标签地址相对于没有组织的加载地址,assembly,nasm,bootloader,gdt,Assembly,Nasm,Bootloader,Gdt,我正在尝试为内核编写一个引导加载程序。目前我正在用汇编加载GDT,但我想编写一些C代码来生成GDT(和IDT)。问题是引导扇区总是在地址0x7c00处加载,所以我需要一种方法来用该地址偏移标签。如果我组装成bin文件,我可以只使用[org 0x7c00],但我想将引导加载程序组装成一个对象文件(NASM不支持该格式的org),以便使用外部符号。 如果没有组织,我的汇编代码中有以下内容: gdt_descriptor: dw gdt_end - gdt_start - 1 dd gdt_start

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

gdt_descriptor:
dw gdt_end - gdt_start - 1
dd gdt_start            
.
.
.
lgdt [gdt_descriptor]
组装时的外观如下所示:

lgdt 0x71
应该是什么时候

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

除了我自己手动添加偏移量(我必须在很多地方添加偏移量),是否有任何指令可用于设置起始地址


编辑:从0xc700更改为0x7c00

如果汇编到对象文件,则可能会链接到该文件。你可以告诉链接器把东西放在哪里。你可能需要把你的东西放在一个单独的部分


还要注意,引导扇区代码是16位实模式,而C代码通常是32/64位保护模式代码。因此,将这些链接在一起通常并不容易,我真的不知道如何从C“生成”GDT…

嗯,我没有想到你的权利。可能必须咬紧牙关,只需保持在组装中。@Ziamor:GDT通常很小,可以硬编码;在内核本身中有第二个GDT可能更容易。也;在引导加载程序的前512字节中切换到保护模式是一个巨大的错误-您必须在BIOS仍然可用的情况下使用它,例如获取内存映射、设置视频模式、获取引导设备/磁盘上的信息等;并且(假设错误处理有用),这将远远超过512字节的容量,并且需要在启动内核/丢弃引导代码/丢弃BIOS之前完成。BIOS引导加载程序的加载地址实际上是0x7c00。使用对象文件、引导加载程序并没有多大意义,需要512字节,并且在末尾有一个0xAA55字。最简单的方法是在一个文件中定义整个引导扇区,以便轻松满足这些要求。否则你就得把它填出来并添加签名。啊,是的,我在原始帖子中将它改为0x7c00。我想要一个对象文件的原因是,我可以使用外部符号,但正如Jester所指出的,代码将处于32位模式,而引导加载程序需要16位即使你有一个16位C编译器,我仍然会使用汇编,这两个原因都是因为我在前面的评论中给出的原因,也因为您将很难让代码适应512字节。