
2番目の質問proco2で、なぜx-> bi-> f [3]であるのか、誰かが私に説明できますか?
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構成します。したがって、bunion 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バイト目は、したがって次のようになります。hstruct s1sizeof (struct s1)istruct s2f[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]です。