intel IA-64と32の本をダウンロードしました。CPUの仕組みについてもっと深く知りたいからです。だから私は本を読んで、いくつかのものをコード化し始めました。 I IDTを有効にして、私は割り込みハンドラをプログラムしたい場合、私はそのコードを持っている:gccのクロスプラットフォーム版は、私の関数の属性タグ__attribute __((interrupt))を無視します。
extern "C" __attribute__((interrupt)) void test (void* ptr)
{
}
int main (void)
{
return 0;
}
私はi686-elf-g++ -Wall -Wextra -O2 -c -m32 main.cpp
でコンパイルするとき、私は次の警告がありますmain.cpp:6:60: warning: 'interrupt' attribute directive ignored
を、私はg++ -Wall -Wextra -O2 -c -m32 main.cpp
てコンパイルする場合、コンパイルがちょうどうまく機能し、コードが生成され、それが最後にIRET命令でなければなりません(それは私が欲しいものです)のようなものです:
Disassembly of section __TEXT,__text:
_test:
0: 55 push ebp
1: 89 e5 mov ebp, esp
3: fc cld
4: 5d pop ebp
5: cf iretd
6: 66 2e 0f 1f 84 00 00 00 00 00 nop word ptr cs:[eax + eax]
誰もが、私はGCCの私のクロスプラットフォームのバージョンでこの警告を持っている理由の任意のアイデアを持っていますか? (なぜ私は割り込みハンドラがgccのパラメータにポインタを持っていなければならないのか疑問に思っています)
ありがとう!
Windows上にWindowsオブジェクトファイルを作成するための "通常の" g ++の設定をしていますか? 32ビットのx86コードを作るためにgccの特別な 'i686'バージョンは必要ないので、最初は混乱しました。 –
@PeterCordes私はmacOSを使い、g ++はclang ++ 9.0.0です。真実を伝えるために、私が始めたときは自分が何をしているのか分からなかったので、私はちょうどOSDev [リンク](http://wiki.osdev.org/GCC_Cross-Compiler#OS_X_Users)の教科書に従った。しかし、私はnullにプレフィックス値を設定しない場合gccは、ターゲットアーキテクチャ(と私の場合はi686だった - とエルフはtutorielのためですが、多分私はそれを必要としない) – Adrien
@PeterCordes:私は、OSディベロップメントを行い、クロスコンパイラを使用しているという質問から(割り込みディレクティブを使用して)仮定しました(いくつかのディストリビューションがいくつかのホストOS機能を使用するためにlibgccを結びつけるパッチを使用していました)。同様に、OS/Xでは、_LD_は、OS Dev(GNU Binutilsもまた手頃です)を可能にする(リンカスクリプトのような)必要なオプションの多くをサポートしていません。 –