linux - 如何多次返回被调用函数/NASM

标签 linux assembly stack nasm x86-64

我正在尝试返回一个函数,该函数也调用一个函数,但我得到一个 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 函数以正常完成程序。

关于linux - 如何多次返回被调用函数/NASM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41126161/

相关文章:

python - 练习 Linux Shell 脚本编写

c - 使用 GCC -march=i686 逆向工程 C 代码

c++ - 简单 for 循环的意外无意义优化尝试(在 Visual C++ 2017 中)

c++ - 递归backtracker迷宫生成算法栈循环

c - Linux, C : terminate multple threads after some seconds (timer? )

linux - appassembler maven 插件未对生成的脚本设置 "execute"权限

linux - 如何打印单个 ASCII 字符?

c - 在 Win32 上使用 GCC 向程序集符号添加前导下划线?

assembly - x86 程序集 : Pop a value without storing it

java - 在java中计算一个简单的表达式