3

IA32について勉強中です。popl DEST命令が何をしているのかを考えると、次のように思います。

movl (%esp), DEST
addl $4, %esp

しかし、私が考えたとき、私は自分自身を二番目に推測し始めましたpopl %esp. それはおそらく無意味な命令ですが、命令を一般的に説明するためのより良い考え方があると思いますpopl DEST. どのように説明しますか?

4

1 に答える 1

4

Intel のドキュメントにある POP 命令の擬似コードの一部を次に示します。

IF StackAddrSize = 32
  THEN
    IF OperandSize = 32
      THEN
        DEST ← SS:ESP; (* Copy a doubleword *)
        ESP ← ESP + 4;
      ELSE (* OperandSize = 16*)
        ...
    FI;
...

しかし、具体的には次のように述べられていますPOP xSP

POP ESP 命令は、スタックの古い最上位にあるデータが宛先に書き込まれる前に、スタック ポインター (ESP) をインクリメントします。

これは、シーケンスが

PUSH ESP
POP ESP

次のように、異常なことは何もしません。

PUSH EAX
POP EAX

同様に、次のテキストがありますPUSH xSP

PUSH ESP 命令は、命令が実行される前に存在していた ESP レジスタの値をプッシュします。PUSH 命令が、オペランド アドレスの計算に ESP レジスタが使用されるメモリ オペランドを使用する場合、ESP レジスタがデクリメントされる前にオペランドのアドレスが計算されます。

于 2013-02-17T09:06:47.910 に答える