1

ここで簡単な質問:

私は、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命令セットの先頭にあるようなものを使用します)。しかし、それが問題なのかどうかは完全にはわかりません。

何か案は?

4

2 に答える 2

3

これらのint 0x21手順はMS-DOS 用であり、Windows 用ではありません。それらは、Windows プログラムでは別の意味を持ち、その結果、炎上します。

于 2016-01-09T01:42:44.367 に答える
0

私は主に C++ Builder で作業していますが、製品コード (主に micros) のアセンブリと nasm もプログラミングしました。私のお勧めは、必要のないものについては C++ ビルダーに近づかないことです。学習は芸術である可能性があり、学習の進め方は結果に大きく関係します。アセンブリとの C++ Builder の統合は、サウス コンプトンを経由する迂回路です。通常の作業方法ではないかもしれませんが、純粋なコマンド ラインで nasm を学ぶことは大きな成果をもたらします。

于 2016-10-20T15:48:52.483 に答える