gpt4 book ai didi

linux - Nasm 程序段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:26:41 25 4
gpt4 key购买 nike

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

关于linux - Nasm 程序段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com