我尝试编写一个程序,该程序以在控制台中键入的数字开头,然后必须执行“ Collatz猜想”(奇数:n * 3 + 1;偶数:n / 2; { {3}}),并将每个数字写入控制台,直到得到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: