Как установить вспомогательный флаг для 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)