Ten kod dobrze się kompiluje na gcc, ale gdy używasz llvm (llvm-gcc), wyświetla "constant expression expected" w wierszu z ldr

Problemem jest składnia: Jak określić miejsce, w którym znajduje się moja tablica? Nie chcę na sztywno kodować przemieszczenia w bajtach: ldr r7, [pc, #some_shift], ale używać literału, aby kod był czysty i bezpieczny.

Jakiś pomysł, jak to sprawić?

.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
2
Sam 21 luty 2012, 13:04

3 odpowiedzi

Najlepsza odpowiedź

Spróbuj zmienić

ldr r7, =maskTable

Do

ldr r7, maskTable

I usuń

.data

Sekcja. Wydaje się, że jest to błąd/brakująca zdolność gcc < 4.6 do radzenia sobie z sekcją .data

2
Sam 13 marzec 2012, 13:47

Istnieją dwie rzeczy, które możesz spróbować:

  1. Zmień ldr r7, =maskTable na adr r7, maskTable.
  2. Zapisz adres tabeli pod osobną etykietą i załaduj ją ręcznie w następujący sposób:

.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
1
Leo 13 marzec 2012, 12:13

Sam nie znam odpowiedzi, ale gdybym to był ja, spojrzałbym na jakiś skompilowany kod C i zobaczyłbym, jak to robi kompilator. Upewnij się, że kompilator nie jest w trybie PIC lub coś takiego, albo zrobi coś bardziej skomplikowanego i niepotrzebnego.

0
ams 12 marzec 2012, 14:19