如果我声明是这样的工会:
union u1 {
struct s1 *h;
struct s2 *i;
char j;
};
如何使用IA32之类的东西或任何程序集访问第一个,第二个或第三个元素? 如果我理解联合是正确的,则由于IA32中的指针是4个字节,因此该联合的字节顺序应仅占用4个字节(IA32)。
如果我声明是这样的工会:
union u1 {
struct s1 *h;
struct s2 *i;
char j;
};
如何使用IA32之类的东西或任何程序集访问第一个,第二个或第三个元素? 如果我理解联合是正确的,则由于IA32中的指针是4个字节,因此该联合的字节顺序应仅占用4个字节(IA32)。
联合的所有成员都共享初始地址,因此无论您想读取哪个联合成员,它都在内存中的同一位置,唯一需要更改的就是如何解释它。
如果您在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]