Assembler, powrót z procedury

0

Witam,
Jak wrócić z procedury która została wywołana do procedury która ją wywołała, i kontynuować dalsze działanie tej procedury.
Dla przykładu

start_loop:
    shr eax ,1
    jc add_number
    mov ecx, eax
    jmp exit

add_number:
    add eax, 0x80000000
    ret

exit:
    mov ebx, 0
    mov eax, 1
    int 80h

Chciałbym aby po wykonaniu procedury add_number wrócono do procedury wywołującej i zaczęto wykonywiać od miejsca z którego wykonano skok. Powyższy kod generuje mi błąd "naruszenie ochrony pamięci(zrzut pamięci)". Co robię źle? Jak to naprawić?
Dzięki za pomoc!

1

Jak jest teraz

    jc add_number ; skocz do add_number
    mov ecx, eax
    jmp exit

add_number:
    add eax, 0x80000000 ; dodaj liczbę
    ret ; zdejmij ze stosu adres kolejnej intrukcji (do rejestru EIP) i od tego adresu wznów wykonywanie

Jak widać ret zdejmuje ze stosu coś co nie zostało na niego dodane.
Jak to powinno wyglądać poprawnie?

call add_number ; push EIP - odłożenie rejestru EIP na stosie
...
add_number:
...
ret ; zdejmij EIP ze stosu - wznów działanie

Jak widać instrukcja jc nic nie odkłada, natomiast ret zdejmuje i tutaj masz błąd.

0

tylko że call przechodzi do wykonywania procedury bezwarunkowo, a ja chciałbym wywołać skok tylko gdy CF=1

2

Dla Twojego przykładu:

start_loop:
    shr eax ,1
    jnc next   ; jeśli cf=0 skocz do next
    call add_number ; wywołaj add_number
next:
    mov ecx, eax
    jmp exit

add_number:
    add eax, 0x80000000
    ret

exit:

1 użytkowników online, w tym zalogowanych: 0, gości: 1