我正在尝试返回一个函数,该函数也调用一个函数,但我得到一个 SIGSEV。
我的汇编程序:Linux、Unix nasm 64 +ld
示例:
;something
call myFunction
myFunction:
call func2
ret
func2:
;do sth
ret
一种可能是将指针压入堆栈,但堆栈是有限的,不是吗?我需要一个解决方案来执行 n 次,而 n 应该能够代表无穷大。
另一种可能性是调用该函数并为返回做一个标签,但是当我有一个由不同例程调用的函数时,我遇到了另一个问题:(
有没有一种优雅的方式来做到这一点?
Ox,所以我得到了建议,我应该尝试一下,因为它可以工作。
我用这段代码试过了:
section .data
test : db "test", 0x0a; length: 5
input: db "433", 0x00
blank: db 0xa
section .bss
section .text
global _start:
_start:
mov eax, 4
mov ebx, 1
mov ecx, input
mov edx, 4
int 80h
mov eax, input
call strToInt
mov [input], eax
mov eax, 4
mov ebx, 0
mov ecx, test
mov edx, 5
int 80h
ret
mov eax, 1
mov ebx, 0
int 80h;
strToInt:
mov ebx, 0; counter
mov ecx, 0; ecx is 4 the result
conversion_loop:
cmp BYTE[eax], 0
jz leave_loop
sub byte[eax], 48
inc eax
inc ebx
cmp ebx ,9
jge leave_loop
jmp conversion_loop
leave_loop:
call hey
ret
hey:
mov eax, 4
mov ebx, 0
mov ecx, test
mov edx, 5
int 80h
ret
(对不起代码,这么长-.-)
结果是:
433test
test
SEGFAULT
这是否澄清了这一点?
看这几行:
int 80h
ret
我认为这个ret
是跳出你的代码段。您必须删除 ret
才能调用 sys_exit 函数以正常完成程序。
我是一名优秀的程序员,十分优秀!