2番目の質問proco2で、なぜx-> bi-> f [3]であるのか、誰かが私に説明できますか?
2 に答える
struct s2
実際、スタックには(in )へのポインタしかありません8(%ebp)
。したがって、
movl 8(%ebp), %eax
あなたの中%eax
にはのアドレスがありstruct s2
ます。
struct s2
構成の8〜11バイト目と12〜15バイト目がf[0]
構成されているため、次のf[1]
ようになります。
return x->f[1]
後の2番目のケースでは
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
することはできません。12は<20です。したがって、それはフィールドでなければなりません。の20〜23バイト目は、したがって次のようになります。h
struct s1
sizeof (struct s1)
i
struct s2
f[3]
return x->b.i->f[3]
mov 8(%ebp)、%eax ;; eax =&x
mov 4(%eax)、%eax ;; eax = x-> b(またはx-> e)
より可能性が高いx->eはmovsbl4(%eax)、%eax//;を持っていたでしょう。符号拡張
またはmov4(%eax)、符号拡張付きの%al
charはポインタとして使用できない(使用すべきではない)ため、4(%eax)は構造体のptrでした。どの構造体?20%(eax)は、元々配列os struct s1がなかった場合を除き、structs2にのみ存在します。
s2のオフセット20はf[3]です。