2017-02-10 1 views
0

Nous avions une affectation où nous devions écrire la conjecture de collatz dans l'assemblage nasm 64bit avec seulement 13 commandes ou moins (RET inclus). Maintenant, nous nous demandons combien vous pouvez réellement le réduire. Nous sommes actuellement sur 9.
Heres la conjecture Collatz dans le code pseudo pour référence:Conjecture de Collatz dans l'assemblage le plus court

enter image description here

Heres le code que nous avons à ce jour. Quelques notes:
Un tuteur de nous a dit que nous pouvons supprimer le XOR rax, rax en raison de certaines conventions d'appel, il est déjà zéro. Cela ne fonctionne pas sur mon ordinateur, alors je l'ai inclus ici.
Je suis conscient que les deux LEA sont probablement la chose la plus évidente à réduire, mais nous ne pouvons pas penser à un chemin depuis * 6 semble être la seule chose qui est littéralement impossible à faire avec 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

Ne pas spammer les tags! Et quel est votre problème ** spécifique **? – Olaf

+2

Je vote pour clore cette question hors-sujet parce que c'est vraiment plus une question de "code golf". –

+0

@DavidHoelzer ah je ne me rendais pas compte qu'il n'était pas autorisé depuis son techniquement résoluble. Où recommandez-vous de demander cela? – nn3112337

Répondre

2

C'est un peu plus courte:

collatz: 
     or  $-1,%eax 
.loop: inc %eax 
     lea 1(%rdi,%rdi,2),%rsi 
     shr %rdi 
     cmovc %rsi,%rdi 
     jnz .loop 
     ret 

ou, dans la syntaxe nasm:

collatz: 
     or  eax,-1 
.loop: inc eax 
     lea rsi,[rdi+rdi*2+1] 
     shr rdi 
     cmovc rdi,rsi 
     jnz .loop 
     ret 

Pour comprendre ce code, porter une attention particulière à l'indicateur de retenue (CF) et zéro drapeau (ZF).

+0

Je crois que 'rax' doit toujours être incrémenté, donc' adc' est faux. – Jester

+0

@Jester Oh je vois. Laissez-moi corriger cela rapidement. – fuz

+0

Ça va maintenant. – Jester