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 64
しxx 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の場合と同じなのはなぜですか?