насм - коллатц - петля не ломается как надо - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь написать программу, которая начинается с числа, набираемого в консоли, затем она должна выполнить «гипотезу Коллатца» (нечетное число: n * 3 + 1; четное число: n / 2; https://en.wikipedia.org/wiki/Collatz_conjecture) и записывать каждое число в консоль до тех пор, пока оно не получит 1. После его выполнения он выполняет первую часть (различает четное и нечетное; переходит туда) и печатает правильное число, но после этого продолжает печататьвывести одно и то же число в бесконечный цикл без прерывания (даже если оно уже равно 1). Я думаю, что моя проблема имеет очень простое решение, но я ищу почти весь день и не могу его найти. Пожалуйста, помогите!

global main
extern printf
extern atoi

segment .data
    out: db "%d",10,0
segment .text
main:
    mov eax, esp
    add eax, 8
    mov eax, [eax]      
    add eax, 4
    mov eax, [eax]      
    push eax
    call atoi           
    add esp, 4  ; get the Integer typed in with the executable   
    cmp eax,1
    je one          ; check if the Integer is 1, if so print 1

loop:
    cmp eax,1
    je end          ; break out of the loop and end if eax is 1
    mov ebx,eax
    shr ebx,1       ; check if eax is odd or even with carry flag
    jc odd          
    jnc even
    jmp end

even:
    shr eax,1       ; eax/2
    push eax
    push out
    call printf     
    add esp,8       ; print eax
    jmp loop

odd:
    imul eax,3      ; eax+3 +1
    inc eax
    push eax        
    push out
    call printf
    add esp,8       ; print eax
    jmp loop    

one:
    push eax
    push out
    call printf
    add esp,8       ; print eax

end:
...