2017-02-10 23 views
0

У нас было задание, в котором нам пришлось написать гипотезу collatz в 64-битной сборке nasm с 13 командами или меньше (включен RET). Теперь мы задаемся вопросом, насколько вы действительно можете его уменьшить. Мы в настоящее время 9
Херес Коллатца гипотеза в псевдокоде для справки:Конкуренция Collatz в кратчайшей форме сборки

enter image description here

Heres код, который мы имеем до сих пор. Несколько примечаний:
Наставник из нас сказал, что мы можем удалить 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 ah Я не понимал, что это не разрешено, так как его техническая разрешимость. Где вы рекомендуете это задавать? – 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

 Смежные вопросы

  • Нет связанных вопросов^_^