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+的汇编代码用于复制数组。我对此有一些疑问;
当我使用
LDR R2, [R1,R0]
而不是LDRB R2, [R1,R0]
时,会出现我无法定义的错误。我认为x_array定义的原因是DCB,但我不确定。当我在代码中使用
ALIGN
语句时,该语句的明确目的是什么?ARM M0+组件是否有
RET
指令?
如果您在代码中识别出任何错误,请警告我。谢谢
-
LDRB
和LDR
之间的区别在于数据的大小。如果要加载一个字节(8位(,请使用LDRB
。对于一个字(32位(,使用LDR
。 -
ALIGN
的目的是跳过一些字节,以便后面的地址是某个倍数,如果没有另行指定,通常是4的倍数。大多数数据需要对齐到其成员大小的倍数,例如:32位字的数组需要对齐到4个字节。 -
对于ARMv6M(Cortex-M0、M0+和M1(,从函数返回的指令是
bx lr
,意思是分支,交换到链接寄存器中的地址。这在堆栈上没有任何内容的函数中使用,或者在堆栈已经弹出时使用。通常,在返回的同时从堆栈中弹出任何保存的寄存器会更有效。这看起来像pop {r4-r6,pc}
。确切的寄存器列表将取决于您推送的内容,但关键是您已经推送了一些寄存器,包括lr
链接寄存器,它会弹出到pc
程序计数器中。