Непредсказуемые флаги
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 - Все арифметические флаги не определены
