nasm-Collat​​z-循环不会中断,

时间:2018-12-04 18:56:18

标签: nasm collatz

我尝试编写一个程序,该程序以在控制台中键入的数字开头,然后必须执行“ Collat​​z猜想”(奇数: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:

0 个答案:

没有答案