大会最短形式的Collat​​z猜想

时间:2017-02-10 00:00:34

标签: assembly 64-bit nasm

我们有一个任务,我们必须在64位nasm程序集中编写使用13个或更少命令(包括RET)的collat​​z猜想。现在我们想知道你实际上可以减少多少。我们目前在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

1 个答案:

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