2013-03-21 30 views
2

我有一個例程,執行調用的例程,其中ebp寄存器的值預計。我在例程中多次改變它。所以,我不能這樣做:mov ebp,esp在頂部code.I嘗試通過將esp地址保存在另一個寄存器中,並在leave指令將這樣的地址放入ebp之前,但我仍然收到segmentaion故障。離開指令返回一個段錯誤

如何解決這個問題?

的代碼是非常巨大的(在這裏發佈,但如果需要,我可以張貼),但這個想法是這樣的:

;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

看來你已經注意到了這個問題:「我在例行程序中多次改變[EBP的價值]」。不要這樣做。 – SecurityMatt 2013-03-21 01:01:45

+0

@SecurityMatt:但我在'end'標籤中恢復它。是不足夠的?在'ebp'的'esp'地址離開指令? – 2013-03-21 01:04:56

+0

此外,它是我打電話的常規使用的寄存器,我將如何設置它而不修改'ebp'值? – 2013-03-21 01:06:15

回答

3

leave確實這是什麼:

mov esp, ebp 
pop ebp 

如果你想使用它,它的工作,你應該寫類似

push ebp 
mov ebp, ecx 
leave 

在你的函數結束。當然,你可以只用leave乾脆如果你免除:

mov esp, ecx 
ret 

,因爲你正在使用ecx作爲幀指針。

+0

我得到的最高工作:'推EBP \t MOV ESI,esp'在結束:'\t MOV ESP,ESI \t MOV EBP,ESP \t離開 \t ret'沒有給出賽格故障。這個實施是否正確? – 2013-03-21 01:15:26

+0

另一個轉儲問題:爲什麼我需要將'ebp'地址放在堆棧中,如果我不從那裏彈出?或者我錯了嗎? – 2013-03-21 01:24:01