Вспомогательный флаг в процессоре X86
Вспомогательный флаг устанавливается, когда нижний полубайт производит переход к полубайту более высокого порядка. Например:
1001 9
1001 9
---- ----
1 0010 18
В этом случае подмышечный перенос установлен.
Я также слышал, что этот перенос используется для добавления 0110 к куску нижнего порядка во время добавления BCD, чтобы получить правильный ответ BCD.
Но рассмотрим этот случай
1001 9
0011 3
---- ---
1100 12
В этом случае перенос не генерируется из этого куска, вспомогательный перенос не устанавливается, но ответ не является правильным добавлением BCD. Тогда что побуждает процессор исправить ответ и получить правильный ответ BCD?
2 ответа
Остальная семантика DAA
(или же AAA
). В полном объеме они есть (для DAA
):
IF 64-Bit Mode
THEN
#UD;
ELSE
old_AL ← AL;
old_CF ← CF;
CF ← 0;
IF (((AL AND 0FH) > 9) or AF = 1)
THEN
AL ← AL + 6;
CF ← old_CF or (Carry from AL ← AL + 6);
AF ← 1;
ELSE
AF ← 0;
FI;
IF ((old_AL > 99H) or (old_CF = 1))
THEN
AL ← AL + 60H;
CF ← 1;
ELSE
CF ← 0;
FI;
FI;
Итак, вы видите, что важен не только AF, он также проверяет, является ли цифра> 9.
Вы должны сделать это вручную, используя DAA
или же AAA
, Это отрегулирует текущий полубайт, если> 9, и добавит 1 к верхнему полубайту.