我有一个例程,它执行一个例程,在这个例程中,ebp
寄存器的值是预期的。我在例程中多次改变它。所以我不能这样做:mov ebp,esp
在代码顶部。我尝试将esp
地址保存在另一个寄存器中,并在leave
指令之前将此地址放入ebp
但我仍然得到一个段错误。
如何解决这个问题?
代码非常庞大(发布在这里,但我可以发布,如果需要),但这个想法是这样的:
;a lot of arguments are passed in stack
foo:
xor ebx,ebx
mov ecx,esp
loop0:
sub edx,1
jz end
;etc
mov eax,[esp+ebx]
mov ebp,eax
call routinex
;etc..
;...
mov ebp,edx
call printx
add ebx,4
jmp loop0
end:
mov ebp,ecx
leave
ret
我希望这段代码足以让你明白了...... 我也想解释一下。
答案 0 :(得分:3)
leave
做的是:
mov esp, ebp
pop ebp
如果你想使用它并让它工作,你应该写一些像
push ebp
mov ebp, ecx
leave
在你的功能结束时。当然,如果你这样做,你可以完全不使用leave
:
mov esp, ecx
ret
因为您使用ecx
作为帧指针。