llvm-gcc汇编程序:LDR语法

时间:2012-02-21 09:04:00

标签: gcc assembly arm llvm

此代码在gcc上编译得很好,但是当使用llvm(llvm-gcc)时,它在"constant expression expected"

的行上显示ldr

问题是语法:如何指定数组所在的位置?我不想以字节为单位硬编码位移:ldr r7, [pc, #some_shift]但要使用文字来保持代码清洁和安全。

知道如何让它发挥作用吗?

.globl func_name

func_name:
     push   {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}

//[Some stripped code]

     add    r6, r6, sl, lsl #2
     sub    ip, ip, sl
     ldr    r7, =maskTable           // Here it crashes
     add    sl, sl, #4  @ 0x4

// Some stripped code here

     mov    r0, #0  @ 0x0 // return 0
     pop    {r4, r5, r6, r7, r8, r9, sl, fp, ip, pc}

     .word  0x00000000

.data
.align 5
maskTable:

    .word  0x00000000, 0x00000000, 0x00000000, 0x00000000
    .word  0x0000FFFF, 0x00000000, 0x00000000, 0x00000000
    .word  0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000

3 个答案:

答案 0 :(得分:2)

尝试更改

ldr r7, =maskTable

ldr r7, maskTable

并删除

.data

部分。它似乎是gcc的错误/缺失能力< 4.6处理.data部分

答案 1 :(得分:1)

您可以尝试两件事:

  1. ldr r7, =maskTable更改为adr r7, maskTable
  2. 将表的地址存储在单独的标签下并手动加载,如下所示:

  3. .globl func_name
    
    func_name:
         push   {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
    
    //[Some stripped code]
    
         add    r6, r6, sl, lsl #2
         sub    ip, ip, sl
         ldr    r7, maskTable_adr           // Here it crashes
         add    sl, sl, #4  @ 0x4
    
    // Some stripped code here
    
         mov    r0, #0  @ 0x0 // return 0
         pop    {r4, r5, r6, r7, r8, r9, sl, fp, ip, pc}
    
         .word  0x00000000
    
    .data
    .align 5
    maskTable_adr:
        .word   maskTable
    
    maskTable:
    
        .word  0x00000000, 0x00000000, 0x00000000, 0x00000000
        .word  0x0000FFFF, 0x00000000, 0x00000000, 0x00000000
        .word  0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000
    

答案 2 :(得分:0)

我自己不知道答案,但如果是我,我会看一些编译过的C代码,看看编译器是如何做到的。确保编译器不处于PIC模式或其他状态,或者它会做更复杂和不必要的事情。