R_NEW Но в случае с wbinvd количество тактов не проконтролируешь - оно зависит от размера кэша, скорости оперативки и т.д.
R_NEW Ну это к NOP'ам имеет весьма отдаленное отношение, так же как и wbinvd (хотя и не изменяет флаги и регистры). Лучше придумать что-нибудь более приземленное, типа: Code (Text): xchg eax, ebx xchg eax, ebx
На правах оффтопа: Code (Text): CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 CALL $+5 INC EAX RET Этот NOP надо не инлайнить, а вызывать CALL. Бывают рекурсивные процедуры - вызывающие сами себя. А как называется приведённый пример кода?
captain cobalt Кстати прикольный код - чем больше CALL'ов, тем дольше работает, причем время работы растет в геометрической прогрессии...
гм.... а вот серьезно кто нибудь может написать макрос для tasm, чтобы он ставил Nop'ы до заданного align'a. Важно, чтобы команды были БЫСТРЫМИ.
Loger MMX запортит регистры FPU, так как они и регистры MMX разделяют одни и те же физические регистры. _hidden_ Самые быстрые NOP'ы - это NOP'ы (db 90h) Современные процы их распознают и даже не исполняют - только декодируют.
Atlantic Самые быстрые nop'ы в зависимости от требуемого их количества - различные команды. Надо не забывать, что современные процессоры выбирают по 2-3 инструкции за такт, и два или три nop врядли будут пропущены быстрее чем одна длинная инструкция, поскольку один короткий конвеер лучше отдать под цели выравнивания, а уже в следующих приступать к работе.
Atlantic Это какие процы? PIII исполняет так точно, кстати из-за размера "mov r32,r32" будет в 2 раза быстрее 2-х нопов
То что nop'ы якобы не исполняются, это видимо какой-то устойчивый миф Помнится мы с bogrus'ом в какой-то теме это обсуждали и приводили тесты на PIII и PIV - получилось, что это обычные исполняемые мопы в соответсвии с IA-32 (тему не нашел - возможно похоронена вместе с веткой BEGINNERS )
1. invoke InitCommonControls 2. push eax fild dword [esp] fistp dword [esp] pop eax Будет бажить при больших eax ))
bogrus Athlon XP и Athlon 64. Вот цитата: NOP (XCHG EAX, EAX) 90h DirectPath ~0 These instructions have an effective latency as shown. They map to internal NOPs that can be executed at a rate of three per cycle and do not occupy execution resources. Взята из Software Optimization Guide for AMD Athlon™ 64 and AMD Opteron™ Processors (25112.pdf). Там же сказано, что можно к одному NOP'у прицепить кучу префиксов 66h: NOP1 TEXTEQU <DB 090h> NOP2 TEXTEQU <DB 066h,090h> NOP3 TEXTEQU <DB 066h,066h,090h> NOP4 TEXTEQU <DB 066h,066h,066h,090h> NOP5 TEXTEQU <DB 066h,066h,090h,066h,090h> NOP6 TEXTEQU <DB 066h,066h,090h,066h,066h,090h> NOP7 TEXTEQU <DB 066h,066h,066h,090h,066h,066h,090h> NOP8 TEXTEQU <DB 066h,066h,066h,090h,066h,066h,066h,090h> NOP9 TEXTEQU <DB 066h,066h,090h,066h,066h,090h,066h,066h,090h> Так что NOP9 (или даже NOP15) будет самым быстрым NOP'ом add: Не заметил, что там не больше трех 66h перед каждым 90h, хотя у себя проверил Code (Text): db 66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,90h пашет без проблем