-1

ADD( const, memory)このコード シーケンスは次のようになります。

  • メモリから命令バイトをフェッチします。
  • 次のバイトを指すように EIP を更新します。
  • 命令をデコードします。
    • 必要に応じて、実効アドレス計算で使用するディスプレイスメントをフェッチします
    • 必要に応じて、変位値を超えるポイントに EIP を更新します。
  • メモリから定数値を取得し、ALU に送信します。
  • (メモリ内の次の命令で) 定数の値を超えるポイントに EIP を更新します。
  • ソースオペランドの値をメモリから取得し、ALU に送信します。
  • 値を追加するように ALU に指示します。
  • 結果をメモリ オペランドに格納します。
  • 加算演算の結果でフラグ レジスタを更新します。

これは The Art of Assembly Language book からのものです。EIP が 2 回も 3 回も更新されているのはなぜですか?

4

1 に答える 1

3

デコードされている命令の途中で EIP が指しているのを観察することはできません。あくまでも作者の表記です。実際のハードウェアは、ソフトウェアではなくハードウェアであるため、明らかに遅い反復プロセスではデコードされません。

x86 はデコードが複雑であり、オペランド サイズに応じて 16 ビットまたは 32 ビットの即値を取るオペコードの場合、オペランド サイズのプレフィックスは残りの命令の長さを変更します。Intel CPU は、デコード時に実際にこれで停止します。(これは LCP ストールと呼ばれます)。

ただし、可変長オペコードは命令の長さ + 即値を意味するため、この表記法は奇妙に聞こえます。プレフィックス + オペコードをデコードすると、SIB バイトや変位がある可能性があるアドレッシング モードを除いて、命令の全長がわかります。

于 2016-05-25T21:56:10.593 に答える