vak: (Знайка)
[personal profile] vak
Есть в процессоре 8086 регистр флагов. Отдельные биты в нём что-то говорят о результате предыдущей команды: перенос, чётность, промежуточный перенос, ноль, знак, пошаговый режим, разрешение прерываний, направление, переполнение. Всё для удобства программиста, казалось бы. Но есть и подстава.

Некоторые флаги после некоторых команд содержат мусор. В интеловской документации эти флаги обозначены как 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 - Все арифметические флаги не определены
Мой симулятор прошёл 100% всех потактовых тестов от Intel P80C86A-2 и AMD D8088. Его можно считать эталонной реализацией. Если есть вопросы по работе процессорных инструкций 8086 - смотрите соответствующее место в исходнике processor.cpp.

Date: 2026-02-09 04:19 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Здесь "не определены" == "зависят от значений операндов не сильно осмысленным образом"? (В сторону.) Кстати об операциях деления.

Не генератором же шума они устанавливаются.

Date: 2026-02-09 05:55 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
пытался подобрать из общих соображений или по аналогии с похожими командами

А надо было путём синтеза, на базе тестов, case statements из исходных значений релевантных регистров в желаемые значения флагов, с default -> X. Пусть умные алгоритмы минимизируют приближение к имеющейся в железе булевой функции.

Date: 2026-02-09 08:14 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
> Не генератором же шума они устанавливаются

Тут вполне себе детерминизм. Но было бы забавно потролить софт установкой этих флагов в случайные значения. Кой-чего может и сломаться от таких невоспрещённых вольностей.

Date: 2026-02-09 08:22 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Со сдвигами больше чем на 1 бит можно флаги OV и CF (и наверное AF – не помню, давно ковырял тему) вывести из прикидки того, как они могли сделать сдвигатель на произвольное число бит и куда во всей этой схеме нужно смотреть чтобы получить определённые значения флагов для сдвига на 1 бит. И тут возможны варианты реализации.

Date: 2026-02-09 14:57 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Именно так. Как я выше сказал, есть несколько вариантов реализации.

Date: 2026-02-09 15:37 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Кстати о Курсоре. Весь ум там у Клода, Квена, или кого там ещё можно выбрать. Вклад Курсора, насколько я понимаю, в основном состоит в интерфейсе.

Date: 2026-02-09 15:38 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Возможно, какие-нибудь тогдашние программки, которые ради смеха умели определять марку и модель процессора, этими флагами и пользовались, но не более того.

Date: 2026-02-10 05:10 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Ну вот я нашёл штуки три разных как-то давно.

Date: 2026-02-10 08:25 (UTC)
dmarck: (Default)
From: [personal profile] dmarck
(ржа) защита от копирования! ;-P