34

私はこのチュートリアルを見ています: http://www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/os/ok01.html

組み立ての最初の行は次のとおりです。

ldr r0,=0x20200000

2番目は次のとおりです。

mov r1,#1

ldrメモリからレジスタに値をロードするためだと思いました。しかし=、0x20200000はメモリアドレスではなく値であることを意味しているようです。どちらの行も絶対値をロードしているようです。

4

3 に答える 3

22

トリック/ショートカットです。たとえば

ldr r0,=main

アセンブラは、命令の近くで命令パスの外側にデータワードを割り当てます。

ldr r0,main_addr
...
b somewhere
main_addr: .data main

次に、そのトリックを定数/即値、特に移動即値命令に収まらないものに展開します。

top:
add r1,r2,r3
ldr r0,=0x12345678
eor r1,r2,r3
eor r1,r2,r3
b top

組み立ててから分解

00000000 <top>:
   0:   e0821003    add r1, r2, r3
   4:   e59f0008    ldr r0, [pc, #8]    ; 14 <top+0x14>
   8:   e0221003    eor r1, r2, r3
   c:   e0221003    eor r1, r2, r3
  10:   eafffffa    b   0 <top>
  14:   12345678    eorsne  r5, r4, #125829120  ; 0x7800000

アセンブラがデータ ワードを追加し、ldr を PC 相対に変更したことがわかります。

mov 命令に適合するイミディエイトを使用する場合、おそらくアセンブラーによっては、確かに私が使用している gnu を使用すると、それが mov に変わりました

top:
add r1,r2,r3
ldr r0,=0x12345678
ldr r5,=1
mov r6,#1
eor r1,r2,r3
eor r1,r2,r3
b top


00000000 <top>:
   0:   e0821003    add r1, r2, r3
   4:   e59f0010    ldr r0, [pc, #16]   ; 1c <top+0x1c>
   8:   e3a05001    mov r5, #1
   c:   e3a06001    mov r6, #1
  10:   e0221003    eor r1, r2, r3
  14:   e0221003    eor r1, r2, r3
  18:   eafffff8    b   0 <top>
  1c:   12345678    eorsne  r5, r4, #125829120  ; 0x7800000

したがって、基本的にはタイピングのショートカットです。アセンブラーに定数を貼り付ける場所を見つける権限を与えていることを理解してください。これは通常、良い仕事をしますが、安全に失敗したことがあるかどうかはわかりません。アセンブラが場所を見つけやすくするために、コードに .ltorg または .pool が必要な場合があります。

于 2012-12-26T22:04:50.380 に答える
14

あなたのレベルに近い人からの短い応答です。それが役立つことを願っています.ARMでは、命令には32ビットがあります。一部のビットは演算の識別に使用され、一部はオペランドに使用されます。また、MOV 命令の場合、一部は即値 (#1 など) に使用できます。

ここ(33 ページ) でわかるように、即値に使用できるのは 12 ビットのみです。各ビットを数値 (0 から 2^12-1~4095 の範囲) として使用する代わりに、命令は最初の 8 ビットを最後の 4 ビットで指定された量の 2 倍だけ右に回転 (ROR) することにより、即値を計算します。 . つまり、immediate = first 8 bits ROR 2*(last four bits).

このようにして、0 ~ 4095 よりもはるかに広い範囲の数値を取得できます (可能な即値の簡単な要約については、34 ページを参照してください)。ただし、12 ビットの場合でも、指定できる値は 4096 しかないことに注意してください。

数値を前の命令のような命令に変換できない場合 (257 は、任意の 4 ビットを 2 回ローテーションした 8 ビットとして表すことはできません)、LDR r0, =257 を使用する必要があります。

この場合、コンパイラは 257 という数値をプログラム コードの近くのメモリに保存するため、PC に対して相対的にアドレス指定でき、dwelch が詳細に説明したようにメモリからロードできます。

注: そのチュートリアルに従えば、mov r0, #257 で「make」しようとするとエラーが発生し、手動で ldr r0, =257 を試す必要があります。

于 2013-07-10T14:31:42.437 に答える