Вопрос знатокам. У меня windows 2000 sp4 со всеми заплатками. Сегодня обратил внимание, что функция lstrlen в моей системе использует инструкцию rep scasb без проверки/установки флага FD. Вопрос: в соглашении вызова stdcall как-то оговаривается состояние EFLAGS в момент вызова подпрограммы? и небольшая программа-тест для ленивых: Code (Text): ; (c) n0hack .386 .model flat, stdcall option casemap: none includelib kernel32.lib includelib user32.lib include windows.inc include kernel32.inc include user32.inc .data? szBuff db 128 dup (?) .data szStr0 db "abc" ; никакого терминатора! szStr1 db "def", 0 szCaption db "lstrlen() bug tester", 0 szFormat db "lstrlen(", 022h, "%s", 022h, ") == %u", 0 .code start: std push offset szStr1 call lstrlen ; в win2k со всеми заплатками и сервис-паками возвращает 4 cld ; wsprintf() и MessageBox() FD == 1 тоже башню срывает push eax push offset szStr1 push offset szFormat push offset szBuff call wsprintf add esp, 16 push MB_ICONINFORMATION push offset szCaption push offset szBuff push 0 call MessageBox push 0 call ExitProcess end start
я может не в теме а с какой целью обнулять флаг, если на каждой итерации цикла устанавливается значение флага в зависимости от результата сравнения??
О_о благодарю за идею. Инструкция Int не изменяет DF, тоесть от инструкции Int2E до входа в сервис этот флаг не изменяется.
Clerk Пожалуйста. Я еще так подозреваю, сабж можно использовать против всяких Bit Defender'ов. Magnum Учите мат часть. Например, у Барри Брэя параграф "4.4 строковые инструкции" находится на 175-ой странице (в книге ~1300 страниц), то есть это самые основы. http://www.ozon.ru/context/detail/id/2479533/ Очень полезная книжка, очень советую.