assembly - Cómo utilizar la directiva.ltorg correctamente para ampliar el rango de Literales LDR
arm directive (0)
Estoy creando un generador de laberinto en ensamblaje. Ahora en esta parte particular del código, estoy tratando de guardar la posición 2D actual representada en una matriz 1D. Estoy intentando guardar el índice (.halfword) en la sección .data.
// R1 (CHOICE IS INPUT)
// R0 (CURRENT POS)
// R3 (ARRAY2D ADDRESS COPY)
// R2 (VAL TO STORE)
SETDIRECTIONS:
MOV R3, R4 // ARRAY2D ADDRESS
MOV R0, R5 // CURRENT POS
PUSH {R1}
LDRH R1, =POSORIGIN
STRH R0, [R1] // STORE POSITION ORIGIN
POP {R1}
CMP R1, #1
BEQ D1
CMP R1, #2
BEQ D2
...// More CMP and BEQ Below
.....
D1:
// UP ONLY
SUB R0, #17 // 1 ROW UP
ADD R3, R0 // BASE ADDRESS + CURRENT POS (1 ROW UP)
MOV R2, #3 // SET AS FLOOR
STRB R2, [R3] // STORE TO ARRAY
SUB R3, #17 // 1 ROW UP AGAIN
STRB R2, [R3] // SET AS FLOOR
.....
.section .data
POSORIGIN:
.hword 0
Cuando intento compilar el código, el ensamblador escupe un error
"Error: constante literal no válida: el grupo debe estar más cerca"
Poniendo SETDIRECTIONS
y otras funciones más cerca de la sección .data lo resuelve, pero solo una solución temporal. Me temo que cuanto más largos sean mis códigos, más me encontraré con este error.
Busqué una solución y el uso de .ltorg
parece solucionarlos, pero no sé cómo usarlo. No hay suficiente código de muestra que pueda buscar en Internet para usarlo correctamente.
Me quedé sin registros para usar, r5-r10 actualmente tiene algo importante. Pude insertarlas en la pila para guardarlas, pero necesito acceso en la posición actual en algunas funciones de anidamiento múltiple donde la inserción de pop me dificultará rastrearla.