用GCC (gas/as)汇编elf64格式的32位模式指令



我正在尝试将操作系统开发教程从NASM英特尔语法移植到GAS (gcc/as)。

我翻译成AT&T语法没有问题,除了一个指令:bits 32。这是必要的,因为处理器在多引导入口点仍然处于保护模式(32位模式),但是我们将64位内核构建为64位ELF可执行文件。

使用NASM,我将把bits 32指令放在我的文件(boot.asm)的开头,然后用:nasm -f elf64 boot.asm -o boot.o

组装

我在网上发现,我可以用GCC的-m32选项替换bits 32指令(相当于as --32):

gcc -c -m32 boot.S -o boot.o

然而,这将输出格式转换为elf32,当我希望elf64与编译器生成的64位代码链接时,因为入口点切换到长模式。

我该如何解决这个问题?有没有其他的方法来使用没有-m32的32位指令,或者用GCC和/或GNU汇编器分别指定与输出格式不同的模式?

教程链接:https://os.phil-opp.com/multiboot-kernel/

我发现我错过了什么:

bits 32指令简单地替换为.code32就可以了。

相关内容

  • 没有找到相关文章