Привет всем, в общем у меня несколько вопросов по оптимизации кода для интеловского пентиума, пишу я в данный момент на fasm'e... 1. В каких случаях надо делать align? 2. Есть ли какие ни будь отличительные знаки по котором можно точно сказать, что инструкция спаривается? 3. Стоит ли в наше время быстрых ПК использовать NOP? 4. Все говорят что лучше отказаться от mov reg, 0 но если мне нужна скорость и по сравнению с программами высокого уровня даже используя самые длинные опкоды моя прога будет намного меньше написанной на Delphi или С: Code (Text): ;XOR = 466666616 or 466666620 clocks ;SUB = 466666616 or 466666620 clocks ;AND = 444680876 or 444680880 clocks ;MOV = 300000005 or 300000009 clocks ... Взято с http://board.flatassembler.net/topic.php?t=2530 ... Или все таки есть какие подводные камни? 5. Насколько уместней вызывать так процедуры: Code (Text): ... xor eax, eax push len_data push buffer push eax push filename call [_lcreate] push eax call [_lwrite] ... чем используя стандартный вызов: Code (Text): ... invoke _lcreate, filename, 0 invoke _lwrite, eax, buffer, len_data ... Заранее благодарю...
1) align данных надо делать когда что-что читается в долгом цикле, что б адрес попадал в начало cache line 2), 3) зависит от проца 5) макро развернётся в именно в тот код, кроме "xor" P.S. меряй в VTune
Макро развернется так, следовательно push друг с другом спариваются, а call разрывает связь, вывод первоначальный вариант будет быстрей: Code (Text): ... push 0 push filename call [_lcreate] push len_data push buffer push eax call [_lwrite] ... Втюне сейчас ищу в нете...
Меньшие по размеру инструкции быстрее декодируются. Кроме NOP существует ещё несколько инструкций для выравнивания. Code (Text): Длина Опкод Мнемоника 2 DB 08Bh,0C0h MOV EAX, EAX 2 DB 08Bh,0DBh MOV EBX, EBX 2 DB 08Bh,0C9h MOV ECX, ECX 2 DB 08Bh,0D2h MOV EDX, EDX 2 DB 08Bh,0F6h MOV ESI, ESI 2 DB 08Bh,0FFh MOV EDI, EDI 2 DB 08Bh,0E4h MOV ESP, ESP 2 DB 08Bh,0EDh MOV EBP, EBP 3 DB 08Dh,004h,020h LEA EAX, [EAX] 3 DB 08Dh,01Ch,023h LEA EBX, [EBX] 3 DB 08Dh,00Ch,021h LEA ECX, [ECX] 3 DB 08Dh,014h,022h LEA EDX, [EDX] 3 DB 08Dh,024h,024h LEA ESI, [ESI] 3 DB 08Dh,034h,026h LEA EDI, [EDI] 3 DB 08Dh,03Ch,027h LEA ESP, [ESP] 3 DB 08Dh,06Dh,000h LEA EBP, [EBP] 4 DB 08Dh,044h,020h,000h LEA EAX, [EAX+00] 4 DB 08Dh,05Ch,023h,000h LEA EBX, [EBX+00] 4 DB 08Dh,04Ch,021h,000h LEA ECX, [ECX+00] 4 DB 08Dh,054h,022h,000h LEA EDX, [EDX+00] 4 DB 08Dh,064h,024h,000h LEA ESI, [ESI+00] 4 DB 08Dh,074h,026h,000h LEA EDI, [EDI+00] 4 DB 08Dh,07Ch,027h,000h LEA ESP, [ESP+00] 5 DB 08Dh,044h,020h,000h,090h LEA EAX, [EAX+00] ;NOP 5 DB 08Dh,05Ch,023h,000h,090h LEA EBX, [EBX+00] ;NOP 5 DB 08Dh,04Ch,021h,000h,090h LEA ECX, [ECX+00] ;NOP 5 DB 08Dh,054h,022h,000h,090h LEA EDX, [EDX+00];NOP 5 DB 08Dh,064h,024h,000h,090h LEA ESI, [ESI+00] ;NOP 5 DB 08Dh,074h,026h,000h,090h LEA EDI, [EDI+00] ;NOP 5 DB 08Dh,07Ch,027h,000h,090h LEA ESP, [ESP+00] ;NOP 6 DB 08Dh,080h,0,0,0,0 LEA EAX, [EAX+00000000] 6 DB 08Dh,09Bh,0,0,0,0 LEA EBX, [EBX+00000000] 6 DB 08Dh,089h,0,0,0,0 LEA ECX, [ECX+00000000] 6 DB 08Dh,092h,0,0,0,0 LEA EDX, [EDX+00000000] 6 DB 08Dh,0B6h,0,0,0,0 LEA ESI, [ESI+00000000] 6 DB 08Dh,0BFh,0,0,0,0 LEA EDI, [EDI+00000000] 6 DB 08Dh,0ADh,0,0,0,0 LEA EBP, [EBP+00000000] 7 DB 08Dh,004h,005h,0,0,0,0 LEA EAX, [EAX*1+00000000] 7 DB 08Dh,01Ch,01Dh,0,0,0,0 LEA EBX, [EBX*1+00000000] 7 DB 08Dh,00Ch,00Dh,0,0,0,0 ;LEA ECX, [ECX*1+00000000] 7 DB 08Dh,014h,015h,0,0,0,0 LEA EDX, [EDX*1+00000000] 7 DB 08Dh,034h,035h,0,0,0,0 LEA ESI, [ESI*1+00000000] 7 DB 08Dh,03Ch,03Dh,0,0,0,0 LEA EDI, [EDI*1+00000000] 7 DB 08Dh,02Ch,02Dh,0,0,0,0 LEA EBP, [EBP*1+00000000] 8 DB 08Dh,004h,005h,0,0,0,0,90h LEA EAX, [EAX*1+00000000] ;NOP 8 DB 08Dh,01Ch,01Dh,0,0,0,0,90h LEA EBX, [EBX*1+00000000] ;NOP 8 DB 08Dh,00Ch,00Dh,0,0,0,0,90h LEA ECX, [ECX*1+00000000] ;NOP 8 DB 08Dh,014h,015h,0,0,0,0,90h LEA EDX, [EDX*1+00000000] ;NOP 8 DB 08Dh,034h,035h,0,0,0,0,90h LEA ESI, [ESI*1+00000000] ;NOP 8 DB 08Dh,03Ch,03Dh,0,0,0,0,90h LEA EDI, [EDI*1+00000000] ;NOP 8 DB 08Dh,02Ch,02Dh,0,0,0,0,90h LEA EBP, [EBP*1+00000000] ;NOP 9 DB 0EBh,007h,90h,90h,90h,90h,90h,90h,90h JMP
Если у тебя вызов ф-ции (или тем более системный вызов) то манипуляции с push не будут заметны на его фоне.