Я всегда думал, что префикс rep употребим только с stos, movs и scas, а тут такое: Код (Text): .text:004010F8 __security_check_cookie proc near ; CODE XREF: KMPSearch+97p .text:004010F8 ; DATA XREF: _except_handler4+10o .text:004010F8 cmp ecx, __security_cookie .text:004010FE jnz short loc_401102 .text:00401100 rep retn .text:00401102 ; --------------------------------------------------------------------------- .text:00401102 .text:00401102 loc_401102: ; CODE XREF: __security_check_cookie+6j .text:00401102 jmp __report_gsfailure .text:00401102 __security_check_cookie endp С какой радости? ida это нормально распознает, olly не распознает, но код выполняет.
wsd ага, толкьо этот мусор я в последнее время наблюдаю практически во всех ехеках, компилённых студией нэт. странный какой то криптор.
katrus Машина x86. t00x Т.е., как я понял, сразу после jcc будет стоять 3Eh если переход нежелателен, и 2Eh - наоборот. Но ведь repcc это F2h и F3h? Such use may cause unpredictable behavior.
KeSqueer 1) до Jcc - тогда префиксы будут интерпретироваться для предсказания? перехода (по умолчанию это префиксы для сегментов - DS, CS); 2) AFAIK использование остальных префиксов не по прямому назначению (как 2EH, 3EH) официально не описано.
да, интересно... Но ведь F2, F3 префиксы рулят со строковыми инструкцыями и работают как loop/loopcc; Как они влияют на retn - етоже безусловный переход... А что там за код если не секрет? Вот напр. используй Hiev или w32dasm - дают опкроды и инструкции сразу.
знаю что в пне 4 появились инструкции которые влияют на переходы, то есть ПЕРЕД переходом ставится префикс, он влияет на буфер команд. Ау ! а ну напишите что это за мулька такая?? dec ecx ret это оно? я правильно всосал? ) здраствуйте, это не автоответчик, я пылесос, говорите по медленее, я сегодня туго всасываю.
Между прочим профиксы повторения можно куда угодна пихать - если они не имеют смысл они пропускаются ну и плюсом предсказание переходов.
Читаем документацию, цитаты из которой 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'- недокуметировано.
Но ведь при ecx == 0 retn не должно выполниться? Тогда можно понимать конструкцию Код (Text): rep retn как: Код (Text): test ecx, ecx jnz go_next retn go_next: Но в дебаггере выполняется - не пойму почему...
NickLion Префикс rep работает только со строковыми функций, в остальных слачаях процессором игнорируется. Здесь этот префикс стоит по недокументированным причинам.
НАШЕЛ *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