Непредсказуемые флаги
2026-02-08 19:42Есть в процессоре 8086 регистр флагов. Отдельные биты в нём что-то говорят о результате предыдущей команды: перенос, чётность, промежуточный перенос, ноль, знак, пошаговый режим, разрешение прерываний, направление, переполнение. Всё для удобства программиста, казалось бы. Но есть и подстава.
Некоторые флаги после некоторых команд содержат мусор. В интеловской документации эти флаги обозначены как U, то есть Undefined. Смотрите таблицу 2-21 со страницы 2-51 в документе The_8086_Family_Users_Manual_Oct79.pdf. Там дофига этих U.
На практике оказалось, что не всё так плохо. Многие из флагов, обозначенные как Undefined в документации, на самом деле прекрасно вычисляются симулятором и соответствуют чипу. Вот таблица флагов, которые действительно не удаётся предсказать.
Некоторые флаги после некоторых команд содержат мусор. В интеловской документации эти флаги обозначены как U, то есть Undefined. Смотрите таблицу 2-21 со страницы 2-51 в документе The_8086_Family_Users_Manual_Oct79.pdf. Там дофига этих U.
На практике оказалось, что не всё так плохо. Многие из флагов, обозначенные как Undefined в документации, на самом деле прекрасно вычисляются симулятором и соответствуют чипу. Вот таблица флагов, которые действительно не удаётся предсказать.
- Команды AAA, AAS - флаги OF, PF, SF, ZF - Переполнение, чётность, знак и ноль не определены
- Команды DAA, DAS, AAM, AAD - флаг OF - Переполнение не определено
- Команда RCR - флаг OF - Переполнение определено только для однократного сдвига (count=1); не определено, когда count!=1
- Команды SAL, SHL - флаг AF - Дополнительный перенос не определен
- Команда MUL - флаги PF, ZF - Чётность и признак нуля не определены для словного беззнакового умножения; для байтового все флаги определены
- Команда IMUL - флаги PF, AF, ZF, SF - Чётность, дополнительный перенос, знак, признак нуля не определены
- Команды DIV, IDIV - флаги CF, OF, SF, ZF, PF, AF - Все арифметические флаги не определены

no subject
Date: 2026-02-09 04:19 (UTC)Не генератором же шума они устанавливаются.
no subject
Date: 2026-02-09 04:41 (UTC)no subject
Date: 2026-02-09 05:55 (UTC)А надо было путём синтеза, на базе тестов, case statements из исходных значений релевантных регистров в желаемые значения флагов, с default -> X. Пусть умные алгоритмы минимизируют приближение к имеющейся в железе булевой функции.
no subject
Date: 2026-02-09 09:17 (UTC)Я ж не сам трудился, за меня Курсор впахивал. Шерстил тесты, подправлял формулы. А где он не справлялся, я решал что и не надо.
Как и ожидалось, процессоры Intel P80C86A-2 и AMD D8088 ставят непредсказуемые флаги по разному. Так что нет смысла стараться их повторить - кому какая разница? Мне пора двигаться дальше: грузить DOS. Сейчас если симулятору подсунуть загрузочный флопик, он доходит до биосного вызова чтения секторов.
no subject
Date: 2026-02-09 15:37 (UTC)no subject
Date: 2026-02-09 18:12 (UTC)no subject
Date: 2026-02-09 08:22 (UTC)no subject
Date: 2026-02-09 08:14 (UTC)Тут вполне себе детерминизм. Но было бы забавно потролить софт установкой этих флагов в случайные значения. Кой-чего может и сломаться от таких невоспрещённых вольностей.
no subject
Date: 2026-02-09 09:18 (UTC)no subject
Date: 2026-02-09 14:57 (UTC)no subject
Date: 2026-02-09 20:08 (UTC)no subject
Date: 2026-02-10 08:25 (UTC)no subject
Date: 2026-02-09 15:38 (UTC)no subject
Date: 2026-02-10 05:10 (UTC)