наноупражнение: LEA power

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 7 дек 2005.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Не используя команды MUL(IMUL), написать минимальный по числу команд код, осуществляющий умножение регистра EAX на одну из следующих констант:



    23 33 37 39 41 53 52 54 56

    57 58 61 65 67 68 70 71 77

    78 79 83 85 87 89 90 91



    Результат желательно чтобы был в EAX, но если это увеличивает число команд, то можно в любом другом регистре.

    Если есть несколько различных минимальных вариантов (с различными именами регистров - не считаются различными) написать все варианты.

    Более чем для 5 констант код здесь не пишите, дайте другим подумать 8)
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    23:
    Код (Text):
    1. lea edx,[eax + eax*8]
    2. lea edx,[eax + edx*2]
    3. lea eax,[edx + eax*4]


    Или так:
    Код (Text):
    1. lea edx,[eax + eax*8]
    2. lea eax,[eax + eax*4]
    3. lea eax,[eax + edx*2]
     
  3. Artemy

    Artemy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    48
    Адрес:
    Russia
    ;fasm. для 23
    Код (Text):
    1.  
    2. mov edx, eax
    3. lea eax, [8*eax]
    4. lea eax, [eAx + 2*eax]
    5. sub eax, edx
    6.  
     
  4. Artemy

    Artemy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    48
    Адрес:
    Russia
    ну на то он и Паладин :)
     
  5. _G3

    _G3 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    41
    Адрес:
    Russia
    еще для 23:



    lea ebx,[eax+eax*8]

    shl eax,5

    sub eax,ebx



    lea ebx,[eax*8]

    lea ebx,[ebx+ebx*2]

    sub ebx,eax
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Для любой из констант в 5 инструкции :)


    Код (Text):
    1.     mov     ecx,const
    2.     mov     edx,ecx
    3.     xor     eax,eax
    4. @@: add     eax,edx
    5.     loopnz  @B
     
  7. _G3

    _G3 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    41
    Адрес:
    Russia
    cresta

    это больше похоже на возведение константы в квадрат ;)
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Ой, длин, чёта я пива много сегодня принял :-/



    Вот так парвильно:


    Код (Text):
    1.                 mov     ecx,const
    2.                 mov     edx,eax
    3.             @@: add     eax,edx
    4.                 loopnz  @B
    5.                 sub     eax,edx
     
  9. _G3

    _G3 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    41
    Адрес:
    Russia
    cresta

    А почему loopnz, а не loop?

    Допустим eax=10000000h, const=23.

    У тебя будет - F0000000h, а должно быть 70000000h
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    91:


    Код (Text):
    1.                 lea     ecx,[eax+eax*8]
    2.                 lea     edx,[ecx+ecx*8]
    3.                 lea     edx,[edx+ecx]
    4.                 add     eax,edx




    _G3

    Ты тоже пиво пил?

    Должно быть 17000000h. Что собственно мой цикл и показывает :)
     
  11. _G3

    _G3 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    41
    Адрес:
    Russia
    cresta

    Не пил, а пью прямо сейчас ;)

    Я опечатался при eax=10000000h, а не 1000000h
     
  12. masquer

    masquer wasm.ru

    Публикаций:
    0
    Регистрация:
    13 сен 2002
    Сообщения:
    890
    Адрес:
    Николаев
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    _G3



    Это нечестно! Black_mirror

    не оговаривал, что должно быть в случае переполнения.
     
  14. _G3

    _G3 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    41
    Адрес:
    Russia
    91:



    lea ebx,[eax+8*eax]

    lea ebx,[ebx+4*ebx]

    lea eax,[eax+2*ebx]
     
  15. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    65:


    Код (Text):
    1.                 lea     ecx,[eax*8]
    2.                 lea     eax,[eax+ecx*8]
     
  16. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    masquer

    Ну вот, взял и всё развлечение испортил 8(

    All

    Не ходите туда, там вас плохому научат 8)

    Если же вы там уже были и успели всё запомнить, то поищите другие варианты.



    cresta

    Цикл в 5 инструкций проигрывает минимальному варианту для любой из констант. Про скорость я вообще не говорю. А на переполнение можно спокойно забить.
     
  17. _G3

    _G3 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    41
    Адрес:
    Russia
    Есть предложение взять большое число, которого нет в тех таблицах.

    К примеру 876341
     
  18. Artemy

    Artemy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    48
    Адрес:
    Russia
    Есть предложение взять 512-битное число и перенести тему в криптографию :)
     
  19. _G3

    _G3 New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    41
    Адрес:
    Russia
    Artemy

    Жжешь ;)

    Кстати число действительно простое ;)
     
  20. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    У меня немножко завалялось, правда под константы попроще
    Код (Text):
    1. ;===================================================================== =
    2.             add     eax,eax         ; eax*2
    3.             lea     eax,[eax*2+eax] ; eax*3
    4.             shl     eax,2           ; eax*4
    5.             lea     eax,[eax*4+eax] ; eax*5
    6.             shl     eax,3           ; eax*8
    7.             lea     eax,[eax*8+eax] ; eax*9
    8.             shl     eax,4           ; eax*16
    9.             shl     eax,5           ; eax*32
    10. ;===================================================================== =
    11.             add     eax,eax         ; eax*2                          *6
    12.             lea     eax,[eax*2+eax] ; eax*2*2 + eax*2
    13. ;===================================================================== =
    14.             lea     ecx,[eax*8+eax] ; eax*9                         *17
    15.             lea     eax,[eax*8+ecx] ; eax*9 + eax*8
    16. ;===================================================================== =
    17.             lea     ecx,[eax*8+eax] ; eax*9                         *18
    18.             lea     ecx,[eax*8+ecx] ; eax*9 + eax*8
    19.             add     eax,ecx         ; eax*9 + eax*8 + eax*1
    20. ;===================================================================== =
    21.             lea     ecx,[eax*8+eax] ; eax*9                         *26
    22.             lea     ecx,[eax*8+ecx] ; eax*9 + eax*8
    23.             lea     ecx,[eax*8+ecx] ; eax*9 + eax*8 + eax*8
    24.             add     eax,ecx         ; eax*9 + eax*8 + eax*8 + eax*1
    25. ;===================================================================== =
    26.             mov     ecx,eax         ;                               *31
    27.             shl     eax,5           ; eax*32
    28.             sub     eax,ecx         ; eax*32 - eax*1
    29. ;===================================================================== =
    30.             mov     ecx,eax         ;                               *33
    31.             shl     eax,5
    32.             add     eax,ecx
    33. ;===================================================================== =
    34.             lea     ecx,[eax*4+eax] ;                               *37
    35.             shl     eax,5
    36.             add     eax,ecx
    37. ;===================================================================== =
    38.             shl     eax,5           ; eax*32                      *2596
    39.             lea     ecx,[eax*8+eax] ; eax*32*9
    40.             lea     eax,[ecx*8+ecx] ; eax*32*9*8 + eax*32*9
    41. ;======================================================================