有人可以向我解释为什么在第二个问题proco2中,x-> b.i - > F [3]
答案 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
同时包含所有字段值(h
,i
和j
)。所以
movl 20(%eax), %eax
实际上得到%eax
中任何指针的第20个第23个字节(它不能是j
字段,因为它不是指针)。它不能是h
字段,因为它指向struct s1
而sizeof (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]。