我有几个结构/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/