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

标签 c gcc segmentation-fault inline-assembly

我有几个结构/union ,例如:

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)

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

最佳答案

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

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

关于c - 使用 union/struct 成员作为 gcc 内联 asm 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22768618/

相关文章:

c - C 中的循环展开

c - 守护进程无法找到文件(通过相对路径指定)

c - C 中 rand() 的问题

c++ - 部分特化的默认参数 [Clang yes, GCC no]

Node.js 源代码构建在 ARM 上给出段错误

尝试实现 LinkedList 时出现 C 段错误

c - 从 stdin 读取的段错误(核心转储)

c - 使用互斥锁实现生产者/消费者

c - 段错误: 11 Seems unusual

c - 编译时哪个效率更高?