配列がARMアセンブリでどのように動作するかを調べようとしていますが、私は圧倒されています。私は、サイズ20の配列を0,1,2などに初期化したい。ARMアセンブリ配列
A[0] = 0
A[1] = 1
私はそれを正しく行った場合に見なければならないものをどのように印刷するのか分かりません。これは私がこれまで持っているものです:それは私が間違ってやっているかわからない、あるとして
.data
.balign 4 @ Memory location divisible by 4
string: .asciz "a[%d] = %d\n"
a: .skip 80 @ allocates 20
.text
.global main
.extern printf
main:
push {ip, lr} @ return address + dummy register
ldr r1, =a @ set r1 to index point of array
mov r2, #0 @ index r2 = 0
loop:
cmp r2, #20 @ 20 elements?
beq end @ Leave loop if 20 elements
add r3, r1, r2, LSL #2 @ r3 = r1 + (r2*4)
str r2, [r3] @ r3 = r2
add r2, r2, #1 @ r2 = r2 + 1
b loop @ branch to next loop iteration
print:
push {lr} @ store return address
ldr r0, =string @ format
bl printf @ c printf
pop {pc} @ return address
ARMは十分に私を混乱させる。もし誰かが私がこの作品の仕組みを理解してくれれば助かります。
デバッガを使用すると、正しく動作しているかどうかを確認できます。あなたの配列の取り扱いは良く見えますが、印刷部分は間違っています。ご使用のプラットフォームでprintfを使用する方法を確認してください。 –
'str r2、[r3] @ r3 = r2'コメントは間違っていますが、' r3'は変更されませんが、メモリ内容は変更されます。 'r3'値によって指し示されるアドレス。また、 'mov r2、#0 @ index r2 = 0'はビットです...あなたは' r2'をインデックスと値の両方として使用していますが、実際は素晴らしいですが、コメントから単語 "index"を省略します。 'ldr r1、= a @配列のインデックスポイントにr1をセットする' r1'はインデックスではなく(最初の要素の)配列のアドレスです。 (上記のようにサミが書いたように、配列コードはokと思われ、printfは完全にボルケージされており、デバッガを使ってメモリの内容をチェックし、内容を登録します) – Ped7g
あなたは単語の配列かバイト配列を作りたいですか?あなたは言葉の配列を作って、それがあなたが望むものならそれはうまくいきます。 –