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