Проблемы с пониманием книги и флагов Z80.
Я читаю официальное руководство пользователя Zilog, и у меня возникли проблемы с пониманием раздела флагов для каждой инструкции.
В книге сказано:
Condition Bits Affected:
...
H: Set if carry from bit 3; reset otherwise
...
C: Set if carry from bit 7; reset otherwise
...
Что означает установка флага «при переносе с бита n». Также довольно часто встречается еще одно предложение: «Установить, если заимствовать из бита n». Что эти вещи означают?
Спасибо!
1 ответ
По сути перенос(C
) флаг сообщает вам, что результат сложения слишком велик, чтобы поместиться в аккумуляторе. Или, аналогично, если результат вычитания был слишком мал, чтобы поместиться в аккумуляторе. Вернусь к полукерри(H
) флаг через мгновение.
Предположим, что в аккумуляторе (регистре) есть 37. Затем инструкция выполняется. Это поместит 37+20 = 57 в . Поскольку можно хранить значения от 0 до 255, результат подходит и перенос отсутствует. Флаг переноса будет равен 0 (часто говорят, что «перенос свободен»).
Но если в нем 250 иADD A,20
случается, то вы получаете 14, а флаг переноса равен 1 (эквивалентно, он «установлен»). Процессор говорит, что 270 не подходит, поэтому он устанавливает флаг переноса, чтобы указать, что результат больше 255, и помещает остаток (270–256) в регистр.
Логически вы можете рассматривать это как утверждение, что послеADD A
результат 256*перенос плюс регистр.
При вычитании перенос будет установлен, если результат меньше 0. По сути, послеSUB A
результат -256*перенос плюс регистр.
Половинный перенос аналогичен переносу, но он сообщает вам, что происходит с четырьмя младшими битамиA
регистр и что в него добавили. Под младшими 4 битами я имею в виду остаток от деления на 16.
Вернёмся к сложению 37 + 20. 16 входит в 37 два раза с остатком 5. В 20 входит только один раз с остатком 4. Теперь сложим 4 и 5, чтобы получить 9. Поскольку это меньше 16, то будет умещаться в 4 бита, а половина переноса будет равна 0 (или очищена).
Но предположим, что остатки были 10 и 10. Тогда у нас было бы 20, что больше 16, поэтому полуперенос был бы 1 (или сет).
Вы должны иметь в виду, что полукерри не очень важен и полезен. Он предназначен только для поддержки инструкции, и даже тогда вам не нужно знать, как он работает, чтобы использоватьDAA
.
В руководстве используются описания, потому что они ясно и точно показывают, как влияют флаги, если вы знакомы с двоичной арифметикой. Они также представляют собой почти буквальное описание того, что делает оборудование. Для тех, кто не знаком с такими вещами (а кто сначала?) описание довольно неясное.
Я советую вам углубиться в это и изучить двоичную арифметику. Чудеса записи отрицательных чисел с дополнением до двух и взаимодействие между арифметическими и логическими операциями просто изумительны.