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

问题描述 投票:0回答:1

如果我有一个这样声明的工会:

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

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

assembly x86 x86-64 unions
1个回答
1
投票
[如果您在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]
© www.soinside.com 2019 - 2024. All rights reserved.