メモリオーバーライドプレフィックスを使用しても、すべてのオペランドがレジスタになるとどうなりますか?メモリオーバーライドプレフィックスを使用しても、すべてのオペランドがレジスタになるとどうなりますか?
コードmov eax, ebx
またはadd eax, ebx
とし、デフォルトは32ビットですが、67hオーバーライドを使用しているとします。
どのようにプロセッサがその状況を処理しますか?
メモリオーバーライドプレフィックスを使用しても、すべてのオペランドがレジスタになるとどうなりますか?メモリオーバーライドプレフィックスを使用しても、すべてのオペランドがレジスタになるとどうなりますか?
コードmov eax, ebx
またはadd eax, ebx
とし、デフォルトは32ビットですが、67hオーバーライドを使用しているとします。
どのようにプロセッサがその状況を処理しますか?
インテル®ソフトウェア開発者マニュアル*、第2巻、2.1節では、各命令プレフィックスの動作について詳しく説明しています。メモリ・オペランドを持たない命令でアドレス・サイズ接頭辞(67h)を使用すると、予期しない動作が発生する可能性があります。
オペランドサイズの接頭辞(66h)を使用して、16ビットオペランドサイズと32ビットオペランドサイズを切り替えることができます。また、特定のSSE2/SSE3/SSSE3/SSE4命令で強制プレフィックスとして使用できます。その他の使用は予約されており、予期しない動作を引き起こす可能性があります。
セグメントオーバーライドプレフィックスは、どの分岐命令でも予約されています。 * https://software.intel.com/en-us/articles/intel-sdm
実際のハードウェアでは、適用されないプレフィックスは無視されます。これが、原因が#UDの代わりに「予約済み」になっている理由です。 'lock'を除いて、適用されないときは'#UD'を行います。 –
@peterしかし、「予約されています」というのはインテルの文書で、あなたが使えるということを意味しています。私はそれが "それを使用しないでください、何かが起こること"を意味すると仮定します。実際に予約された接頭辞の使用は無視されることが多いようですが、これはインテルにとって便利です。なぜなら、以前は無意味な接頭辞を使用して新しい動作を定義することができるからです。しかし、他の予約された動作は非常にうまくいくかもしれません。 – BeeOnRope
@BeeOnRope:いいえ、私はそうではないと思います。なぜなら、将来の保証を保証したくない場合、現在のCPUの具体的な内容ではなく、将来保証の保証のみを文書化するからです。あなたが言うように、彼らは 'tzcnt' /' bsf'のように事実の後の無視動作を文書化します。しかし、gccコンパイルされたバイナリを大量に壊さずに再利用することができない 'rep ret'のようなケースがいくつかあるので、[何百ものメインストリームCPUが何十年もそれを再利用することは期待していません。](https:// stackoverflow.com/questions/20526361/what-does-rep-ret-mean/32347393#32347393)。 –
'66'
はオペランドサイズプレフィックスですので、MOV斧、bx''にそれを作ります。あなたは '67'アドレスサイズプレフィックスを意味しましたか? –
はい、元の質問を編集しました。いいえ、私が元の質問を意味するのを待ってください。それはメモリのプレフィックスをメモリオペランドなしで混ぜるという全体のポイントでした。 – matrix2
「66」は「メモリ」プレフィックスではありません。 '89 d8'は' mov eax、ebx'です。 '66 89 d8'は' mov ax、bx'です(32または64ビットモードでなければ、66の接頭辞はオペランドのサイズをデフォルトの16ではなく32ビットにします)。これはあなたが尋ねることを意図したものか、 'mov eax、[ebx]'を 'mov eax、[bx]'にする '67'アドレスサイズ接頭辞について本当に知りたかったのですか? (または、64ビットモードで、 'mov eax、[rbx]'を 'mov eax、[ebx]'に変換します) –