离开指令返回一个seg错误

时间:2013-03-21 00:57:32

标签: linux assembly nasm 32-bit

我有一个例程,它执行一个例程,在这个例程中,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

我希望这段代码足以让你明白了...... 我也想解释一下。

1 个答案:

答案 0 :(得分:3)

leave做的是:

mov esp, ebp
pop ebp

如果你想使用它并让它工作,你应该写一些像

push ebp
mov ebp, ecx
leave

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

mov esp, ecx
ret

因为您使用ecx作为帧指针。