0

私は Assembly が初めてで、 x86 での呼び出し規約について読んでいます。

以下の例の 1 つ。

cdecl int MyFunction1(int a, int b)
{
 return a + b;
}


 x = MyFunction1(2, 3);


_MyFunction1:
push ebp
mov ebp, esp
mov eax, [ebp + 8]
mov edx, [ebp + 12]
add eax, edx
pop ebp
ret

push 3
push 2
call _MyFunction1
add esp, 8

指定されたコードの大部分を理解できますが、pop ebp が実行された 1 行に疑問があります。

プッシュ ebp の後、 mov ebp 、esp が実行され、ebp ポインターが 4 減分され、元の位置に到達するには ebp に 4 バイトを追加する必要があるため、正しい呼び出しは「pop [ebp+4]」になると思います。

4

2 に答える 2

3

典型的なエピローグは次のとおりです。

mov esp, ebp
pop ebp
ret

古い ebp は、現在の ebp が指しているアドレスに保存されます。したがってmov esp, ebp、スタック ポインターをこのアドレスに配置pop ebpするため、ebp が正しく (および esp) 復元されます。

mov esp, ebpスタックを使用せず、ebp と esp が既に同じアドレスを指しているため、関数内の命令を忘れることができます。

pop [ebp+4]スタックの一番上にある値を[ebp+4]

于 2013-06-12T10:52:58.493 に答える
0
push ebp
la la la la la la la la la la 
pop ebp
ret

それで大丈夫です。

ワンプッシュ

ワンポップ

于 2013-06-12T10:58:51.670 に答える