Я пытаюсь написать программу, которая начинается с числа, набираемого в консоли, затем она должна выполнить «гипотезу Коллатца» (нечетное число: 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: