2

我有一个例程调用一个例程,在该例程中需要一个值到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

我希望这段代码足以让你明白。我也喜欢解释。

4

1 回答 1

3

leave是什么:

mov esp, ebp
pop ebp

如果你想使用它并让它工作,你应该写类似

push ebp
mov ebp, ecx
leave

在您的功能结束时。当然,leave如果你这样做,你可以完全放弃使用:

mov esp, ecx
ret

因为您使用ecx的是帧指针。

于 2013-03-21T01:07:09.020 回答