ARM M0+部件中的LDRB和LDR问题


ArraySize EQU 0X0A
AREA array, DATA, READWRITE
ALIGN
y_array SPACE ArraySize
AREA sort, CODE, READONLY
ENTRY
THUMB
ALIGN
EXPORT __main
__main PROC
B __sort
__ret

ALIGN
ENDP
__sort PROC
MOVS R0, #0
LDR R1, =x_array
LDR R3, =y_array
CMP R5, #ArraySize
BGE __ret
__mem LDRB R2, [R1,R0]
STRB R2, [R3,R0]
ADDS R0, R0, #1
B __mem
ENDP
x_array DCB 12,65,43,37,89,94,37,56,33,14
END

我是组装新手。以上ARM M0+的汇编代码用于复制数组。我对此有一些疑问;

  1. 当我使用LDR R2, [R1,R0]而不是LDRB R2, [R1,R0]时,会出现我无法定义的错误。我认为x_array定义的原因是DCB,但我不确定。

  2. 当我在代码中使用ALIGN语句时,该语句的明确目的是什么?

  3. ARM M0+组件是否有RET指令?

如果您在代码中识别出任何错误,请警告我。谢谢

  1. LDRBLDR之间的区别在于数据的大小。如果要加载一个字节(8位(,请使用LDRB。对于一个字(32位(,使用LDR

  2. ALIGN的目的是跳过一些字节,以便后面的地址是某个倍数,如果没有另行指定,通常是4的倍数。大多数数据需要对齐到其成员大小的倍数,例如:32位字的数组需要对齐到4个字节。

  3. 对于ARMv6M(Cortex-M0、M0+和M1(,从函数返回的指令是bx lr,意思是分支,交换到链接寄存器中的地址。这在堆栈上没有任何内容的函数中使用,或者在堆栈已经弹出时使用。通常,在返回的同时从堆栈中弹出任何保存的寄存器会更有效。这看起来像pop {r4-r6,pc}。确切的寄存器列表将取决于您推送的内容,但关键是您已经推送了一些寄存器,包括lr链接寄存器,它会弹出到pc程序计数器中。

最新更新