Собираем коллекцию NOP'ов

Тема в разделе "WASM.ASSEMBLER", создана пользователем Atlantic, 22 июн 2005.

  1. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    А может кто-то добивается именно этой цели: побольше пустых тактов? Например, организует задержку.
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Да, D4/D5 хреновый вариант в категории <2 команды>.





    loop $+2 ; loopcc

    lea ecx, [ecx+1]
     
  3. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    R_NEW

    Но в случае с wbinvd количество тактов не проконтролируешь - оно зависит от размера кэша, скорости оперативки и т.д.
     
  4. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Ещё одна команда invlpg.
     
  5. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    R_NEW

    Ну это к NOP'ам имеет весьма отдаленное отношение, так же как и wbinvd (хотя и не изменяет флаги и регистры). Лучше придумать что-нибудь более приземленное, типа:


    Код (Text):
    1. xchg eax, ebx
    2. xchg eax, ebx
     
  6. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    Нашел еще не паханное поле (SSE):
    Код (Text):
    1.     xorps xmm0,xmm1
    2.     xorps xmm0,xmm1
     
  7. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    На правах оффтопа:
    Код (Text):
    1. CALL $+5
    2. CALL $+5
    3. CALL $+5
    4. CALL $+5
    5. CALL $+5
    6. CALL $+5
    7. CALL $+5
    8. CALL $+5
    9. CALL $+5
    10. CALL $+5
    11. CALL $+5
    12. CALL $+5
    13. CALL $+5
    14. CALL $+5
    15. CALL $+5
    16. CALL $+5
    17. CALL $+5
    18. CALL $+5
    19. CALL $+5
    20. CALL $+5
    21. CALL $+5
    22. CALL $+5
    23. CALL $+5
    24. CALL $+5
    25. CALL $+5
    26. CALL $+5
    27. CALL $+5
    28. CALL $+5
    29. CALL $+5
    30. CALL $+5
    31. CALL $+5
    32. CALL $+5
    33. INC EAX
    34. RET
    Этот NOP надо не инлайнить, а вызывать CALL.



    Бывают рекурсивные процедуры - вызывающие сами себя.

    А как называется приведённый пример кода? ;)
     
  8. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    captain cobalt

    Лестница рекурсий :)
     
  9. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    captain cobalt

    Самосебямногоразвызывающаянерекурсивная процедура :)



    А причем здесь INC EAX?
     
  10. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    captain cobalt



    Кстати прикольный код - чем больше CALL'ов, тем дольше работает, причем время работы растет в геометрической прогрессии...
     
  11. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
    MMX:

    pxor mm0,mm1

    pxor mm0,mm1
     
  12. Black_mirror

    Black_mirror Active Member

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

    fdecstp
     
  13. _hidden_

    _hidden_ New Member

    Публикаций:
    0
    Регистрация:
    10 май 2005
    Сообщения:
    30
    Адрес:
    Russia
    гм.... а вот серьезно кто нибудь может написать макрос для tasm, чтобы он ставил Nop'ы до заданного align'a. Важно, чтобы команды были БЫСТРЫМИ.
     
  14. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    Loger

    MMX запортит регистры FPU, так как они и регистры MMX разделяют одни и те же физические регистры.

    _hidden_

    Самые быстрые NOP'ы - это NOP'ы (db 90h) :) Современные процы их распознают и даже не исполняют - только декодируют.
     
  15. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Atlantic

    Самые быстрые nop'ы в зависимости от требуемого их количества - различные команды. Надо не забывать, что современные процессоры выбирают по 2-3 инструкции за такт, и два или три nop врядли будут пропущены быстрее чем одна длинная инструкция, поскольку один короткий конвеер лучше отдать под цели выравнивания, а уже в следующих приступать к работе.
     
  16. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Atlantic




    Это какие процы? PIII исполняет так точно, кстати из-за размера "mov r32,r32" будет в 2 раза быстрее 2-х нопов
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    То что nop'ы якобы не исполняются, это видимо какой-то устойчивый миф

    Помнится мы с bogrus'ом в какой-то теме это обсуждали и приводили тесты на PIII и PIV - получилось, что это обычные исполняемые мопы в соответсвии с IA-32

    (тему не нашел - возможно похоронена вместе с веткой BEGINNERS )
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    1. invoke InitCommonControls :)



    2. push eax

    fild dword [esp]

    fistp dword [esp]

    pop eax



    Будет бажить при больших eax :)))
     
  19. Black_mirror

    Black_mirror Active Member

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

    А почему оно должно бажить? Точность вычислений разве на операции загрузки/сохранения влияет?
     
  20. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    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, хотя у себя проверил
    Код (Text):
    1.     db 66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,66h,90h




    пашет без проблем