7
popl   %ebp

スタックの操作にはパラメータが必要%ebpないため、不要のようです。pop

なぜそれが理にかなっているのですか?

4

3 に答える 3

9

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 形式で入手できます。

于 2010-03-31T15:39:43.953 に答える
6

このパラメータは宛先を設定します。

于 2010-03-31T15:15:05.533 に答える
4

アンドレイの答えを拡張するには、ポップされた要素のスタック ポインターをインクリメントするだけでなく、ポップされた要素も宛先アドレスまたはレジスタにコピーされます。

あなたが与えた命令は、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 に書き込まれるにインクリメントする実際の文書化された動作が複製されます。そして、アドレッシングモードの一部として使用して、メモリ宛先ポップのアドレス計算の前にインクリメントを行うことのように%esppopl 12(%esp, %edx, 4)

于 2010-03-31T15:26:11.177 に答える