我正在尝试将操作系统开发教程从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
就可以了。