如何正确使用.ltorg指令来扩展LDR Literals的范围

时间:2014-06-11 03:03:19

标签: assembly arm directive

我在装配中创建迷宫生成器。现在在代码的这个特定部分,我试图保存在一维数组中表示的当前2D位置。我试图在.data。

部分中保存索引(.halfword)
//  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

当我尝试编译代码时,汇编程序会发出错误

  

"错误:无效的文字常量:池需要更接近"

SETDIRECTIONS和其他函数放在更接近.data的部分解决它,但只是一个临时修复。我担心我的代码越长,我就越会遇到这个错误。

我搜索了一个修补程序并使用.ltorg似乎解决了这些问题,但我不知道如何使用它,还没有足够的示例代码可以在互联网上搜索到正确使用

我用完了寄存器,r5-r10目前已经拥有了重要的东西。我可以将它们弹出堆栈来保存,但是我需要在一些多个嵌套函数中访问当前位置,其中push pop会让我很难追溯它。

0 个答案:

没有答案