【发布时间】:2017-07-19 02:37:15
【问题描述】:
我试图弄清楚数组在 ARM 汇编中是如何工作的,但我不知所措。我想将一个大小为 20 的数组初始化为 0、1、2 等等。
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用作索引和值,这实际上很好,但我会在评论中省略“索引”一词。ldr r1, =a @ set r1 to index point of arrayr1是数组(第一个元素)的地址,而不是索引。 (其余如 Sami 上面写的,数组代码看起来没问题,printf 完全无用,使用调试器检查内存内容和寄存器内容) -
您是要创建单词数组还是字节数组?你做了一个单词数组,如果这是你想要的,那很好。
-
查看这些指令 ldr r2,[r1,r3] 甚至更好的 ldr r2,[r1],#4 的详细信息,看看它们是否/如何帮助简化这个循环。