Problema LDRB y LDR en la programación en ensamblador del ARM M0+
ArraySize EQU 0X0A
AREA array, DATA, LECTUREESCRITURA
ALIGN
y_array SPACE ArraySize
AREA sort, CODE, SOLO_LECTURA
ENTRADA
THUMB
ALIGN
EXPORTAR __main
__main PROC
B __sort
__ret
ALIGN
FIN
__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
FIN
x_array DCB 12,65,43,37,89,94,37,56,33,14
ACABAR
Soy nuevo en ensamblador. El código ensamblador para ARM M0+ de arriba se utiliza para copiar un array. Tengo algunas preguntas sobre eso:
- Cuando utilizo
LDR R2, [R1,R0]
en lugar deLDRB R2, [R1,R0]
se produce un error que no pude definir. Creo que la razón es la definición de x_array como DCB, pero no estoy seguro de eso. - Cuando utilizo la instrucción
ALIGN
en el código, ¿cuál es el propósito claro de la instrucción? -
¿Hay alguna instrucción
RET
para el ensamblador ARM M0+?
Y por favor, avíseme si hay algún error que note en el código. ¡Gracias!
davy.ai
La razón por la que usar
LDR R2, [R1,R0]
en lugar deLDRB R2, [R1,R0]
causa un error es debido a queDCB
define el arreglo como una secuencia de bytes, no como una secuencia de palabras de 32 bits. Por lo tanto, cada elemento del arreglo debe ser cargado como un valor de 8 bits utilizandoLDRB
.La declaración
ALIGN
se utiliza para alinear el inicio de una sección o un bloque de código a una dirección de memoria específica. En el fragmento de código anterior, se utiliza para alinear el inicio de la secciónsort
en un límite de 4 bytes, lo cual puede mejorar el rendimiento cuando el código se carga en la memoria.No existe la instrucción
RET
en el ensamblador ARM M0+. En su lugar, la dirección de retorno se almacena en el registro de enlaceLR
, y se utiliza la instrucciónBX LR
para retornar de un procedimiento. En el código anterior, la etiqueta__ret
no se utiliza y puede ser eliminada.