вспомогательный флаг в процессоре X86

Вспомогательный флаг устанавливается, когда младший полубайт производит перенос в полубайт более высокого порядка. Например:

  1001   9
  1001   9
  ---- ----
1 0010  18

В этом случае устанавливается подмышечный перенос.

Я также слышал, что этот перенос используется для добавления 0110 к полубайту младшего порядка во время добавления BCD, чтобы получить правильный ответ BCD.

Но рассмотрим этот случай

1001  9
0011  3
---- ---
1100  12

В этом случае перенос из этого полубайта не генерируется, вспомогательный перенос не устанавливается, но ответом является неправильное сложение BCD. Что тогда побуждает процессор исправить ответ и получить правильный ответ BCD?


person Danny    schedule 30.01.2014    source источник
comment
BCD имело значение в 1970-х годах, когда были колесики с накаткой, газоразрядные трубки и калькуляторы, использующие десятичную математику. Это все прошло. Как и инструкции, они не были перенесены в x64. Вы тратите свое время на это.   -  person Hans Passant    schedule 30.01.2014


Ответы (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.

person harold    schedule 30.01.2014

Вы должны сделать это вручную, используя DAA или AAA. Это отрегулирует текущий полубайт, если > 9, и добавит 1 к старшему полубайту.

person m0skit0    schedule 30.01.2014
comment
есть ли другое применение для вспомогательного флага - person Danny; 30.01.2014
comment
Это новый вопрос и слишком широкий, чтобы ответить. Вы можете проверить документацию Intel о КФ. - person m0skit0; 30.01.2014