在collat​​z猜想计划中将核心倾倒在大会中

时间:2015-12-13 21:48:34

标签: assembly

我想在汇编中实现Collat​​z猜想。它的算法应该计算在EAX的值变为1之前需要多少步。但是我有问题,当我试图执行时,控制台显示" Core Dumped"或者冻结。我在EBX中存储了一些步骤。我通过push eax call f pop eax在程序的主要部分中调用此函数。

f:
mov eax, [esp+4]
cmp eax,1
je end
AND eax, 0x01
jz parity
    inc ebx
    imul eax,3
    inc eax
parity:
    inc ebx
    shr eax,1
    jmp f
end:

mov eax,ebx

ret

请帮忙

更新

解决。

  f:
 mov eax, [esp+4]
 mov ebx, 1         ;In case EAX=1 !!!
jjump:
 cmp eax,1
 je end
 test eax, 0x01
 jz parity
 inc ebx
 imul eax,3
 inc eax
 jmp jjump
parity:
 inc ebx
 shr eax,1
 jmp jjump
end:
 mov eax,ebx
 ret

1 个答案:

答案 0 :(得分:3)

你写了一个无限循环。如果[esp + 4]的值不是1,你总是跳回标签 f 并重新读取相同的值!

将标签放在此处:

f:
mov eax, [esp+4]
f_:

您应该test eax, 1而不是and,因为后者会破坏您想继续使用的值。

两种可能性都必须跳转到额外标签 jjump

 jmp  jjump
parity:

整个代码变为:

f:
 mov eax, [esp+4]
 mov ebx, 1         ;In case EAX=1 !!!
jjump:
 cmp eax,1
 je end
 test eax, 0x01
 jz parity
 inc ebx
 imul eax,3
 inc eax
 jmp jjump
parity:
 inc ebx
 shr eax,1
 jmp jjump
end:
 mov eax,ebx
 ret