Как установить вспомогательный флаг для 16-битного сложения

Я знаю, что при выполнении 8-битного двоичного сложения вспомогательный флаг устанавливается в 1, если есть перенос с 3-го бита на 4-й; а как насчет добавления 2 16-битных чисел? Я не вижу четкого ответа в Интернете.

Я изучаю микропроцессор Intel 8086...

Например, когда я добавляю эти 2 числа, 0x30a2 и 0xf1ac

0011 0000 1010 0010 + 1111 0001 1010 1100

CF=1
ZF=0
PF=1
SF=0
OF=1
AF=? 

Я не уверен, где это проверить

3 ответа

Решение

Из "Программирования 8086/8088" Джеймса В. Коффрона:

AF вспомогательный флаг для переноски. Если этот флаг установлен, произошел перенос нижнего куска на верхний клев или заимствование с верхнего полубайта на нижний. Высокий или низкий полубайт относится к младшему байту 16-битного значения.

В свое время мы писали небольшой фрагмент кода, чтобы наблюдать за поведением процессора. Вы можете проверить это, сложив или вычтя два 16-битных числа, а затем pushf а также pop ax изучить флаги состояния в свое удовольствие.

РЕДАКТИРОВАТЬ.

(Другой способ получить флаги с LAHF который загружает 5 бит AH с флагами, AF собираюсь к биту 4.)

Так AF представляет выполнение от бита 3 до бита 4, независимо от размера операндов.

Обратите внимание, что нет никаких ветвящихся инструкций, зависящих от AF, Он используется внутри DAA Инструкция, чтобы сделать десятичную настройку сразу после ADD инструкция, как правило, с AL,

На 8086 adjust flag (bit 4) был установлен, когда был перенос с 3-го по 4-й бит или заимствование с 4-го по 3-й бит, это для BCD operation support,

BCD operationsна 8086 только 8 бит и BCD операции корректировки действуют только на AL регистр.

Для 16-битной операции я бы ожидал, что она будет вести себя так же, как если бы это была 8-битная операция.

Флаг переноса (бит 0) основан на том, является ли операция 8-битной или 16-битной. Если это 16 бит, то он будет нести, если результат> 65535. Если это 8 бит, то он будет нести, если результат> 255.

"положение" флага переноса зависит от инструкции оператора, оно всегда будет самым старшим битом

например, добавить топор,bx: поскольку операнты 16-битные, перенос будет представлять перенос 16-го бита, даже если вы добавите топор (со значением 3) и 9 (эти значения будут рассматриваться как 0000000000000011 и 0000000000000101)

Другие вопросы по тегам