haroldが言うように、デフォルトのオペランドサイズは命令にエンコードされていませんが、現在のプロセッサモードに依存します。
リアルモードと16ビット保護モードでは、デフォルトのオペランドサイズは16ビットなので、83 E4 F0
はand $-16, %sp
にデコードされます。
32ビットモードでは、オペランドサイズのデフォルトは32ビットなので、and $-16, %esp
です。
x64モードでは、ほとんどの命令は、プッシュ、ポップ、コール、リターンなど、スタックを間接的に使用するブランチと分岐を除いて、32ビットオペランドサイズにデフォルト設定されているため、再びand $-16, %esp
にデコードされます。
接頭辞を使用してデフォルトのオペランドサイズを上書きすることは可能です。たとえば、プレフィックス66hは32ビットと16ビットのオペランドサイズを切り替えるため、66 83 E4 F0
は16ビットモードでand $-16, %esp
にデコードし、32ビットモードまたは64ビットモードではand $-16, %sp
にデコードします。 64ビットオペランドサイズを取得するには、Wビットが設定されたREX prefixを使用する必要があります。したがって、48 83 E4 F0
はand $-16, %rsp
にデコードされます(ただし、64ビットモードのみ)。
です。実モードの場合、または現在のセグメント/セレクタのデフォルトのオペランドサイズが16ビットに設定されている場合、 'and sp、-16'として実行されます。 「通常は」32ビットバージョンです。 – harold