Page 1 of 1

Исключение #06

Posted: Fri Aug 10, 2007 2:51 pm
by bw
Здравствуйте.
С таким зверем мне еще сталкиваться не приходилось. Ситуация такая. Код, который успешно работает под KlbrInWin не хочет работать в Bochs. Раньше не этот же код (я почти уверен) работал. На реальной машине пока не проверял.
При запуске программы сразу же, это буквально второй или третий вход в процедуру (точно не знаю, имеется ввиду глубина, а не количество вызовов), возникает исключение 06, IEP 22f1.
Вот дамп процедуры, в которой возникает исключение:

Code: Select all

000022E0: 55                        push    ebp
000022E1: 89E5                      mov     ebp,esp
000022E3: C605FC51020001            mov     byte ptr [000251FC],01
000022EA: C605FD51020001            mov     byte ptr [000251FD],01
000022F1: F30F7E                    repe
В чем может быть дело?

..bw

Posted: Fri Aug 10, 2007 3:01 pm
by Veliant
А в остальных регистрах чего?

Posted: Fri Aug 10, 2007 3:18 pm
by bw
Ложная тревога. С кодом все в порядке.
Ошибка возникает только в bochs, в qemu и на реальном железе все работает. Хотя раньше и bochs работал.
Что в других регистрах я не знаю. Я переписал то что было на доске отладки, сам отладчик не запускал.

..bw

Posted: Fri Aug 10, 2007 3:19 pm
by Mario79
bw
Флаги не требуется предварительно установить в нужное состояние?

Posted: Fri Aug 10, 2007 3:21 pm
by bw
Какие флаги? Дело в том что я здорово подзабыл ассемблер и возможно что-то упускаю из виду.

..bw

Posted: Fri Aug 10, 2007 3:22 pm
by Mario79
bw
Перед использованием префикса rep обычно итспользуют cld, или другие команды для установки значально нужного состояния флагов.

Posted: Fri Aug 10, 2007 3:35 pm
by bw
Вспомнил что к чему. Я почему то перепутал последнюю команду с разновидностью ret :-).
Но в любом случае, разве исключение 06 не означает неизвестный opcode, т.е. максимум что можно было получить здесь это что то вроде AccessViolation (0E, если не ошибаюсь). Разве не так?

..bw

Posted: Fri Aug 10, 2007 3:59 pm
by Mario79
bw
Неисповедимы пути... программистов Вochs. :-)

Posted: Thu Aug 16, 2007 10:59 am
by diamond
bw
Есть такая вещь, как инструкции SSE. Опкоды многих из них начинаются с F3 0F, и F3 здесь не означает rep. mtdbg про SSE знает ещё довольно мало и дизассемблирует неправильно.
"F3 0F 7E 00" = "movq xmm0, qword [eax]", к примеру; "0F 7E 00" = "movd dword [eax], mm0".
KlbrInWin, который эмуляцией процессора вообще не занимается, сбрасывает все проблемы на процессор, который SSE прекрасно исполняет. А вот эмулятор Bochs (особенно старые версии, вроде бы сейчас SSE поддерживается, хотя не уверен) может запросто фолтить с #UD.

Posted: Thu Aug 16, 2007 12:04 pm
by bw
Спасибо за развернутый ответ. Что такое sse я знаю :-).
Код я смотрел qview 2.91, возможно он тоже не работает с этими опкодами.

..bw