Оптимизация

Тема в разделе "WASM.ASSEMBLER", создана пользователем dgs, 28 янв 2009.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Привет всем, в общем у меня несколько вопросов по оптимизации кода для интеловского пентиума, пишу я в данный момент на fasm'e...

    1. В каких случаях надо делать align?

    2. Есть ли какие ни будь отличительные знаки по котором можно точно сказать, что инструкция спаривается?

    3. Стоит ли в наше время быстрых ПК использовать NOP?

    4. Все говорят что лучше отказаться от mov reg, 0 но если мне нужна скорость и по сравнению с программами высокого уровня даже используя самые длинные опкоды моя прога будет намного меньше написанной на Delphi или С:
    Код (Text):
    1.     ;XOR = 466666616 or 466666620 clocks
    2.     ;SUB = 466666616 or 466666620 clocks
    3.     ;AND = 444680876 or 444680880 clocks
    4.     ;MOV = 300000005 or 300000009 clocks
    5. ... Взято с http://board.flatassembler.net/topic.php?t=2530 ...
    Или все таки есть какие подводные камни?

    5. Насколько уместней вызывать так процедуры:
    Код (Text):
    1. ...
    2.    xor    eax, eax
    3.    push   len_data
    4.    push   buffer
    5.    push   eax
    6.    push   filename
    7.    call    [_lcreate]
    8.    push   eax
    9.    call     [_lwrite]
    10. ...
    чем используя стандартный вызов:
    Код (Text):
    1. ...
    2.    invoke _lcreate, filename, 0
    3.    invoke _lwrite, eax, buffer, len_data
    4. ...
    Заранее благодарю...
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    1) align данных надо делать когда что-что читается в долгом цикле, что б адрес попадал в начало cache line

    2), 3) зависит от проца

    5) макро развернётся в именно в тот код, кроме "xor"

    P.S. меряй в VTune
     
  3. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Макро развернется так, следовательно push друг с другом спариваются, а call разрывает связь, вывод первоначальный вариант будет быстрей:
    Код (Text):
    1. ...
    2.    push 0
    3.    push filename
    4.    call [_lcreate]
    5.  
    6.    push len_data
    7.    push buffer
    8.    push eax
    9.    call [_lwrite]
    10. ...
    Втюне сейчас ищу в нете...
     
  4. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Меньшие по размеру инструкции быстрее декодируются.

    Кроме NOP существует ещё несколько инструкций для выравнивания.

    Код (Text):
    1. Длина  Опкод  Мнемоника
    2. 2   DB 08Bh,0C0h    MOV EAX, EAX
    3. 2   DB 08Bh,0DBh    MOV EBX, EBX
    4. 2   DB 08Bh,0C9h    MOV ECX, ECX
    5. 2   DB 08Bh,0D2h    MOV EDX, EDX
    6. 2   DB 08Bh,0F6h    MOV ESI, ESI
    7. 2   DB 08Bh,0FFh    MOV EDI, EDI
    8. 2   DB 08Bh,0E4h    MOV ESP, ESP
    9. 2   DB 08Bh,0EDh    MOV EBP, EBP
    10. 3   DB 08Dh,004h,020h   LEA EAX, [EAX]
    11. 3   DB 08Dh,01Ch,023h   LEA EBX, [EBX]
    12. 3   DB 08Dh,00Ch,021h   LEA ECX, [ECX]
    13. 3   DB 08Dh,014h,022h   LEA EDX, [EDX]
    14. 3   DB 08Dh,024h,024h   LEA ESI, [ESI]
    15. 3   DB 08Dh,034h,026h   LEA EDI, [EDI]
    16. 3   DB 08Dh,03Ch,027h   LEA ESP, [ESP]
    17. 3   DB 08Dh,06Dh,000h   LEA EBP, [EBP]
    18. 4   DB 08Dh,044h,020h,000h  LEA EAX, [EAX+00]
    19. 4   DB 08Dh,05Ch,023h,000h  LEA EBX, [EBX+00]
    20. 4   DB 08Dh,04Ch,021h,000h  LEA ECX, [ECX+00]
    21. 4   DB 08Dh,054h,022h,000h  LEA EDX, [EDX+00]
    22. 4   DB 08Dh,064h,024h,000h  LEA ESI, [ESI+00]
    23. 4   DB 08Dh,074h,026h,000h  LEA EDI, [EDI+00]
    24. 4   DB 08Dh,07Ch,027h,000h  LEA ESP, [ESP+00]
    25. 5   DB 08Dh,044h,020h,000h,090h LEA EAX, [EAX+00] ;NOP
    26. 5   DB 08Dh,05Ch,023h,000h,090h LEA EBX, [EBX+00] ;NOP
    27. 5   DB 08Dh,04Ch,021h,000h,090h LEA ECX, [ECX+00] ;NOP
    28. 5   DB 08Dh,054h,022h,000h,090h LEA EDX, [EDX+00];NOP
    29. 5   DB 08Dh,064h,024h,000h,090h LEA ESI, [ESI+00] ;NOP
    30. 5   DB 08Dh,074h,026h,000h,090h LEA EDI, [EDI+00] ;NOP
    31. 5   DB 08Dh,07Ch,027h,000h,090h LEA ESP, [ESP+00] ;NOP
    32. 6   DB 08Dh,080h,0,0,0,0    LEA EAX, [EAX+00000000]
    33. 6   DB 08Dh,09Bh,0,0,0,0    LEA EBX, [EBX+00000000]
    34. 6   DB 08Dh,089h,0,0,0,0    LEA ECX, [ECX+00000000]
    35. 6   DB 08Dh,092h,0,0,0,0    LEA EDX, [EDX+00000000]
    36. 6   DB 08Dh,0B6h,0,0,0,0    LEA ESI, [ESI+00000000]
    37. 6   DB 08Dh,0BFh,0,0,0,0    LEA EDI, [EDI+00000000]
    38. 6   DB 08Dh,0ADh,0,0,0,0    LEA EBP, [EBP+00000000]
    39. 7   DB 08Dh,004h,005h,0,0,0,0   LEA EAX, [EAX*1+00000000]
    40. 7   DB 08Dh,01Ch,01Dh,0,0,0,0   LEA EBX, [EBX*1+00000000]
    41. 7   DB 08Dh,00Ch,00Dh,0,0,0,0   ;LEA ECX, [ECX*1+00000000]
    42. 7   DB 08Dh,014h,015h,0,0,0,0   LEA EDX, [EDX*1+00000000]
    43. 7   DB 08Dh,034h,035h,0,0,0,0   LEA ESI, [ESI*1+00000000]
    44. 7   DB 08Dh,03Ch,03Dh,0,0,0,0   LEA EDI, [EDI*1+00000000]
    45. 7   DB 08Dh,02Ch,02Dh,0,0,0,0   LEA EBP, [EBP*1+00000000]
    46. 8   DB 08Dh,004h,005h,0,0,0,0,90h   LEA EAX, [EAX*1+00000000] ;NOP
    47. 8   DB 08Dh,01Ch,01Dh,0,0,0,0,90h   LEA EBX, [EBX*1+00000000] ;NOP
    48. 8   DB 08Dh,00Ch,00Dh,0,0,0,0,90h   LEA ECX, [ECX*1+00000000] ;NOP
    49. 8   DB 08Dh,014h,015h,0,0,0,0,90h   LEA EDX, [EDX*1+00000000] ;NOP
    50. 8   DB 08Dh,034h,035h,0,0,0,0,90h   LEA ESI, [ESI*1+00000000] ;NOP
    51. 8   DB 08Dh,03Ch,03Dh,0,0,0,0,90h   LEA EDI, [EDI*1+00000000] ;NOP
    52. 8   DB 08Dh,02Ch,02Dh,0,0,0,0,90h   LEA EBP, [EBP*1+00000000] ;NOP
    53. 9   DB 0EBh,007h,90h,90h,90h,90h,90h,90h,90h    JMP
     
  5. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    Если у тебя вызов ф-ции (или тем более системный вызов) то манипуляции с push не будут заметны на его фоне.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    dgs
    в поиске по форуму запроси все посты от leo и читай как учебник ;)
     
  7. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    ok... спасибо за подсказку...
     
  8. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    dgs
    А ещё поищи Black_Mirror и The Svin.

    Добавлено:
    В разделе WASM.A&O
     
  9. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Однако очень хорошо... Спасибо всем за помощь!