реверсю вот одну прогу под дос дпми. я прикрутил к ней логгер на сингл степе. запускаю значит под чистым досом + cwsdpmi снимаю лог. и снимаю лог с нее под вин xp sp2. сравнивая логи вот что я обнаружил кусок кода который рассматриваем ... .text:00064213 mov edx, [ebp+arg_0] .text:00064216 in al, dx .text:00064217 movzx eax, al ... теперь логи dos cwsdpmi ... eip: 64213 LOG: DS: AF ES: AF EAX: 0 EBX: 1000 EDX: 260 ECX: 0 EDI: 115F9E ESI: 59B2 EBP: 115EE0 N233E6 eip: 64216 PortIn: 262 43 N233E7 eip: 64217 LOG: DS: AF ES: AF EAX: 43 EBX: 1000 EDX: 262 ECX: 0 EDI: 115F9E ESI: 59B2 EBP: 115EE0 ... а теперь лог с вин ВНИМАНИЕ ... eip: 64213 LOG: DS: 1AF ES: 1AF EAX: 0 EBX: 2AD EDX: 260 ECX: 0 EDI: 11FF9E ESI: 59B2 EBP: 11FEE0 N2C05E eip: 64216 PortIn: 262 FF N2C05F eip: 6421A LOG: DS: 1AF ES: 1AF EAX: FF EBX: 2AD EDX: 262 ECX: 0 EDI: 11FF9E ESI: 59B2 EBP: 11FEE0 ... вот так вот после аут та же фишка. интересно почему под виндами следующая за обращением к порту команда невидима для сингл степа?
Осмелюсь предположить, что поскольку под виндой xp порты закрыты, то происходит исключение #GP(0) для эмуляции ввода из порта, а под чистым досом порты открыты и ничего не происходит - команда выполняется как есть. Таким образом реально команда out (как и in) под виндой может и не исполняться, а только эмулируется (смотря какой порт, конечно, но виртуализация оборудования это великая вещь), отсюда и "приколы" синглстепа - поток команд "разрывается" и 1 команда пропускается из исполнения (из-за исключения)... Под 0-м кольцом в винде такое происходить не должно, т.к. там все исполняется как есть и логгер должен отработать как и досе. Хотя может я в чем и не прав...
Еще вроде бы (если я лог верно понял) там из порта разные числа получаются (а порт вроде бы один), так что действительно похоже, что эмуляция виндами ...