プロセッサアーキテクチャのいくつかのデータシートを調べているときに、短いアドレッシングモードと長いアドレッシングモードという用語を見ました。
誰かが私に用語の一般的な考えを教えてもらえますか(プロセッサ固有である必要はありません!)
/ renjith_g
プロセッサアーキテクチャのいくつかのデータシートを調べているときに、短いアドレッシングモードと長いアドレッシングモードという用語を見ました。
誰かが私に用語の一般的な考えを教えてもらえますか(プロセッサ固有である必要はありません!)
/ renjith_g
ARMコードの例を示しますが、これはおそらく(一般的な意味で)他の多くのプロセッサに当てはまります。
各ARM命令(Thumbを無視)は32ビット長であり、この例では、ARMが32ビットアドレス空間にアクセスできるように見せかけます。
各命令は、基本的にこれらの32ビットをさまざまなフィールドに分割することによってデコードする必要があります。これらのビットの一部は、命令のタイプを格納するために使用する必要があります。
したがって、1つの命令で任意のアドレスをレジスタにロードできないことは明らかです。
MOV Rn, #AABBCCDD
動作しません-命令(MOV)と宛先レジスタ(Rn)を指定するためにビットを使用する必要があるため、32ビットアドレスを格納するための32ビットが残っていません。
したがって、レジスタ内の何かのアドレスが必要な場合は、いくつかのオプションがあります。
1.PC相対を使用する
次のように機能する疑似操作があります。
ADR Rn, .label
...
.label
これは次のように拡張されます。
ADD Rn, PC, (.label - here)
.labelが現在の命令の約4k以内にある場合、現在のPC(プログラムカウンター)に加算/減算してそのアドレスを取得できます。これは相対アドレスです。
2.複数の指示を使用する
addまたはorsを使用して、任意のアドレスを作成できます。
MOV Rn, #AA000000
ADD Rn, Rn, #00BB0000
ADD Rn, Rn, #0000CC00
ADD Rn, Rn, #000000DD
(実際には、はるかに効率的にそれを行うことができますが、あなたはアイデアを得ることができます)。
3.既知の相対位置に絶対アドレスを保存します
必要なアドレスが近くに保存されていることがわかっている場合は、メモリからロードできます。
ADR Rn, .store
LDR Rn, [Rn]
.store
EQU #AABBCCDD
現在、他のプロセッサアーキテクチャには可変長命令(x86など)がある場合があるため、短い相対アドレッシングモード(PCや別のレジスタなど)を使用するか、より長い(おそらく)低速の命令を使用するかを選択できます。 32ビットアドレス全体。