纳斯姆程序分段错误



我试图更好地理解 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]

还有很多类似的事情,但它们最终要么是分段错误,要么是汇编程序的错误,说: 操作码和操作数的组合无效我非常感谢帮助使这个程序工作,另外,请解释一下堆栈,使用前缀"dword",以及"[]"字符的用途。我想解释一下如何将堆栈用于"参数"。我正在Linux操作系统上运行它,Ubuntu提前谢谢你

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

最新更新