2017-02-10 64 views
0

我们有一个任务,我们必须在64位nasm汇编中编写collat​​z猜想,只有13个或更少的命令(包括RET)。现在我们想知道你能减少多少。目前,我们对9
继承人伪码奇偶归一猜想,仅供参考:Collat​​z猜想汇编最短形式

enter image description here

继承人的代码,我们至今。一些注意事项:
我们的导师说我们可以删除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

不要垃圾标签!你的**具体**问题是什么? – Olaf

+2

我投票结束这个问题作为题外话,因为这实际上是更多的“代码高尔夫”问题。 –

+0

@DavidHoelzer啊我从来没有意识到它是不允许的,因为它的技术可以解决。你在哪里推荐这个问题? – nn3112337

回答

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)。

+0

我相信'rax'需要总是增加,所以'adc'是错误的。 – Jester

+0

@Jester哦,我明白了。让我快速纠正这一点。 – fuz

+0

现在看起来没问题。 – Jester