3

我有一个从本教程中获得的小型程序集引导加载程序。可以在此处找到引导加载程序的代码。我想知道是否可以从这个引导加载程序运行 c++。我想运行这样一个简单的事情:

#include <iostream>
using namespace std;

int main () {
cout << "Hello World!\n";
return 0;
}

但正如我所见,它带来了两个问题。首先,必须以某种方式将 C++ 文件包含在已编译的 bin 文件中。另外#include <iostream>... iostream 是否包含在已编译的 C++ 文件中,或者是否需要将其包含在引导加载程序的某种库中?

感谢您的帮助,因为这真的让我很困惑。

4

3 回答 3

3

您将无法运行任何具有任何外部依赖项或系统调用的代码。这禁止了很多标准库函数,即所有 IO 函数(C stdio,iostreams),因为

  1. 他们都以一种或另一种方式进行系统调用,这是对内核的调用,而您没有,因为您的程序内核。
  2. 它们以某种形式的外部共享库(例如 libc、libstdc++)出现,需要用户空间中的动态链接器。

您将不得不推出自己的标准库,该库可以在您的特定硬件上的内核空间中运行。

于 2010-07-17T23:59:52.627 回答
3

要从您的汇编代码中调用 C 函数,这里有一个示意图。使用 g++ 代替 gcc 应该允许您使用 C++ 代码。但我想知道你能写多少“C++”,因为你不能使用库函数,正如前面对你问题的一些答复清楚地指出的那样。您最终可能会在您的 C++ 代码中编写程序集!

cboot.c

void bootcode(void) {
 /* code */
}

引导程序

# some where you have this line
call bootcode
# more code to follow

您以这种方式编译和链接它们以创建可执行的prog

nasm -f boot.o boot.asm

gcc -c cboot.c

gcc -o prog cboot.o boot.o
于 2010-07-24T04:07:03.233 回答
0

首先,除非您实现它或将 STL 静态链接到您的引导加载程序,否则您将无法使用 iostream 或 cout。STL 可能必须是特定于引导加载程序的。

至于从大会调用你的主要功能,这就是你要做的:

extern _main
;...
call _main
于 2010-07-18T00:20:44.823 回答