IA32中的对齐和组装

时间:2012-11-14 00:49:08

标签: assembly x86 alignment

enter image description here

有人可以向我解释为什么在第二个问题proco2中,x-> b.i - > F [3]

2 个答案:

答案 0 :(得分:3)

实际上在堆栈上你只有一个指向struct s2的指针(在8(%ebp)中)。因此

之后
movl 8(%ebp), %eax

%eax中,您的地址为 struct s2

struct s2的第8至第11个字节构成f[0],第12个第15个字节构成 f[1] ,因此您有

return x->f[1]

之后的第二种情况
movl 8(%ebp), %eax

%eax中,您的地址为 struct s1

struct s1的第4至第7个字节构成b类型的 union u1 字段。因此

之后
movl 4(%eax), %eax
%eax {p>你有union u1。由于它是union%eax同时包含所有字段值(hij)。所以

movl 20(%eax), %eax

实际上得到%eax中任何指针的第20个第23个字节(它不能是j字段,因为它不是指针)。它不能是h字段,因为它指向struct s1sizeof (struct s1)是12且<20。因此,它必须是 i 字段。 struct s2的第20个字节为 f[3] ,因此您拥有:

return x->b.i->f[3]

答案 1 :(得分:0)

mov 8(%ebp),%eax ;; eax =&amp; x
mov 4(%eax),%eax ;; eax = x-> b(或x-> e)

更有可能x-&gt; e会有movsbl 4(%eax),%eax //;签署延期
或者mov 4(%eax),%al带符号扩展名

因为char不能(不应该)用作指针,所以4(%eax)是结构的ptr。 哪个结构? 20%(eax)仅存在于struct s2,除非最初有一个数组os结构s1。

s2的偏移20是f [3]。