Новая для меня инструкция

Тема в разделе "WASM.ASSEMBLER", создана пользователем KeSqueer, 2 окт 2007.

  1. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Я всегда думал, что префикс rep употребим только с stos, movs и scas, а тут такое:
    Код (Text):
    1. .text:004010F8 __security_check_cookie proc near       ; CODE XREF: KMPSearch+97p
    2. .text:004010F8                                         ; DATA XREF: _except_handler4+10o
    3. .text:004010F8                 cmp     ecx, __security_cookie
    4. .text:004010FE                 jnz     short loc_401102
    5. .text:00401100                 rep retn
    6. .text:00401102 ; ---------------------------------------------------------------------------
    7. .text:00401102
    8. .text:00401102 loc_401102:                             ; CODE XREF: __security_check_cookie+6j
    9. .text:00401102                 jmp     __report_gsfailure
    10. .text:00401102 __security_check_cookie endp
    С какой радости?
    ida это нормально распознает, olly не распознает, но код выполняет.
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Просто в этом случае это ничего не значащий мусор...
    мож это какой криптор поработал(разбавил) :)
     
  3. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    wsd
    ага, толкьо этот мусор я в последнее время наблюдаю практически во всех ехеках, компилённых студией нэт. странный какой то криптор.
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    msvc 2005. Для выравнивания это не может служить?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    KeSqueer
    тогда уж был бы ноп.. или очень любимые студией вариации lea ecx,[ecx]
     
  6. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Поищи в google. Это определенная техника связанная с branch prediction на х64 архитектурах
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    AFAIK на 32-х разрядном коде увеличивает время выполнения
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    katrus
    Машина x86.

    t00x
    Т.е., как я понял, сразу после jcc будет стоять 3Eh если переход нежелателен, и 2Eh - наоборот. Но ведь repcc это F2h и F3h? Such use may cause unpredictable
    behavior.
     
  9. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    KeSqueer
    1) до Jcc - тогда префиксы будут интерпретироваться для предсказания? перехода (по умолчанию это префиксы для сегментов - DS, CS);
    2) AFAIK использование остальных префиксов не по прямому назначению (как 2EH, 3EH) официально не описано.
     
  10. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    KeSqueer
    МБ аналог
    Код (Text):
    1. dec ecx
    2. ret
     
  11. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    привет, я так и не понял чем это всё закончилось :)))
    А ну ка, обьясните ка :)
     
  12. Mi256

    Mi256 New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    116
    да, интересно...

    Но ведь F2, F3 префиксы рулят со строковыми инструкцыями и работают как loop/loopcc;
    Как они влияют на retn - етоже безусловный переход... А что там за код если не секрет?
    Вот напр. используй Hiev или w32dasm - дают опкроды и инструкции сразу.
     
  13. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    знаю что в пне 4 появились инструкции которые влияют на переходы, то есть ПЕРЕД переходом ставится префикс, он влияет на буфер команд. Ау ! а ну напишите что это за мулька такая??
    dec ecx
    ret
    это оно? я правильно всосал? :))
    здраствуйте, это не автоответчик, я пылесос, говорите по медленее, я сегодня туго всасываю.
     
  14. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    никакой это не "dec ecx" - префикс без строковых комманд НЕ изменяет ecx.
     
  15. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Между прочим профиксы повторения можно куда угодна пихать - если они не имеют смысл они пропускаются ну и плюсом предсказание переходов.
     
  16. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Кто то может внятно обьяснить ситуацию???
     
  17. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Читаем документацию, цитаты из которой t00x приводил - Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A - Instruction Set Reference, A-M, 2.1.1 Instruction Prefixes.
    А то,что компилеры пихают в бинарь 'rep retn'- недокуметировано.
     
  18. NickLion

    NickLion А вам зачем

    Публикаций:
    0
    Регистрация:
    19 сен 2006
    Сообщения:
    22
    Адрес:
    Ищите
    Но ведь при ecx == 0 retn не должно выполниться? Тогда можно понимать конструкцию
    Код (Text):
    1. rep retn
    как:
    Код (Text):
    1. test ecx, ecx
    2. jnz go_next
    3. retn
    4. go_next:
    Но в дебаггере выполняется - не пойму почему...
     
  19. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    NickLion
    Префикс rep работает только со строковыми функций, в остальных слачаях процессором игнорируется. Здесь этот префикс стоит по недокументированным причинам.
     
  20. NickLion

    NickLion А вам зачем

    Публикаций:
    0
    Регистрация:
    19 сен 2006
    Сообщения:
    22
    Адрес:
    Ищите
    НАШЕЛ *YAHOO*:

    AMD x86-64 processors cannot predict single-byte near RET instructions
    when they are either the target of a branch or immediately preceded by a
    conditional branch. (See section 6.2 in the Athlon 64/Opteron
    optimization guide)

    AMD's recommended solution is to either reorder instructions so that
    this situation does not occur, or use the REP prefix on the RET
    instruction.

    Recent versions of GCC will do this automatically, but glibc contains
    many hand written assembly routines.

    The attached patch changes all (that I found, anyway) relevant RET
    instructions to REP RET.

    Ах, да ссылка: h++p://www.cygwin.com/ml/libc-alpha/2004-12/msg00022.html