8

x86/x64 CPU 命令用のコンパイラを書いていますが、「置換」アドレスが何を意味するのか理解できないようです。たとえば、Add 命令について詳しくは、 http ://www.c-jump.com/CIS77/CPU/x86/X77_0150_encoding_add_edx_displacement.htm をご覧ください。

レジスタが通常のメモリアドレスに追加される add 命令を実装しようとしています。問題は、アドレスが「置換アドレス」であることです。それは、アドレスが命令位置からのオフセットである符号付きの値であることを意味しますか?

4

3 に答える 3

13

x86には、いくつかの異なる形式の間接オペランドがあります。

  1. [reg]
  2. [reg+変位]
  3. [変位]
  4. [reg*定数+reg]
  5. [reg*定数+reg+変位]

「変位」は、アドレスの残りの部分に追加される定数です。定数以外にアドレスの構成要素がない場合でも、それは「変位」と呼ばれます。これは主に、他のアドレス指定フォームとの一貫性を保つためです。

それを見る別の方法は、すべてのアドレスが次の形式であるということです

[reg*定数+reg+変位]

各コンポーネントで0の値を許可します。

[変位]形式は、変位以外のすべてのコンポーネントがゼロである単なるエンコーディングです。

コンパイラーライターとして、最後の2つの形式は特に興味深いものです。pArray[index]->field + 1それらは、単一の命令のようなものを簡単にエンコードできるようにします。

于 2012-11-11T11:19:02.110 に答える
4

「置き換えを行う特別な追加」はありません。そのページは不必要に混乱しています。これは通常のメモリオペランドエンコーディングの一部にすぎません。

addは、すべてのalu-opsと同じ方法でエンコードされるかなり標準的な命令です。al宛先として使用し、ソースとしてイミディエート(04 ib)、デスティネーションとして使用ax/eax/raxし、ソースとしてイミディエート(+ 05 imm)、 3つのバージョンadd r/m, imm(1つは8ビットの宛先用、1つはより広い宛先と符号拡張された8ビットソース用、もう1つはより広い宛先と広いソース用)、そしてもちろんadd r, r/madd r/m, r

これは、の特殊なケースでadd r, r/mあり、は変位の形をとります。ModRMエンコーディングr/mの注#1を参照してください。

だから彼らはただ意味しadd edx, [sdword]ます。(ただし、regフィールドは誤ってエンコードされており、にedx対応しますが010、ではありません011

于 2012-11-11T09:13:50.190 に答える
4

そのページは正確ではありません。それが話している「変位を取る追加」は、フォームを参照するadd r[16|32], r/m[16|32]add edx, [0xdisp]、逆アセンブラの出力に表示される可能性があります。opcode を使用した ADD 命令について話していると仮定すると0x03

  • レジスターの宛先をエンコードedxし、ModR/M バイトの実効アドレスとして 32 ビットの変位を指定すると、0x15 の値が得られます (Intel® 64 and IA-32 Architectures Software Developer's Manual Vol. 2、41 ページ、表を参照)。 2-2)。
  • この命令の効果は、メモリ アドレスの dword をdispの内容に追加することですedx
  • したがって、命令の実際のエンコードは次のようになり\x03\x15\x00\x00\x00\x01ます。 , 1 バイトの変位の場合。
于 2012-11-11T10:32:45.253 に答える