有人可以向我解释为什么在第二个问题 proco2 中,x-> bi -> f[3]?
2 回答
实际上,在堆栈上,您只有一个指向struct s2
(in 8(%ebp)
) 的指针。因此之后
movl 8(%ebp), %eax
在%eax
你有一个地址struct s2
。
struct s2
构成的第8-11f[0]
个字节和第 12-15 个字节构成f[1]
,因此您有
return x->f[1]
在第二种情况下
movl 8(%ebp), %eax
在%eax
你有一个地址struct s1
。
的第 4-7 个字节struct s1
构成b
类型字段union u1
。因此之后
movl 4(%eax), %eax
在%eax
你有union u1
。因为它union
同时%eax
包含所有字段值(h
和i
)j
。所以
movl 20(%eax), %eax
实际上正在获取任何指针所在的第 20-23 个字节%eax
(它不能是j
字段,因为它不是指针)。它不能是h
字段,因为它指向struct s1
并且sizeof (struct s1)
是 12,即 <20。因此,它必须是i
场。的第 20-23 个字节struct s2
是f[3]
,因此您有:
return x->b.i->f[3]
mov 8(%ebp), %eax ;; eax = &x
mov 4(%eax), %eax ;; eax = x->b (or x->e)
More likely x->e would have had movsbl 4(%eax), %eax //; sign extension
or mov 4(%eax), %al with sign extension
Because char can't (shouldn't) be used as a pointer, the 4(%eax) was a ptr to struct. Which struct? 20%(eax) exists only for struct s2, unless originally there was an array os structs s1.
Offset 20 of s2 is f[3].