2012-06-24 59 views
1

我想更好地理解nasm中的堆棧,所以我讓這個程序嘗試將「參數」傳遞給nasm中的「函數」。我對這個大會很新。Nasm程序段錯誤

section .data 
v0s0msg0:  db 'Enter something',10 
v1t0msg0L:  equ $-v0s0msg0 

section .bss 
v2i0inp0  resb 256 
v3v0temp0 resb 256 

section .text 
global _start 
_start: 
;This is a nasm program to help me understand the stack better 
mov eax,4 
mov ebx,1 
mov ecx,v0s0msg0 
mov edx,v1t0msg0L 
int 80h 

mov eax,3 
mov ebx,0 
mov ecx,v2i0inp0 
mov edx,256 
int 80h 

push dword v2i0inp0 
call f0m0test0 

mov eax,1 
mov ebx,0 
int 80h 

f0m0test0: 
pop dword[v3v0temp0] 
mov eax,4 
mov ebx,1 
mov ecx,v3v0temp0 
mov edx,256 
int 80h 
ret 4 

我可以組裝它,鏈接它,並運行得很好,但在運行它時,以後我進入輸入法,它只是說,下面的兩個分段錯誤「?」看人物。

我試圖改變

pop dword[v3v0temp0] 

喜歡的東西:

pop v3v0temp0 

甚至:

mov v3v0temp0,dword[ebp] 

,很多這樣的事情,但他們都最終成爲無論是分段錯誤或彙編器錯誤說: 操作碼和o的無效組合perands 我真的很感謝幫助,使這個程序的工作,也請解釋一點關於堆棧,使用前綴'dword',''''字符是什麼。我只想解釋如何使用堆棧來「參數」。 我在Linux操作系統上運行此,Ubuntu的 預先感謝您

回答

2
f0m0test0: 
pop dword[v3v0temp0] 

這離開本層,而不是參數的返回地址。

mov eax,4 
mov ebx,1 
mov ecx,v3v0temp0 
mov edx,256 
int 80h 
ret 4 

既然你已經pop版的東西(雖然不是預期參數)關棧,ret 4上面幾乎是肯定不對的。

我想你只想:

f0m0test0: 
mov eax,4 
mov ebx,1 
mov ecx,[esp+4] 
mov edx,256 
int 80h 
ret 4 

或者,而不是被叫清理與ret 4參數,具有來電做到這一點(我相信它,是通常調用約定):

push dword v2i0inp0 
call f0m0test0 
add esp,4