如果我有一个这样声明的工会:
union u1 {
struct s1 *h;
struct s2 *i;
char j;
};
我如何使用IA32之类的东西或任何程序集访问第一个,第二个或第三个元素?如果我理解联合是正确的,则此联合的字节顺序应仅占用4个字节(IA32),因为IA32中的指针为4个字节。
u1
中有eax
实例的地址,则可以获得h
或i
的值(即h
或i
指向的地址),例如ebx
,通过一个琐碎的mov ebx, dword ptr[eax]
(两者都是相同的,因为在汇编中,不同的指针类型之间没有真正的区别)
关于j
中的bl
的读取,应该是
mov bl, byte ptr[eax]
或如果是
Edit:正如Peter Cordes正确地指出的那样,如果您实际上想对它进行全寄存器算术运算(在C语言的数学表达式中使用它会发生这种情况),则需要签名-如果您的
char
已签名(通常是这样),则将其扩展:movsx ebx, byte ptr[ebx]
unsigned
,则将其零扩展:mobzx ebx, byte ptr[ebx]
对于x86_64,本质上是相同的,更改某些寄存器/内存操作数的大小:mov rbx, qword ptr[rax]
或
mov bl, byte ptr[rax]