メモリである:ベースとインデックスに使用するコンベンションレジスタはありますか?一般的な形式をアドレッシング
[base + index*scale + disp]
技術的に任意のレジスタがbase
することができます。また、任意のレジスタはindex
(esp
を除く)にすることができます。
しかし、base
とindex
に使用するための規約レジスタがありますか? base
にはebx
(ベースレジスタ)が使用されていますが、index
はどうですか?
メモリである:ベースとインデックスに使用するコンベンションレジスタはありますか?一般的な形式をアドレッシング
[base + index*scale + disp]
技術的に任意のレジスタがbase
することができます。また、任意のレジスタはindex
(esp
を除く)にすることができます。
しかし、base
とindex
に使用するための規約レジスタがありますか? base
にはebx
(ベースレジスタ)が使用されていますが、index
はどうですか?
私はEBX(ベースレジスタ)をベース本当に
ないために使用されていることとします。
16ビットコードでは、すべてのレジスタが「ベース」として使用できるわけではありません。 BX
は、使用できる数少ないレジスタの1つでした。したがって、そのレジスタは「ベースレジスタ」と呼ばれていました。
しかし、32ビットコードでは、このような制限はありません。
コードの異なる部分が同じように書かなければならない場合
表記のみが必要とされている慣例があります。
例:1つのアセンブラファイルにサブ関数が含まれ、別のアセンブラファイルにそのサブ関数を呼び出すコードが含まれている場合、両方のファイルのプログラマは関数引数を渡すために同じレジスタを使用する必要があります。
ここには該当しないため、この規約は必要ありません。
柔軟性が非常に高い点は、mov
命令を使用してポインタとインデックスを特定のレジスタに配置することを避けることができるという点です。
最も便利なレジスタにデータを使用するだけです。例えば32ビットコードでは、使用している呼び出し規約によって保存/復元せずに使用できるレジスタの1つを使用します。 (典型的にはEAX、ECX、およびEDX)。
edi/rdiに宛先ポインタを保持する場合は、とesi/rsiのソースポインタが有効です。なぜなら、これはレジスタ名のDとSの意味であるからです。ブロックコピーにrep movsd
を使用する場合を除き、ハードウェアが気にしないものについて何を使用しているかを覚えておくことができます。