C++ `__cpp`和gcc内联ARM汇编程序

C++ `__cpp`和gcc内联ARM汇编程序,c++,assembly,arm,C++,Assembly,Arm,我无法使用以下命令编译上述在线装配线: asm("ldr r6, [r0, #__cpp(offsetof(X, y))]\t\n"); 错误日志为: 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 显然,\u

我无法使用以下命令编译上述在线装配线:

asm("ldr r6, [r0, #__cpp(offsetof(X, y))]\t\n");
错误日志为:

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

显然,
\uu cpp
无法识别。有什么建议吗?

似乎
\uu cpp
是一个关键词。
GNU toolchain没有它,我建议使用语法将某些东西从C传递到内联汇编。

似乎
\uuu cpp
是一个关键字。
GNU toolchain没有它,我建议使用语法将某些内容从C传递到内联程序集。

请参阅下面的代码以获得可能的解决方案,但是您可能需要查看文档(或其他文档)以使用GCC编写正确的内联程序集

调用GCC的offsetof,但是调用GCC会使您的意图在本例中不清楚(这不会禁用offsetof)

$cat foo.c
类型定义结构{
int-pad[32];
void*buf_;
}VP8BitReader;
空条(){
asm volatile(“ldr r6,[r0,%[offset]]]\t\n”:/*输出*/:/*输入*/[offset]“J”((VP8BitReader,buf)):/*clobber*/“r6”,“r0”);
}
$armlinux gnueabi gcc-O2-S-fno common-fno builtin-Wall foo.c
$cat foo.s
#应用程序
@7“foo.c”1
ldr r6[r0,#128]

有关可能的解决方案,请参见下面的代码,但是您可能需要查看文档(或其他文档),以便使用GCC编写正确的内联程序集

调用GCC的offsetof,但是调用GCC会使您的意图在本例中不清楚(这不会禁用offsetof)

$cat foo.c
类型定义结构{
int-pad[32];
void*buf_;
}VP8BitReader;
空条(){
asm volatile(“ldr r6,[r0,%[offset]]]\t\n”:/*输出*/:/*输入*/[offset]“J”((VP8BitReader,buf)):/*clobber*/“r6”,“r0”);
}
$armlinux gnueabi gcc-O2-S-fno common-fno builtin-Wall foo.c
$cat foo.s
#应用程序
@7“foo.c”1
ldr r6[r0,#128]
asm(“ldr r6,[r0,%0]\n:“J”(偏移量(X,y)):“r6”,“r0”)
虽然可能最好让编译器通过注释来分配
r0
r6
值。我的观点是,“J”是这个的说明符。
asm(“ldr r6,[r0,%0]\n):“J”(偏移量(X,y))::“r6”,“r0”)
虽然可能最好让编译器通过注释来分配
r0
r6
值。我的观点是“J”是这个的说明符。
{standard input}: Assembler messages:
{standard input}:74: Error: ']' expected -- \
      `ldr r6,[r0,#__cpp(offsetof(VP8BitReader,buf_))]'
$ 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>