2017-02-10 68 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