0

アセンブリで少し遊び始めたばかりなので、質問がばかげていたらすみません。

私の質問はこれについてです(もちろん、メモリと変数で遊んで、100を5で割ろうとしています!)

https://dl.dropboxusercontent.com/u/78049918/Pics/Capture.png

DW (Define Word) 命令がそのように実行されるのはなぜですか? つまり、私は他のすべての行を理解していますが、特にそれは私にとって暗いものです..

また、 var がアドレス 0010Ah でインスタンス化される理由を説明してもらえますか? インスタンス化前の 4 つの命令が 4*16 ビット = 4*2 バイト = 8 バイトを占めるため、var が直後にスタックにファイルされるためだと思います。しかし、命令は別の場所にあるべきではありませんか? プログラムの実行が開始されると、それらはスタックにロードされますか?

おまけの質問: emu8086 のスタックにあるものを確認するにはどうすればよいですか?

4

1 に答える 1

5

コンパイラではなくアセンブラを使用しているためです。文字通り、ニーモニックとデータをフラットなバイナリ ファイル (または、より一般的には、ヘッダーが含まれている、つまり PE) に変換しています。

dw文字通り「単語を宣言する」ことです。コードのその場所に配置$0200しています。この便利な表を見ると、

add r8, r/m8

オペコードの構造と逆アセンブル全体については説明しませんが[r]、オペコードの後に​​ modrm バイトがあるという意味も理解できます。modrm バイトの意味を示す別の便利な表を次に示します。であることがわかり$00ます[bx+si]

命令全体を組み立てると、

add ax, [ax+si]

reg2(ビットの 0 から ax を取得します -axインデックス付きの最初のレジスタ、cx2 番目、dx3 番目、bx4 番目などです)。私のアセンブラのドキュメントからの簡単な表は次のとおりです。

modrm:
0 0 0 0 0 0 0 0
| | |   | |___|
|_| |   |  reg1 
mod |___|  (r/m)
     reg2

すなわち:op reg2, reg1

これは少し詳しく説明しましたが、コンパイラではなくアセンブラを使用していることと、命令のエンコードについて少し理解していただければ幸いです。いくつかのことが少しずれている可能性があります(私は32ビットに慣れています)。

これが、ほとんどの実行可能形式に、データとコードのセクション、またはそれぞれが「分離された」16 ビット セグメントがある理由です。フラットバイナリでは、データセクションを最後または空白の領域に配置して、呼び出された関数間でジャンプすることができます。

于 2013-05-04T23:12:01.270 に答える