ここで簡単な質問:
私は、32 ビット Windows 7 で Embarcadero C++ Builder XE3 を使用してインライン アセンブリを実験しようとしています。具体的には、将来の実用的なアプリケーションの可能性を考慮してアセンブリを自分自身に再教育し始めています。
これまでのところ、すべての C++ Builder 構文を自由に使用して問題なくコンパイルできる単純なコンソール プロジェクト内に一連の命令を記述することができました。
int _tmain(int argc, _TCHAR* argv[]) {
_asm{
mov dl, 0x24
mov ah, 2 // Print character
int 0x21 // Dos Interrupt - Run operation in AH
mov dl, 0x25
mov ah, 2 // Print character
int 0x21 // Dos Interrupt - Run operation in AH
mov dl, 0x26
mov ah, 2 // Print character
int 0x21 // Dos Interrupt - Run operation in AH
mov dl, 0x27
mov ah, 2 // Print character
int 0x21 // Dos Interrupt - Run operation in AH
int 0x20 // terminate COM
}
return 0;
}
これは正常にコンパイルされ、これらの命令は NASM および Windows ネイティブの DEBUG 環境でそのまま機能します。私が期待しているのは、コンソールへの単純な書き込みです$%&'。その後、正常に終了します。
ただし、Project1.exeコマンドラインから実行しようとすると、すぐに標準の Win7 ランタイム エラー ポップアップが表示され、数秒後に消えてプログラムが終了します。
デバッグを実行すると、ハングする前に最初に到達したように見えint 0x21ます。その時点で Borland から次のメッセージが表示されます。
プロジェクト Project1.exe で例外クラス $C00000005 が発生し、メッセージ「0x00401213 でのアクセス違反: アドレス 0xffffffff の読み取り」が発生しました。
私の理論では、セグメントを 256 バイトのオフセットで適切に初期化していないということです (NASM はorg 0x100命令セットの先頭にあるようなものを使用します)。しかし、それが問題なのかどうかは完全にはわかりません。
何か案は?