IA32について勉強中です。popl DEST
命令が何をしているのかを考えると、次のように思います。
movl (%esp), DEST
addl $4, %esp
しかし、私が考えたとき、私は自分自身を二番目に推測し始めましたpopl %esp
. それはおそらく無意味な命令ですが、命令を一般的に説明するためのより良い考え方があると思いますpopl DEST
. どのように説明しますか?
IA32について勉強中です。popl DEST
命令が何をしているのかを考えると、次のように思います。
movl (%esp), DEST
addl $4, %esp
しかし、私が考えたとき、私は自分自身を二番目に推測し始めましたpopl %esp
. それはおそらく無意味な命令ですが、命令を一般的に説明するためのより良い考え方があると思いますpopl DEST
. どのように説明しますか?
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 レジスタがデクリメントされる前にオペランドのアドレスが計算されます。