Бага в stosb
2026-03-04 00:35Покажу как выглядит поиск ошибки в симуляторе. Сначала запускаем работающий вариант, с записью трассировки в файл.

Как видим, команда STOSB слева выполняет 8 итераций и завершается. Та же команда справа продолжает крутиться до бесконечности. Что за ерунда? Проверим значение счётчика итераций в регистре CX. Глядите, команда MOV на адресе 07d89 заносит значение 8 в регистр CX (слева). А справа в регистре ECX оказывается ffff0008. Тоже не придерёшься: в реальнгом режиме задействуются только младшие 16 бит регистра. В старших битах остался мусор от каких-то предыдущих команд.
Но команда STOSB тоже должна использовать только младшую половину регистра CX, и выполнить 8 итераций. Вместо этого она, очевидно, берёт полное 32-битное значение, и крутится до морковкина заговенья.
А всё почему? От нетерпения. 😀 Надо было сначала добиться работы всех 100% MOO тестов, и потом уже пробовать грузить ДОС. Но очень хотелось глянуть, как оно пойдёт.
$ tiltti msdos3.31-1.44m.img -r -o a.logТеперь запускаем глюкавую версию, получаем второй файл трассировки.
$ tiltti --386 msdos3.31-1.44m.img -r -o b.logСравниваем файлы трассировки умной тулзой. В левой части экрана работает процессор i8086. В правой части - процессор i386. Выполняют один и тот же код, а именно MS-DOS 3.31. Результаты должны совпадать, за исключением того, что слева регистры 16-битные, а справа 32-битные. И они совпадают... до момента ошибки.

Как видим, команда STOSB слева выполняет 8 итераций и завершается. Та же команда справа продолжает крутиться до бесконечности. Что за ерунда? Проверим значение счётчика итераций в регистре CX. Глядите, команда MOV на адресе 07d89 заносит значение 8 в регистр CX (слева). А справа в регистре ECX оказывается ffff0008. Тоже не придерёшься: в реальнгом режиме задействуются только младшие 16 бит регистра. В старших битах остался мусор от каких-то предыдущих команд.
Но команда STOSB тоже должна использовать только младшую половину регистра CX, и выполнить 8 итераций. Вместо этого она, очевидно, берёт полное 32-битное значение, и крутится до морковкина заговенья.
А всё почему? От нетерпения. 😀 Надо было сначала добиться работы всех 100% MOO тестов, и потом уже пробовать грузить ДОС. Но очень хотелось глянуть, как оно пойдёт.

no subject
Date: 2026-03-04 09:56 (UTC)дурно и бестолково, но ОЧЕНЬ понятно ;)
no subject
Date: 2026-03-04 13:05 (UTC)