assembly arm directive

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.