Какова цель зарезервированного/неопределенного бита в регистре флагов?

В регистре флагов процессоров Z80, 8080, 8085 и 8086 для чего предназначены биты 1, 3, 5, которые задокументированы как «зарезервированные» или «неопределенные»?


person Joseph    schedule 30.06.2017    source источник
comment
Бит 1 в Z-80 определяется как флаг N, который указывает, была ли последняя инструкция сложением или вычитанием, и используется инструкцией DAA.   -  person George Phillips    schedule 30.06.2017


Ответы (1)


Эти биты не используются; то есть ни одна инструкция явно не устанавливает для них какое-либо значение. Разработчики решили, что 5/6 флагов достаточно, и просто оставили оставшиеся биты регистра флагов неиспользованными.

Они задокументированы как «неопределенные», потому что невозможно заранее узнать, какое значение они будут иметь после выполнения любой из инструкций - в этом случае конструкция процессора проще, чем при явной установке их на 0 или 1.

Теперь, строго говоря, по крайней мере для Z80, эти флаги делают на самом деле получают предсказуемое значение — в конце концов, процессор всегда будет выдавать один и тот же результат и переходить во внутреннее состояние при одной и той же комбинации входных данных. и предыдущее внутреннее состояние. Например, этот документ о недокументированных инструкциях Z80 говорит о CPI следующее:

Флаги 3 и 5 устанавливаются следующим образом: возьмите A, вычтите последний (HL), а затем уменьшите его на 1, если был установлен флаг H (/после/ CP). Бит 1 этого значения — флаг 5, бит 3 — флаг 3.

Дело, однако, в том, что такое поведение является непреднамеренным — просто побочным эффектом — и не гарантируется, что оно будет присутствовать в будущих итерациях процессоров. Вот почему они задокументированы как просто «неопределенные», например, «они бесполезны для вас, поэтому просто игнорируйте их».

Обратите внимание, что в то время как на Z80 все биты регистра F могут быть установлены в любое состояние, на i8080 биты 3 и 5 (соответствующие недокументированным флагам Z80) всегда считываются как нулевые, а бит 1 (соответствующий флагу N Z80) всегда читается как один.

person Konamiman    schedule 30.06.2017
comment
POP AF на Z-80 устанавливает все биты регистра флагов, поэтому, хотя нет инструкций, которые устанавливают неопределенные биты регистра флагов через побочные эффекты, есть одна, которая устанавливает все биты. Программы могут и безопасно предполагают, что POP AF; PUSH AF оставит вершину стека неизменной. - person George Phillips; 30.06.2017
comment
@GeorgePhillips: ... если прерывания отключены, чтобы память, которая временно находится ниже текущего указателя стека, не могла быть асинхронно уничтожена обработчиком прерываний. - person Peter Cordes; 10.07.2017
comment
Ну да, но немного не в тему. Тогда скажем так. PUSH HL, POP AF, PUSH AF, POP HL не изменят содержимое HL. - person George Phillips; 10.07.2017
comment
для интереса: краткое изложение логики 3/5 флагов github.com/hoglet67/Z80Decoder/ вики/недокументированные флаги - person Max; 26.10.2019