2

Richard C. Detmer 著の Introduction to 80x86 Assembly Language and Computer Architectureというタイトルの教科書を読んでいます。

mov即時メモリオペコードについて質問があります。ここで私も参照しているテキストの部分:

図 4.1 を下に続けると、次の行は即時メモリへの移動です。これらの各命令には、 opcode C6、ModR/M バイト、追加のアドレス バイト (必要な場合)、および最後に即値オペランドを含むバイトがあります。アドレスは、メモリからレジスタへの移動について前述したようにエンコードされます。たとえば、smallCounterがメモリ内のバイトを参照し、命令mov smallCounter, 100がアセンブルされる場合、アセンブラは 7 (3+4) バイトのオブジェクト コードを生成C6 05 xx xx xx xx 64xx xx xx xxます。 . ModR/M バイト 05 は00 000 101、Mod=00 および R/M=101 で、Reg フィールドは不要で 000 に設定された直接メモリ アドレス指定用です。

別の例として、mov BYTE PTR [edx], -1レジスタ間接モードを使用したメモリ デスティネーションを考えてみましょう。オペコードは引き続き C6 で、即値バイト (常に最後に来る) は -1 の FF です。2 番目のバイトは ModR/M バイトで、レジスタ間接の場合は Mod=00、Reg=000 (未使用)、および EDX00 000 010の場合は R/M=010 で、または 02 になります。オブジェクト コードはC6 02 FF.

92 ページ、第 4 章、セクション 1 - データのコピー

図 4.1 -移動先がバイトの mov 命令- は、4 つの列を持つグラフです。

  • 目的地の最初のリスト
  • ソースの 2 番目のリスト
  • Opcodeの 3 番目のリスト
  • 4 番目のリストは、オブジェクト コードのバイト数です。

上記の部分も参照しているチャートの行は次のとおりです。

宛先:メモリ バイトソース:即時バイトオペコード: C6オブジェクト コードのバイト: 3+

そんなことばかり言って申し訳ありませんが、あなたと私が私の本が言っていることについて同じページにいることを願っています. smallCounterの部分は理解していますが、困惑しているのは、のオブジェクト コードmov BYTE PTR [edx], -1にメモリ内のアドレスがないことです。間接モードであるため、edxがポインターとしての役割を果たしているのに、なぜオブジェクト コードには、それが指しているメモリ内のアドレスも含まれていないのでしょうか。smallCounterのオペコードにアドレスがあるような変数のみですか?他のステートメントと比較して、全体的なオペコードがsmallCounterの場合と同じなのはなぜですか?

4

1 に答える 1

8

メモリ内のアドレスはアセンブリ/リンク時に認識できないため、オブジェクト コードにはメモリ内のアドレスが含まれていません。

変更されるメモリ アドレスは、命令が実行されるまでわかりません。オペコードは、「オペコード バイトからではなく、EDX レジスタから変更するアドレスを取得する」と述べています。

オペコードのバイトを見てみましょう。

C6 05 xx xx xx xx FF  <-- store the value at address xx xx xx xx
C6 02 FF              <-- store FF at the address held in the EDX register

したがって、オペコードからアドレスを取得する代わりに、CPU は EDX レジスタから宛先アドレスを取得します。

考えるべきもう一つのこと。このコード:

mov edx, offset smallCounter
mov byte ptr [edx], 100

と同じことをします

mov byte ptr [smallCounter], 100

まあ、前者がEDXレジスタを変更することを除いて。ただし、どちらも値 100 を のメモリに格納しsmallCounterます。

それは物事を明確にするのに役立ちますか?

于 2013-06-20T19:06:46.223 に答える