popl %ebp
スタックの操作にはパラメータが必要%ebp
ないため、不要のようです。pop
なぜそれが理にかなっているのですか?
http://www.cs.virginia.edu/~evans/cs216/guides/x86.htmlから
pop — ポップ スタック
pop 命令は、ハードウェアがサポートするスタックの最上部から 4 バイトのデータ要素を削除して、指定されたオペランド (つまり、レジスタまたはメモリ位置) に格納します。最初にメモリ位置 [SP] にある 4 バイトを指定されたレジスタまたはメモリ位置に移動し、次に SP を 4 ずつインクリメントします。
構文
pop <reg32>
pop <mem>例
pop edi — スタックの一番上の要素を EDI にポップします。
pop [ebx] — EBX の位置から始まる 4 バイトで、スタックの一番上の要素をメモリにポップします。
もう 1 つの参考資料としてhttp://en.wikibooks.org/wiki/X86_Assemblyがあり、PDF 形式で入手できます。
このパラメータは宛先を設定します。
アンドレイの答えを拡張するには、ポップされた要素のスタック ポインターをインクリメントするだけでなく、ポップされた要素も宛先アドレスまたはレジスタにコピーされます。
あなたが与えた命令は、2 つの命令とほぼ同等です (Intel 構文)。
add esp, 4 # increment the stack pointer
mov ebp, [esp - 4] # load what ESP was pointing to
att(ガス)構文でこれだと思います
add $4, %esp
mov -4(%esp), %ebp
もちろんpop
、FLAGS を変更することはありません (したがってadd
、LEA を使用して実行することを想像してください)。また、ロードと追加の間で中断することはできません。
の特殊なケースではpop esp
、疑似コードで 2 番目のロードを実行すると、古いトップ オブ スタックの場所からのデータが ESP に書き込まれる前にインクリメントする実際の文書化された動作が複製されます。そして、アドレッシングモードの一部として使用して、メモリ宛先ポップのアドレス計算の前にインクリメントを行うことのように%esp
popl 12(%esp, %edx, 4)