BXに関する投稿をたくさん見ました。今日は、「汎用レジスター」だと思います。なぜ人々がそれをベースアドレスレジスタと呼ぶのか、私は混乱しています。
- 歴史的に、なぜそれがベースアドレスレジスタと呼ばれるのですか。
- 今日でも関連性がありますか。 ?
- ベースアドレス指定に使用するために予約する規則はありますか?
表示されますここではそれと呼ばれています。
コメント
- 考えてみると、これは'ではありません。 '古いコンピュータについては何も対象としないため、正確にRCの質問です。特に、今日の関連性を求めているため、この質問の方が適しています。 SEメインサイトで-簡単に検索すると、バリエーションがたくさん求められていることがわかります。
- ここで重要なのは、x86のレジスタは"だけだということです。多かれ少なかれ汎用"、基本的な操作ではそれらのいずれかを使用できますが、どのレジスタを使用できるかが制限されている状況がありました。 se。
- もう1つの重要な点は、x86に関しては、過去の使用状況と現代の使用状況を比較すると誤解を招く可能性があることです(ここでは、「汎用レジスタ」に関するコメントは実際にはEBX / RBXを参照していると想定しています。 BXより)。現在のx86は8086と下位互換性がありますが、現代のx86アセンブリ言語プログラミングは、8086プログラミング(または386プログラミング)とは大きく異なります。したがって、BXの使用法は、必ずしもEBX / RBXの使用法について多くを語っているわけではありません。
回答
BXは常に汎用レジスタの1つであり、常にベースレジスタと呼ばれています(たとえば、 8086入門書 を参照してください。 19ページ)。さまざまなベースのアドレッシングモードで使用できるため、ベースレジスタです。アドレスをBXに格納し、オフセットをSIまたはDI(それぞれソースインデックスレジスタとデスティネーションインデックスレジスタ)に格納することで、BX + SIまたはBXでメモリにアクセスできます。 + DI( ibid 、31ページ)、またはBX + SI + 即時、またはBX + 即時。 XLAT
のベースとしても機能します。
BPも同様で、上記のすべてのアドレッシングモードをサポートします。 BXとBPの違いは、BXがデフォルトでデータセグメント(DS)に設定されているのに対し、BPはデフォルトでスタックセグメント(SS)に設定されていることです。 (BXとBPにもそれぞれ固有の命令があります— eg XLAT
はBX、ENTER
、
BPを使用します。)
これらのアドレッシングモードは現在も存在しているため、それらの使用は引き続き関連性がありますが、インデックス付きの間接アドレス指定は、32ビットx86で始まる汎用、ポインタ、またはインデックスレジスタで使用できます。 BXとBPは16ビットx86で「特別」ですが、間接アドレス指定またはインデックス付きアドレス指定が可能な唯一のレジスタであるため、32ビットまたは64ビットx86ではそうではないため、EBX、EBP、RBX 、およびRBPはそれほど特別ではありません。 (BP、EBP、およびRBPは、16ビットおよび32ビットモードでベースレジスタとしてSSを選択し、オフセットなしではポインタとして使用できないため、まだやや特殊です。つまり MOV AX, [BP]
とMOV AX, [BP+0]
のオペコードは代わりに使用されることになります。)
私が知っている規則はありませんベースアドレス指定のためのBXの使用を明確に予約するため。ベースアドレス指定に使用する必要がある場合は、適切に設定して使用します。使用中の呼び出し規約でBXの保持が義務付けられている場合は、それを考慮に入れる必要があります(規約と作成しているコードに応じて、呼び出し元または呼び出し先として)。
コメント
- XLAT / ENTER / LEAVEを追加する場合は+2。
回答
(これはStephen Kittsの回答に追加されます)
歴史的にベースアドレスレジスタと呼ばれる理由
そうですね、そうではありません。すべての場合、すべてのインデックス付きアドレス指定で「ベース」として追加できる唯一のレジスタである元の16ビットアドレス指定であったため、「ベースインデックス」(またはより適切なインデックスベース)になります。つまり、SI
またはDI
でインデックス付けされます。 (* 1)
このアドレス指定は、ベースポインタとしてBP
と対称的でした。基本的な考え方は、配列をBXでポイントし、SI
またはDI
を介してアドレス指定できるというものでした。スタック(* 2)
それ以外に、元の汎用2バイトレジスタの1つです。
そのいずれかです今日でも関連性がありますか?
そうではありません。少なくとも32/64ビットモードではありません。REX
アドレス指定により、BP
/
(* 3)。 64ビットモードでは、16個のレジスタのうち12個を同じ方法で使用できます(BP
/ SP
/ R12
/ R13
(* 4))。
さて、16ビットのプロテクトモードコードセグメントを備えた「ロング」モードが登場します。 。ここでは、クラシック(16ビット)エンコーディングが32/64ビットのレジスタサイズとともに使用されます。 SIB
は必要ないため、BX
はエンコードの利点を維持します。このかなり忘れられたモードがどれだけ関連しているかは議論の余地があります。
ベースアドレス指定のためにその使用を予約する規則はありますか?
そうではありません。必要に応じて使用してください。結局のところ、これはアセンブリです。不要な規則はありません:))
覚えておくべき唯一の問題は、呼び出し元のためにそれを保持することです(明示的に行われていない場合を除く)
ここでそれが呼ばれているのがわかります。
エラー…彼は間違っていないと言いますが、x86について学ぶために、より詳細な説明を探すことをお勧めします(Wiki(books)または OSDEV-Wiki を確認してください)。または、クラシック(16ビット)x86プログラミングに固有の場合は、読むべき本は1冊だけです。SteveMorse “ 8086 Primer です。 32/64ビットはとにかく異なり、特別な場合の特別な場合のリュックサックの代わりに、これらの古典的な仮定なしで学ぶ必要があります。
* 1-ニーモニックを割り当てたい場合4つの基本的な2バイトレジスタの名前。
- AX = A ccumulator 。 A 算術演算(または A 常に最短のエンコーディング)
- BX = B ase。データ(構造)へのポインタとして使用されます
- CX = C ounter。シフト/回転、文字列操作、ループで使用されます。
- DX = D ata。算術およびI / Oで使用されます。
* 2-ここでも、「標準」プログラミングの場合、BP
はスタックフレームを保持します。したがって、ここでのインデックスは、BPが一時的に移動されない限り、常にそのフレームへのインデックスです。
* 3- SP
はエンコーディング。
* 4- SP
/ R12
再びSIB
エンコーディング。
コメント
-
REX addressing allows [using any register in 32-bit mode]
-つまりここにSIBがありますか? - @ilkkachuNop。少なくとも私が覚えている限りではありません。 REXでは、すべてのレジスタでr / mモードを使用できます。 SIBは、SPおよびR12にのみ必要です。そしてもちろん、スケーリングを使用したい場合…または私はそれを台無しにしましたか?もう一度確認する必要があります。
- うーん。 ' 32ビットモードですべてのレジスタをポインタとして使用できることはわかっているので、'をREXにすることはできません。実際、32ビットモードでは、1つのレジスタをアドレスとして使用するにはmodr / mバイトだけで十分であり、その場合はSIBは必要ありません(ESPを除く)。 wiki.osdev.org/ …
- @ilkkachu Jup、しかしあなたは'同様に、レジスタをベースとして、別のレジスタをインデックスとして使用するには、SIBが必要です。これを再確認して、答えを訂正させてください。わかりましたか?
回答
BXは最も古いインデックスレジスタです。通常、構造体の要素には[BX + constant]
がアクセスします。したがって、その名前(または、名前は[BX + SI]
に由来する可能性があります。左側ではBXまたはBPのみを使用でき、右側ではSIとDIのみを使用できます)。
ebx / rbxについて特定のことを見つけることができませんでしたが、特定の命令(mul / div / shl / shr)によって破壊されない最低のレジスタであるため、ポインタ。
一方、[esp + offset]は[ebp + offset]よりも長い命令であるため、フレームポインタを削除しても必ずしも短いコードが生成されるとは限りません。
コメント
- 32ビットのオペコードが短いことを確認しますか? 16ビットモードでは、BX / BP、SI / DI、および8ビットまたは16ビットのディスプレイスメントの組み合わせに対して明示的なエンコーディングがあり、他のバリアントはエンコードできません。 32ビットモードでは、100b(通常はESP)がSIBバイトを示すために使用され、101b(通常はEBP)が使用されることを除いて、汎用レジスタエンコーディングが使用されます(EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI) )変位なしは、32ビットオフセットを示すために使用されます。
MOV EAX, [EBX+9]
は、MOV EAX, [ECX+9]
と同様に、3バイトを使用します。 追加のレジスタを使用すると、4バイトが必要になります。 - @StephenKitt:私は正直に立っています。 実際に長いのは[esp + x]
だけです。