3

我正在 Mac OS X 环境下编写一个简单的操作系统。我可以通过 nasm 构建一个简单的引导加载程序。当我用 C 语言开发更多部分时,我应该将它们一起构建。Mac OS X 的 GCC 将编译一个 Mach-O 输出格式。我想知道如何 cat 输出对象的指令部分,并将其与 nasm 部分链接在一起。

谢谢。

4

1 回答 1

2

还有一个更大的问题,你没有看到。

GCC 不生成 16 位 x86 代码,仅生成 32 位或 64 位。x86 PC 引导加载程序以实寻址模式开始执行,这是一种仅适用于 16 位代码的 16 位模式。

因此,即使您设法将使用 gcc 编译的 C 代码和使用 NASM 编译的汇编代码链接在一起,您也无法执行 C 代码部分(与此相关的任何 32 位代码部分),直到您'已经切换到 32 位保护模式,这不是一件容易的事。

而且您也不想在 512 字节长的引导扇区中切换到保护模式。BIOS 功能不能在保护模式下使用。如果您切换得太早,您将无法从磁盘加载更多内容。

最实用的策略是将引导加载程序分成几个部分。512 字节长的引导扇区将使用 BIOS 磁盘 I/O 功能加载下一部分。这些其他部分将包含整个操作系统,或者通过使用相同的 BIOS I/O 功能或在真实或受保护模式下使用其自己的磁盘驱动程序来加载操作系统其余部分的足够代码。

因此,您注定要为引导扇区手动编写汇编语言的 16 位代码,没有 C,没有 32 位。

但是,您可以使用能够为引导加载程序的其他部分生成 16 位 x86 代码的其他 C 编译器。至少有两个这样的编译器可以在线免费获得:

  • Turbo C++ 1.01(仅在 DOS、Windows XP 或更低版本、带有 DOS/Windows 的 VM 中运行,例如 DosBox)
  • 打开 Watcom C/C++ 1.9(在 DOS、Windows 和可能的 Linux 中运行)
于 2012-10-20T03:28:53.447 回答