2013-12-20 2 views
1
asm("ldr r6, [r0, #__cpp(offsetof(X, y))]\t\n"); 

Я не могу скомпилировать выше рядный сборочной линии, используя следующую команду:`__cpp` и GCC встроенный ARM ассемблере

arm-linux-gnueabi-gcc -c -lm -pg -O1 -g -pipe -fno-common \ 
    -fno-builtin -Wall -march=armv7-a -mfpu=neon -mfloat-abi=softfp \ 
    -mthumb-interwork -mtune=cortex-a9 

журнал ошибок:

{standard input}: Assembler messages: 
{standard input}:74: Error: ']' expected -- \ 
     `ldr r6,[r0,#__cpp(offsetof(VP8BitReader,buf_))]' 

Видимо __cpp непризнан. Какие-либо предложения?

ответ

2

Похоже, __cpp - это ключевое слово available for RealView assembler. GNU toolchain не имеет его, я предлагаю использовать синтаксис Extended Asm, чтобы передать что-то от C до встроенной сборки.

+2

'ASM ("LDR r6, [г0,% 0] \ п": "J"(offsetof (X, Y)):: "r6", "г0");' хотя это, вероятно, лучше дать компилятору присвоить значение «r0» и «r6», аннотируя их. Я хочу сказать, что для этого является спецификатором J. –

2

См. Приведенный ниже код для возможного решения, однако вам, вероятно, необходимо проверить документацию Extended Asm (или некоторые другие tutorial) для написания правильной встроенной сборки с GCC.

offsetof для GCC называется __builtin_offsetof, однако вы вызываете GCC с -fno-builtin, что делает ваше намерение неясным в этом случае (что не отключает offsetof).

$ cat foo.c 
typedef struct { 
    int pad[32]; 
    void *buf_; 
} VP8BitReader; 

void bar() { 
    asm volatile("ldr r6, [r0, %[offset]]\t\n" : /* output */ : /* input */ [offset] "J" (__builtin_offsetof(VP8BitReader, buf_)) : /* clobber */ "r6", "r0"); 
} 
$ arm-linux-gnueabi-gcc -O2 -S -fno-common -fno-builtin -Wall foo.c 
$ cat foo.s 
<skipped> 
#APP 
@ 7 "foo.c" 1 
    ldr r6, [r0, #128] 
<skipped> 
Смежные вопросы