使用union / struct成员作为gcc内联asm参数

时间:2014-03-31 17:48:49

标签: c gcc segmentation-fault inline-assembly

我有几个结构/联合,例如:

union
{
    uint8_t X;
    struct __attribute__((packed, aligned(1)))
    {
    uint8_t A  : 1;
    uint8_t B  : 1;
    uint8_t C  : 1;
    uint8_t D  : 1;
    uint8_t E  : 1;
    uint8_t F  : 1;
    uint8_t G  : 1;
    uint8_t H  : 1;
    };
}DATA;     

我需要在内联汇编中访问它们的元素,例如:

asm volatile
(
"\
    mov %1, %%eax       \t\n\
    inc %%eax           \t\n\
    mov $0, %0      \t\n\
"
:"=d"(u->X)
:"d"(temp)      
);

应用程序段错误在最后一行。

mov    (%rdx),%eax                     
inc    %eax                        
mov    $0x0,%dl                        
mov    %dl,0x1(%rax)

我试图创建一个镜像指针并通过它访问struct但它没有效果,只是没有段错误。所以我使用temp变量。是否有可能或我尝试做一些奇怪的事情?

1 个答案:

答案 0 :(得分:1)

内联汇编不得更改未列为输出的寄存器或clobber列表中的寄存器。

在您的示例中,编译器已选择在RAX中存储u,这会被您的代码更改。 EAX是RAX的下半部分。