使用汇编语言从数组加载值

时间:2017-04-27 13:44:33

标签: arrays assembly arm microcontroller keil

我正在研究为我考虑的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

2 个答案:

答案 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:)