使用IA32或x86访问C中的联合

如果我声明是这样的工会:

union u1 {
    struct s1 *h;
    struct s2 *i;
    char j;
};

如何使用IA32之类的东西或任何程序集访问第一个,第二个或第三个元素? 如果我理解联合是正确的,则由于IA32中的指针是4个字节,因此该联合的字节顺序应仅占用4个字节(IA32)。

zhengfelix 回答:使用IA32或x86访问C中的联合

联合的所有成员都共享初始地址,因此无论您想读取哪个联合成员,它都在内存中的同一位置,唯一需要更改的就是如何解释它。

如果您在u1中有eax实例的地址,则可以获取hi的值(即hi指向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]
本文链接:https://www.f2er.com/2337968.html

大家都在问