3

このチュートリアルから入手した小さなアセンブリ ブートローダーがあります。ブートローダーのコードはここにあります。このブート ローダーから C++ を実行できるかどうかを知りたいです。次のような単純なことを実行したい:

#include <iostream>
using namespace std;

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

しかし、私が見ることができるように、2つの問題が発生します。まず、コンパイルされた bin ファイルに C++ ファイルを含める必要があります。また#include <iostream>... iostreamはコンパイルされたC++ファイルに含まれていますか、それともブートローダーの何らかのライブラリに含まれている必要がありますか?

これは本当に私を困惑させているので、助けてくれてありがとう。

4

3 に答える 3

3

外部依存関係やシステム コールを含むコードは実行できません。これにより、多くの標準ライブラリ関数、つまりすべての IO 関数 (C stdio、iostreams) が禁止されます。

  1. それらはすべて何らかの方法でシステム呼び出しを行います。これはカーネルへの呼び出しですが、プログラムはカーネルであるため、これはありません。
  2. それらは、ユーザー空間で動的リンカーを必要とする外部共有ライブラリ (libc、libstdc++ など) の形式で提供されます。

特定のハードウェアのカーネル空間で動作する独自の標準ライブラリを展開する必要があります。

于 2010-07-17T23:59:52.627 に答える
3

アセンブリ コードから C 関数を呼び出すための回路図を次に示します。gcc の代わりに g++ を使用すると、C++ コードを使用できるようになります。しかし、あなたの質問に対する以前の回答のいくつかが明確に指摘しているように、ライブラリ関数を使用できないため、「C++」をどれだけ書くことができるのだろうか。最終的には、C++ コードでアセンブリを記述することになるかもしれません!

cboot.c

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

boot.asm

# 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

まず、iostream も cout も、実装するか STL をブートローダーに静的にリンクしない限り使用できません。STL は、おそらくブーローダー固有のものでなければなりません。

アセンブリからメイン関数を呼び出す場合は、次のようにします。

extern _main
;...
call _main
于 2010-07-18T00:20:44.823 に答える