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

Discussion in 'WASM.ASSEMBLER' started by KeSqueer, Oct 2, 2007.

  1. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    Я всегда думал, что префикс rep употребим только с stos, movs и scas, а тут такое:
    Code (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

    Blog Posts:
    0
    Joined:
    Aug 8, 2007
    Messages:
    2,824
    Просто в этом случае это ничего не значащий мусор...
    мож это какой криптор поработал(разбавил) :)
     
  3. k3internal

    k3internal New Member

    Blog Posts:
    0
    Joined:
    Jan 11, 2007
    Messages:
    607
    wsd
    ага, толкьо этот мусор я в последнее время наблюдаю практически во всех ехеках, компилённых студией нэт. странный какой то криптор.
     
  4. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    msvc 2005. Для выравнивания это не может служить?
     
  5. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    KeSqueer
    тогда уж был бы ноп.. или очень любимые студией вариации lea ecx,[ecx]
     
  6. katrus

    katrus New Member

    Blog Posts:
    0
    Joined:
    Mar 7, 2007
    Messages:
    612
    Поищи в google. Это определенная техника связанная с branch prediction на х64 архитектурах
     
  7. t00x

    t00x New Member

    Blog Posts:
    0
    Joined:
    Feb 15, 2007
    Messages:
    1,921
    AFAIK на 32-х разрядном коде увеличивает время выполнения
     
  8. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    katrus
    Машина x86.

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

    t00x New Member

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

    twgt New Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    KeSqueer
    МБ аналог
    Code (Text):
    1. dec ecx
    2. ret
     
  11. 0136

    0136 New Member

    Blog Posts:
    0
    Joined:
    Apr 19, 2007
    Messages:
    112
    привет, я так и не понял чем это всё закончилось :)))
    А ну ка, обьясните ка :)
     
  12. Mi256

    Mi256 New Member

    Blog Posts:
    0
    Joined:
    Sep 24, 2007
    Messages:
    116
    да, интересно...

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

    0136 New Member

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

    FatMoon New Member

    Blog Posts:
    0
    Joined:
    Nov 28, 2002
    Messages:
    954
    Location:
    Russia
    никакой это не "dec ecx" - префикс без строковых комманд НЕ изменяет ecx.
     
  15. Mental_Mirror

    Mental_Mirror New Member

    Blog Posts:
    0
    Joined:
    May 7, 2007
    Messages:
    431
    Между прочим профиксы повторения можно куда угодна пихать - если они не имеют смысл они пропускаются ну и плюсом предсказание переходов.
     
  16. 0136

    0136 New Member

    Blog Posts:
    0
    Joined:
    Apr 19, 2007
    Messages:
    112
    Кто то может внятно обьяснить ситуацию???
     
  17. asmfan

    asmfan New Member

    Blog Posts:
    0
    Joined:
    Jul 10, 2006
    Messages:
    1,004
    Location:
    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 А вам зачем

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

    KeSqueer Сергей

    Blog Posts:
    0
    Joined:
    Jul 19, 2007
    Messages:
    1,183
    Location:
    Москва
    NickLion
    Префикс rep работает только со строковыми функций, в остальных слачаях процессором игнорируется. Здесь этот префикс стоит по недокументированным причинам.
     
  20. NickLion

    NickLion А вам зачем

    Blog Posts:
    0
    Joined:
    Sep 19, 2006
    Messages:
    22
    Location:
    Ищите
    НАШЕЛ *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