Вспомогательный флаг в процессоре 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 к верхнему полубайту.

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