【发布时间】:2017-06-28 04:48:53
【问题描述】:
我们有一个任务,我们必须在 64 位 nasm 汇编中编写 collatz 猜想,只有 13 个或更少的命令(包括 RET)。现在我们想知道你实际上可以减少多少。我们目前在 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
【问题讨论】:
-
不要垃圾标签!您的具体问题是什么?
-
我投票结束这个问题,因为这更像是一个“代码高尔夫”问题。
-
@DavidHoelzer 啊我没有意识到这是不允许的,因为它在技术上是可以解决的。你建议在哪里问这个?
-
“我们的一位导师说我们可以删除 XOR rax,rax 因为某些调用约定,它已经为零了。” 不,完全错误。在没有调用约定的情况下,
RAX保证为 0。