如何多次返回被叫函数/ NASM

时间:2016-12-13 16:38:22

标签: linux assembly stack nasm x86-64

我正在尝试返回一个函数,它也调用了一个函数,但是我得到了一个SIGSEV。

MY ASSEMBLER:Linux,Unix nasm 64 + ld

样品:

;something
call myFunction

myFunction: 
   call func2
ret

func2:
 ;do sth
ret

一种可能性是将指针推向堆栈,但堆栈是有限的,不是吗?我需要一个解决方案,这样做n次,而n应该能够代表无限。

另一种可能性是调用函数并为返回做一个标签,但是当我执行一个由不同例程调用的函数时,我会遇到另一个问题:(

有一种优雅的方式吗?这个?

牛,所以我得到了建议,我应该尝试一下,因为它可以工作。

我尝试使用此代码:

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

这是否澄清了这一点?

1 个答案:

答案 0 :(得分:1)

看看这一行:

    int 80h
    ret

我认为此ret跳出了您的代码段。您必须删除ret才能调用sys_exit函数以正常完成编程。