我正在研究为我考虑的ARM微处理器课程分配的一个简单代码。我有一个小问题,让我的代码加载一个数组的值来比较使用Keil。如果比较为真,程序应该比较5个数字然后存储值。当我运行我的程序时,它不会加载我声明的数组值。我的教授也没有多大帮助,似乎也不知道为什么它不能正常工作。
这是我到目前为止所做的事情。我也认为我的PUSH是错误的,但我可能在我至少让数组加载后想出来。我应该把这些值推到堆栈上,但我很确定我只是在寄存器中加载值。
AREA main, CODE, READONLY
EXPORT __main
ENTRY
__main PROC
MOVS r5, #0
LDR r0, =NUMB
loop1
LDR r1, [r0]
CMP r5, #5
BEQ stop
loop
CMP r1, #10
BLT low10
CMP r1, #100
BLT mid
CMP r1, #255
BLT high100
low10
PUSH {r2}
MOVS r2, #2
ADDS r5, #1
B loop1
mid
PUSH {r3}
MOVS r3, #0
ADDS r5, #1
B loop1
high100
PUSH {r4}
MOVS r4, #1
ADDS r5, #1
B loop1
stop B stop
ENDP
AREA myDATA, DATA, READWRITE
ALIGN
NUMB DCD 1,11,111,11,1
END
答案 0 :(得分:0)
对于数组,元素大小不是1字节,而是4字节。
使用GNU& GDB,如果我们检查R0处的地址并解释为带符号的字(即4字节形式),我们会看到预期的数组值。
.data
NUMB: .word 1,11,111,11,1
...
LDR r0, =NUMB
(gdb) x/8wd $r0
0x200dc: 1 11 111 11
0x200ec: 1 4929 1634033920 16804194
因此,您需要在R5的上下文中更改您的值,以假设一个4字节的字。如,
CMP r5, #(4*5)
ADDS r5, #4
答案 1 :(得分:0)
遗憾的是非常简单,只需将myData READWRITE更改为READONLY:)