Язык ассемблера Z80 - флаг знака после INC r

меня смущает один момент с ассемблером Z80. Всегда ли флаг знака представляет знак значения регистра А? Я имею в виду, что когда я запускаю «INC B», результат возвращается к B, поэтому флаг знака берется из значения регистра A или B? заранее спасибо


person user1293910asd    schedule 19.02.2011    source источник
comment
я не понимаю; INC B увеличивает значение B на единицу, пока не достигнет #$FF. Это возвращает к #$00 и, следовательно, к знаку. Любое значение выше #$7F снова устанавливает восьмибитный знак.   -  person CarneyCode    schedule 19.02.2011


Ответы (4)


Эта страница: http://icarus.ticalc.org/articles/z80_faq.html кажется чтобы указать, что флаг знака представляет собой результат любого вычисления, а не только вычислений в регистре A.

person Amos    schedule 19.02.2011
comment
Это не верно для пар регистров, только для регистров. INC и DEC, например, не влияют на флаги. - person David Hoelzer; 13.06.2015

В Z80 все регистры (A,B,C,D,E,H,L) независимы, поэтому любая арифметическая или двоичная операция будет влиять на флаги в регистре F.

Проверьте страницу 160 таблицы данных Z80 на наличие inc r затронутых флагов.

person GJ.    schedule 19.02.2011
comment
Это правда, как вы написали, но это может ввести в заблуждение. INC и DEC в паре регистров не повлияют ни на какие флаги (к моему ужасу). - person David Hoelzer; 13.06.2015

Флаг знака не всегда представляет A. Переполнение (включая 255), побитовые операции (сдвиг и т. д.) и логические операторы влияют на все флаги.

Однако Zilog настраивает каждый регистр по-своему, поэтому некоторые операции влияют на флаги с определенным регистром, а не с другим. Распространенной оптимизацией является «XOR A», которая устанавливает флаг знака и эффективно сравнивает A с нулем. Я почти уверен, что это работает только на reg A.

Вышеупомянутый документ Icarus объясняет флаги, и раньше был еще один текстовый документ меньшего размера, который объяснял флаги. Но в последний раз я видел это более 10 лет назад, и я понятия не имею, где это будет.

person Harper Maddox    schedule 26.10.2011

Флаги в Z80 всегда относятся к последней операции, которая их изменила. Такое поведение может быть полезным или не очень полезным. Просто приведу несколько конкретных примеров:

ld l,0           ; L is non-zero, but loading does not affect flags,
                 ; so their state is undefined at this stage
xor a            ; this resets A to 0; affected flags are NC, Z
ld h,a           ; we still have NC, Z
inc hl           ; HL is now equal to 1, but inc/dec of register pairs does
                 ; not affect any flags at all
dec a            ; A is now 255 (i.e. -1). we have NZ (expectedly),
                 ; however flag C is still off (intuitively unexpectedly),
                 ; because DEC of individual registers does not affect state of flag C
add a,1          ; at the same time, addition modifies both Z and C,
                 ; so after this A=0 again and we have flags Z and C both on

Вообще говоря, это означает, что иногда вы можете создавать более сложные условия, которые отслеживают состояние флага C, в то же время выполняя другие операции, которые изменяют флаг Z, не изменяя флаг C. Это также означает, что вы должны помнить для каждой операции, которая помечает его изменяет.

Лучшая из известных мне онлайн-таблиц со всей этой информацией находится по адресу http://clrhome.org/table/

person introspec    schedule 05.03.2018