我想在汇编中实现Collatz猜想。它的算法应该计算在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
答案 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