我们有一个任务,我们必须在64位nasm程序集中编写使用13个或更少命令(包括RET)的collatz猜想。现在我们想知道你实际上可以减少多少。我们目前在9 下面是伪代码中的collatz猜想供参考:
这是我们迄今为止的代码。几点说明:
我们的导师说我们可以删除XOR rax,rax因为一些调用约定它已经为零。它在我的电脑上不起作用,所以我把它包括在这里
我知道两个LEA可能是最明显减少的东西,但我们想不出办法,因为* 6似乎是唯一不可能用LEA做的事情。
GLOBAL collatz
SECTION .text
collatz:
XOR rax, rax
.while:
SHR rdi, 1
JNC .even
LEA rdi, [rdi*2+1]
LEA rdi, [rdi*2+rdi+1]
.even:
INC rax
CMP rdi, 1
JA .while
RET
答案 0 :(得分:2)
这有点短:
collatz:
or $-1,%eax
.loop: inc %eax
lea 1(%rdi,%rdi,2),%rsi
shr %rdi
cmovc %rsi,%rdi
jnz .loop
ret
或者,在nasm语法中:
collatz:
or eax,-1
.loop: inc eax
lea rsi,[rdi+rdi*2+1]
shr rdi
cmovc rdi,rsi
jnz .loop
ret
要理解此代码,请密切注意进位标志(CF)和零标志(ZF)。