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

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

  1. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    Я всегда думал, что префикс 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
    Просто в этом случае это ничего не значащий мусор...
    мож это какой криптор поработал(разбавил) :)
     
  3. k3internal

    k3internal New Member

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

    KeSqueer Сергей

    Blog Posts:
    0
    msvc 2005. Для выравнивания это не может служить?
     
  5. wasm_test

    wasm_test wasm test user

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

    katrus New Member

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

    t00x New Member

    Blog Posts:
    0
    AFAIK на 32-х разрядном коде увеличивает время выполнения
     
  8. KeSqueer

    KeSqueer Сергей

    Blog Posts:
    0
    katrus
    Машина x86.

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

    t00x New Member

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

    twgt New Member

    Blog Posts:
    0
    KeSqueer
    МБ аналог
    Code (Text):
    1. dec ecx
    2. ret
     
  11. 0136

    0136 New Member

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

    Mi256 New Member

    Blog Posts:
    0
    да, интересно...

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

    0136 New Member

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

    FatMoon New Member

    Blog Posts:
    0
    никакой это не "dec ecx" - префикс без строковых комманд НЕ изменяет ecx.
     
  15. Mental_Mirror

    Mental_Mirror New Member

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

    0136 New Member

    Blog Posts:
    0
    Кто то может внятно обьяснить ситуацию???
     
  17. asmfan

    asmfan New Member

    Blog Posts:
    0
    Читаем документацию, цитаты из которой 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
    Но ведь при 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
    NickLion
    Префикс rep работает только со строковыми функций, в остальных слачаях процессором игнорируется. Здесь этот префикс стоит по недокументированным причинам.
     
  20. NickLion

    NickLion А вам зачем

    Blog Posts:
    0
    НАШЕЛ *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