0

ここに画像の説明を入力してください

2番目の質問proco2で、なぜx-> bi-> f [3]であるのか、誰かが私に説明できますか?

4

2 に答える 2

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およびij。それで

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]
于 2012-11-14T00:54:19.860 に答える
0

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]です。

于 2012-11-14T05:33:35.887 に答える