0

私は自分のクラスの 1 つの模擬試験を読んでいました。質問のアーキテクチャは x86 です。質問:

Which of the following lines of pseudo C code performs the same operation as the 
assembly statement 
    lea 0xffffffff(%esi), %eax ?

オプション:

a) *(esi-1) = eax
b) esi = eax + 0xffffffff
c) eax = esi - 1
d) eax = *(esi -1)

「リー」操作なので、答えは(c)のはずなのですが、どうやら答えのキーは(a)と書いてあります。これはタイプミスですか?それとも私の理解が悪いだけでしょうか。ありがとうございました。

4

2 に答える 2

2

答えcは正しいです。この種のコードは、多くの場合、コンパイラ (および一部の人間 :-)) がの非破壊バージョンである

という事実を悪用するために生成されます。これにより、最大 3 つの入力オペランドが許可され、フラグは変更されません。leaadd

于 2012-05-10T07:24:56.763 に答える
1

最も正しい解釈は次のようになります。

eax = (esi + 0xFFFFFFFF) & 0xFFFFFFFF;

もちろん、これは次のように単純化できます。

c) eax = esi - 1;

逆を行う (疑似 C を AT&T に戻す):

a) movl %eax,0xffffffff(%esi)
b) lea 0xffffffff(%eax),%esi
c) lea 0xffffffff(%esi), %eax
d) movl 0xffffffff(%esi), %eax
于 2012-05-10T04:30:52.040 に答える