Assembler, powrót z procedury

Assembler, powrót z procedury
Kordoba
  • Rejestracja:około 5 lat
  • Ostatnio:około 6 godzin
  • Postów:151
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

Kopiuj
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!

RI
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:40
1

Jak jest teraz

Kopiuj
    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?

Kopiuj
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.

Kordoba
  • Rejestracja:około 5 lat
  • Ostatnio:około 6 godzin
  • Postów:151
0

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

RI
Niestety musisz inaczej zaprojektować kod.
RI
  • Rejestracja:około 5 lat
  • Ostatnio:około 5 lat
  • Postów:40
2

Dla Twojego przykładu:

Kopiuj
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:
Kordoba
dzięki wielkie. dzięki twoim wskazówkom udało się w końcu zrobić to mnożenie dwóch liczb 128 bitówych. zapewnie bardzo naiwnie i nieoptymalnie, ale działa :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.