1

私はいくつかのリアル モード コードを書いており、そのために 32 ビット レジスタを使用しています (0x66 プレフィックスを使用)。

Intel のマニュアルを調べましたが、探している情報が見つかりません。参照: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html (ボリューム 1 の第 1 章から第 7 章、およびボリューム 2 の具体的な説明をざっと読みました)

インテルは、リアル モード コードで次のコードの特定の動作を保証しますか? プロテクトモードコードと同じですか?

mov eax, <some constant>
mov ebx, <some constant>
add ax, bx ; Are the top bits of ax zero'd, sign extended or left?
mov ax, <some constant> ; Does this leave top 16bits unchanged?
; From what I can tell, the top 16bits are unchanged, but where is this documented?

注: 私は、特定の実装がどのように動作するか (つまり、それをチェックするコード -- すべての実装が常に同じように動作する場合を除く) については知りません。Intel がこの動作を文書化した場所だけです。

関連: x86_64 レジスタ rax/eax/ax/al が完全なレジスタ内容を上書きする

違い: この質問は、特にリアル モードの操作と、リンクされた質問からの観察がリアル モードで有効かどうかに関連しています。

リアルモードコードについてこれが文書化されている場所を見つけるのを手伝ってくれる人はいますか?

4

2 に答える 2

1

16 ビットおよび 8 ビットの代替レジスター名がそれぞれのサブパーツにのみアクセスするという事実は、 Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 1: Basic Architecture のセクション 3.4.1 に多かれ少なかれ記載されています。

図 3-5 に示すように、汎用レジスタの下位 16 ビットは、8086 および Intel 286 プロセッサにあるレジスタ セットに直接マップされ、AX、BX、CX、DX、BP、SI という名前で参照できます。 、DI、およびSP。EAX、EBX、ECX、および EDX レジスタの下位 2 バイトはそれぞれ、AH、BH、CH、および DH (上位バイト) および AL、BL、CL、および DL (下位バイト) という名前で参照できます。

図 3-5

ドキュメントには、これらの代替レジスターがレジスターの示された部分以外にアクセスするものとして記述されていないため、それらがアクセスすると仮定する理由はありません。また、セクション 3.4.1 は、64 ビット モードを除くプロセッサのすべての動作モードに適用されるため、リアル モードも含まれることに注意してください。

セクション 3.4.1.1 では、リンクした投稿で説明されている動作が由来する 64 ビット モードで何が起こるかについて説明します。

64 ビット モードでは、オペランド サイズによって宛先汎用レジスタの有効なビット数が決まります。
  • 64 ビット オペランドは、デスティネーション汎用レジスタに 64 ビットの結果を生成します。
  • 32 ビットのオペランドは 32 ビットの結果を生成し、宛先の汎用レジスタで 64 ビットの結果にゼロ拡張されます。
  • 8 ビットおよび 16 ビットのオペランドは、8 ビットまたは 16 ビットの結果を生成します。デスティネーション汎用レジスタの上位 56 ビットまたは 48 ビット (それぞれ) は、操作によって変更されません。8 ビットまたは 16 ビット演算の結果が 64 ビット アドレス計算用である場合は、レジスタを完全な 64 ビットに明示的に符号拡張します。

特に、8 ビットと 16 ビットの代替レジスタは、64 ビット モードでも他のモードと同じように機能します。

最後に、予期しないときにプロセッサがレジスタの上位 16 ビットを暗黙的に消去することはありませんが、これを行わないために実行している環境に必ずしも依存することはできません。MS-DOS では、32 ビット レジスタの上位 16 ビットを使用することが常に安全であるとは限りませんでした。呼び出し、割り込みサービス ルーチン、または TSR がそれらを変更するタイミングがわからないためです。さまざまな呼び出し規則とインターフェイスは、どの 16 ビット レジスタを保持および変更するかを定義しただけで、上位 16 ビットに何が起こったかについて言及することはめったにありませんでした。

于 2014-09-23T06:54:59.180 に答える
0

上位 16 ビットの内容は変更されません。ゼロ拡張 ( MOVZX ) と符号拡張 ( MOVSX ) には別の命令があります。ax が eax レジスタの下位 16 ビットを参照することがどこかに文書化されていると確信しています。その場合、ゼロ拡張は x86_64 のように「デフォルトではない」動作になります。この動作は、x86_64 のドキュメントにも明確に記載されています。

于 2014-09-23T06:19:41.460 に答える