Главная страница
Операции над битами и байтами

На этой странице мы рассмотрим команды десятичной арифметики. Конечно, без них можно обойтись, но фирма Intel их ввела начиная с процессоров 8086! Значит, для чего-то они нужны. Они позволяют ускорить вычисления в десятичной системе счисления. Числа состоят из байтов, в каждом байте хранится одна цифра (от 0 до 9). С помощью команд десятичной арифметики мы можем сложить, например, 2 тысячезначных десятичных числа быстрее, чем без неё. При этом следует понимать, что при выполнении арифметических операций над десятичными числами следует пользоваться теми же самыми командами, что и для двоичных чисел (add, sub, mul, div, и т д), но использовать дополнительно коррекцию результата, о которой мы и будем говорить на данной странице

Десятичная арифметика


1) daa – BCD-коррекция после сложения. Если эта команда выполняется сразу после add или adc или inc и в регистре al находится сумма двух упакованных двоично-десятичных чисел, то в al записывается упакованное двоично-десятичное число, которое должно было стать результатом сложения. Например, если al=19h, то после последовательности команд: inc al; daa; регистр al=20h (а не 1Ah). Команда daa выполняет следующие действия:
1) Если младшие 4 бита al больше 9 или AF=1, то al увеличивается на 6; CF устанавливается, если при этом сложении произошёл перенос, и AF устанавливается в 1
2) Иначе AF устанавливается в 0
3) Если теперь старшие 4 бита al больше 9 или CF=1, то al увеличивается на 60h и CF устанавливается в 1
4) Иначе CF устанавливается в 0
Флаги AF и CF устанавливаются, если в ходе коррекции происходил перенос из первой или второй цифры. ZF, SF и PF устанавливаются в соответствии с результатом. Флаг OF не определён

2) das – BCD-коррекция после вычитания. Если эта команда выполняется сразу после sub или sbb или dec и в регистре al находится разность двух упакованных двоично-десятичных чисел, то в al записывается упакованное двоично-десятичное число, которое должно было стать результатом вычитания. Например, если al=20h, то после последовательности команд: dec al; das; регистр al=19h (а не 1Fh). Команда das выполняет следующие действия:
1) Если младшие 4 бита al больше 9 или AF=1, то al уменьшается на 6; CF устанавливается, если при этом вычитании произошёл заём, и AF устанавливается в 1
2) Иначе AF устанавливается в 0
3) Если теперь старшие 4 бита al больше 9 или CF=1, то al уменьшается на 60h и CF устанавливается в 1
4) Иначе CF устанавливается в 0
Флаги AF и CF устанавливаются, если в ходе коррекции происходил заём из первой или второй цифры. ZF, SF и PF устанавливаются в соответствии с результатом. Флаг OF не определён Известный пример необычного применения das – преобразование шестнадцатеричной цифры в ASCII-код соответствующего символа: cmp al, 10; sbb al, 69; das;

3) aaa – корректирует сумму двух неупакованных BCD-чисел в al. Если коррекция приводит к десятичному переносу, ah увеличивается на 1. Например, если при сложении 05 и 06 в ax окажется число 000Bh, то команда aaa скорректирует его в 0101. AF=CF=1, если произошёл перенос из al в ah, иначе AF=CF=0. Значения ZF, SF, OF, PF не определены

4) aas – корректирует разность двух неупакованных BCD-чисел в al. Если операция приводит к займу, ah уменьшается на 1. AF=CF=1, если произошёл заём из al в ah, иначе AF=CF=0. Значения ZF, SF, PF, OF не определены

5) aam – корректирует результат умножения неупакованных BCD-чисел, который находится в ax после выполнения команды mul. Пример: mov al, 5; mov bl, 5; mul bl; aam; После этого ax=0205h, а не 0019h. Код команды aam – D4h OAh (двухбайтовый), где OAh – основание системы по отношению к которому ведётся коррекция. Если хотим использовать другую систему счисления, то надо писать вместо aam, например, следующее: dw 0D40Ah. Флаги ZF, SF, PF устанавливаются в соответствии с результатом. CF, OF, AF не определены

6) aad – корректирует неупакованное BCD-число в ax перед делением.Пример: mov ax, 0205h; mov bl, 5; aad; div bl; После этого ax=0005. Команда aad как и aam, может использоваться не только для десятичных чисел. Её код: D5h 0Ah (двухбайтовый). Флаги ZF, SF, PF устанавливаются в соответствии с результатом. CF, OF, AF не определены

Следует понять, что коррекция выполняется после действия (кроме деления). То есть мы выполняем сначала нужное арифметическое действие как будто бы над двоичными числами, а затем корректируем. Но если выполняется деление, то коррекция должна быть произведена перед делением

Следующая страница (команды enter и leave)