我正在Mac OS X环境下编写一个简单的操作系统。我可以通过nasm构建一个简单的bootloader。当我用C语言开发更多部分时,我应该将它们组合在一起。 Mac OS X的GCC将编译Mach-O输出格式。我想知道如何捕获输出对象的指令部分,并将其与nasm部分链接在一起。
感谢。
答案 0 :(得分:2)
有一个更大的问题,你没有看到。
GCC不会生成16位x86代码,只能生成32位或64位。 x86 PC引导加载程序在实际寻址模式下开始执行,这种模式仅适用于16位代码的16位模式。
因此,即使您设法将使用gcc编译的C代码和使用NASM编译的汇编代码链接在一起,您也将无法执行C代码部分(任何32位代码部分),直到在你切换到32位保护模式后,这不是一件容易的事情。
您也不希望在512字节长的引导扇区中切换到保护模式。 BIOS功能无法在保护模式下使用。如果过早切换,您将无法从磁盘加载任何更多东西。
最实用的策略是将引导加载程序分成几个部分。 512字节长的bootsector将使用BIOS磁盘I / O功能加载下一部分。而其他部分将包含整个操作系统或足够的代码,可以通过使用相同的BIOS I / O功能或在真实或受保护模式下使用自己的磁盘驱动程序来加载其余的操作系统。 / p>
所以,你注定要手动为汇编语言编写16位代码用于bootsector,没有C,没有32位。
但是,您可以使用其他能够为引导加载程序的其他部分生成16位x86代码的C编译器。在线免费提供至少两种此类编译器: