stdcall & FD (EFLAGS)

Тема в разделе "WASM.WIN32", создана пользователем n0hack, 20 июл 2008.

  1. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    Вопрос знатокам.
    У меня windows 2000 sp4 со всеми заплатками. Сегодня обратил внимание, что функция lstrlen в моей системе использует инструкцию rep scasb без проверки/установки флага FD. Вопрос: в соглашении вызова stdcall как-то оговаривается состояние EFLAGS в момент вызова подпрограммы?
    и небольшая программа-тест для ленивых:
    Код (Text):
    1. ; (c) n0hack
    2. .386
    3. .model flat, stdcall
    4. option casemap: none
    5.  
    6. includelib kernel32.lib
    7. includelib user32.lib
    8.  
    9. include windows.inc
    10. include kernel32.inc
    11. include user32.inc
    12.  
    13. .data?
    14.     szBuff db 128 dup (?)
    15.  
    16. .data
    17.     szStr0 db "abc" ; никакого терминатора!
    18.     szStr1 db "def", 0
    19.  
    20.     szCaption db "lstrlen() bug tester", 0
    21.     szFormat db "lstrlen(", 022h, "%s", 022h, ") == %u", 0
    22. .code
    23.  
    24. start:
    25.     std
    26.     push offset szStr1
    27.     call lstrlen ; в win2k со всеми заплатками и сервис-паками возвращает 4
    28.    
    29.     cld ; wsprintf() и MessageBox() FD == 1 тоже башню срывает
    30.    
    31.     push eax
    32.     push offset szStr1
    33.     push offset szFormat
    34.     push offset szBuff
    35.     call wsprintf
    36.     add esp, 16
    37.    
    38.     push MB_ICONINFORMATION
    39.     push offset szCaption
    40.     push offset szBuff
    41.     push 0
    42.     call MessageBox
    43.  
    44.     push 0
    45.     call ExitProcess
    46.    
    47. end start
     
  2. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    n0hack
    ага 0
     
  3. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    весь eflags? 0o
     
  4. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    нет
    твой флаг
     
  5. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    меня просто немного смущает, что Visual Studio 2005 его не обнулет
     
  6. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    wsd
    Большое спасибо за оперативный ответ :)
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    n0hack
    всегда готов!
    а другие темы стоило бы подчистить компетентным людям :dntknw:
     
  8. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    я может не в теме
    а с какой целью обнулять флаг, если на каждой итерации цикла устанавливается значение флага в зависимости от результата сравнения??
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    О_о благодарю за идею. Инструкция Int не изменяет DF, тоесть от инструкции Int2E до входа в сервис этот флаг не изменяется.
     
  10. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Magnum что устанавливается, Direction Flag?
     
  11. n0hack

    n0hack New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2008
    Сообщения:
    71
    Clerk
    Пожалуйста.
    Я еще так подозреваю, сабж можно использовать против всяких Bit Defender'ов.

    Magnum
    Учите мат часть. Например, у Барри Брэя параграф "4.4 строковые инструкции" находится на 175-ой странице (в книге ~1300 страниц), то есть это самые основы.
    http://www.ozon.ru/context/detail/id/2479533/
    Очень полезная книжка, очень советую.