3

EBP レジスタからポインタ アドレスを呼び出せないのはなぜですか? これが意味することは、次のコードパターンで示されています。

  1. OpCode: '0xFF 0x10' -> CALL DWORD PTR DS:[EAX]
  2. OpCode: '0xFF 0x11' -> CALL DWORD PTR DS:[ECX]
  3. OpCode: '0xFF 0x12' -> CALL DWORD PTR DS:[EDX]
  4. OpCode: '0xFF 0x13' -> CALL DWORD PTR DS:[EBX]
  5. OpCode: '0xFF 0x14' -> CALL DWORD PTR SS:[ESP+EDI]
  6. OpCode: '0xFF 0x15 0x012345678' -> CALL DWORD PTR DS:[0x012345678]
  7. OpCode: '0xFF 0x16' -> CALL DWORD PTR DS:[ESI]
  8. OpCode: '0xFF 0x16' -> CALL DWORD PTR DS:[EDI]

'5' は「Intel Instruct マニュアル」に記載されていますが、'6' は直接参照されることはなく、EBP レジスタから呼び出すことができないと明言されることもありません。これは役に立たない機能ではないことはわかっていますが、Intel がこれら 2 つのレジスタを使用することを選択した理由、それは単なる設計上の選択なのか、それとも私が見逃しているものなのでしょうか? (推測ですが、本当の理由が知りたいです。)

4

1 に答える 1

4

EBP 経由で呼び出すことができますが、エンコードが異なるだけです。シーケンスが必要です

0xff 0x55 0x00

問題は、オフセットなしで EBP をエンコードする方法がないことです (上記では、バイト オフセットが 0 の EBP を指定しています)。通常、オフセット (0x15) なしで EBP であると予想されるエンコードは、代わりに 32 ビット絶対を意味するためです。 .

また、あなたの例にも注意してください。0xff 0x14その場合、ベースレジスタ、インデックスレジスタ、およびスケールファクタをエンコードする 3 番目のバイト (SIB バイト) があります。あなたの例のようなESP + EDIには3番目のバイトがあり0x3cます-3番目のバイトを0x24ESPだけにする必要があります

単純にエンコードできないレジスタとして EBP と ESP を選択した理由については、ESP がスタック ポインターであり (通常はプッシュ/ポップ命令によってアクセスされる)、EBP がフレーム ポインターであるため、逆参照することはほとんどないためです。オフセットなしで直接。少なくとも、80386 が設計されたときはそうでした。

于 2011-01-06T03:28:53.763 に答える