2016-12-13 3 views
0

Я пытаюсь вернуть функцию, которая также вызывает функцию, но я получаю SIGSEV.Как возвращать вызываемые функции несколько раз/NASM

МОЯ ASSEMBLER: Linux, Unix NASM 64 + л.д.

образец:

;something 
call myFunction 

myFunction: 
    call func2 
ret 

func2: 
;do sth 
ret 

Одним из возможных вариантов является нажать указатель на стек, но стек Limited, не так ли? И мне нужно решение для этого 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 

уточнить ли это это немного?

+0

ОК, бесконечно, я имею в виду, n раз. Проблема: регистр, в котором хранится указатель на последний вызов - мнемоника обновляется при каждом новом вызове – Linuxer4Fun

+0

Но адреса возврата хранятся в стеке, поэтому программа возвращается хорошо, независимо от того, сколько вызовов fuction задействовано. –

+1

действительно? Собираюсь повторить это. Я расскажу вам позже, как это получилось. – Linuxer4Fun

ответ

1

Посмотрите на этой линии:

int 80h 
    ret 

Я думаю, что это ret является прыжок из вашего сегмента кода. Вы должны удалить ret, чтобы вызвать функцию sys_exit, чтобы закончить программу изящно.

+1

Да ладно, я так глуп, возможно, было неплохо попробовать спальный цикл uberman :). – Linuxer4Fun

Смежные вопросы