Skip to content

12. Двоично десятичная арифметика

Natasha Gurova edited this page Jun 24, 2022 · 10 revisions

Что такое двоично-десятичные числа?

Задействуются не все возможные двоичные коды. Если число не упакованное, то из 
256 возможных значений для байта будет использоваться только 10, то есть 
число – это байт от 00h до 09h. Если упакованное, то 
будет байт от 00h до 99h (цифры A..F не задействуются).

НЕУПАКОВАННОЕ ДД число - десятичная цифра, хранящаяся в байте.

УПАКОВАННОЕ ДД число - две десятичные цифры, хранящиеся в полубайтах одного байта.

Если такие числа пытаться складывать или как-то там изменять, то возникают проблемы 19h + 1 = 1Ah => 20h

Поэтому есть команды для коррекции:

  • DAA, DAS - команды для коррекции упакованных дд чисел после сложения/вычитания
  • AAA, AAS - команды для коррекции неупакованных дд чисел после сложения/вычитания
  • AAM, AAD - коррекция для неупакованных дд чисел после умножения/деления.

Пример 1. Неупакованные числа

mov AL, 6   ; AL = 6
add AL, 7   ; AL = 6 + 7 = 13 (получили не BCD число)
aaa         ; проводим коррекцию -> получаем al = 3, CF = 1 (флаг переполнения)

Как это работает?

  • команда ааа анализирует значение младшей тетрады регистра AL
  • если значение регистра было бы меньше 9, то флаг СF был бы сброшен в 0 и был бы переход к следующей команде
  • если значение больше 9
    • к содержимому младщей тетрады AL + 6 -> корректируем результат в нужную сторону
    • флаг CF устанавливается в 1 (фиксируется перенос в старший разряд, чтобы его можно было учесть в последующих действиях)
  0000 0110   (6) 
 +            
  0000 0111   (7)
  ---------
  0000 1101   (13)

Нужна коррекция:
  1101 + 0110 = 0011 (3) -- откорректировали младшую тетраду
  CF = 1

Пример 2. Упакованные числа

mov AL,71H   ; AL = 0x71h
add AL,44H   ; AL = 0x71h + 0x44h = 0xB5h
daa          ; AL = 0x15h
             ; CF = 1 - перенос является частью результата 71 + 44 = 115
Clone this wiki locally