- •Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера
- •4.1. Арифметичні дії над неупакованими bcd-числами
- •4.1.1. Додавання неупакованих bcd-чисел
- •4.1.2. Віднімання неупакованих bcd-чисел
- •4.1.3. Множення неупакованих bcd-чисел
- •4.1.4. Ділення неупакованих bcd-чисел
- •4.2. Арифметичні дії над упакованими bcd-числами
- •4.2.1. Додавання упакованих bcd-чисел
- •4.2.2. Віднімання упакованих bcd-чисел
4.1.2. Віднімання неупакованих bcd-чисел
С
Приклад
11. Результат
віднімання не більше
9
6
= 0000 0110
– 3
= 0000 0011 3
= 0000 0011
Як бачимо, позики зі старшої тетради немає. Результат вірний і коректування не вимагає.
Приклад
12. Результат
віднімання більше 9 6
= 0000 0110 -7
= 0000 0111 -1
= 1111 1111
aas (ASCII Adjust for Substraction) — корекція результату віднімання для представлення в символьному вигляді.
Команда aas також не має операндів і працює з регістром al, аналізуючи його молодшу тетраду наступним чином:
• якщо її значення менше 9, то прапор cf скидається в 0 і керування передається наступній команді;
Лістинг 7. Віднімання неупакованих BCD-чисел <1> ;prg_10_3.asm <2> masm <3> model small <4> stack 256 <5> .data ; сегмент даних <6> b db 1,7 ; неупаковане число 71 <7> c db 4,5 ; неупаковане число 54 <8> subs db 2 dup (0) <9> .code <10> main: ; точка входу в програму <11> mov ax,@data ; пов'язуємо регістр dx з сегментом <12> mov ds,ax ; даних через регістр ax <13> xor ax,ax ; очищаємо ax <14> len equ 2 ; розрядність чисел <15> xor bx,bx <16> mov cx,len ; завантаження в cx лічильника циклу <17> m1: <18> mov al,b[bx] <19> sbb al,c[bx] <20> aas <21> mov subs[bx],al <22> inc bx <23> loop m1 <24> jc m2 ; аналіз прапора позики <25> jmp exit <26> m2:... <27> exit: <28> mov ax,4c00h ; стандартний вихід <29> int 21h <30> end main ; кінець програми |
- з вмісту молодшої тетради регістру al (зауважте - не з вмісту всього регістру) віднімає 6;
- обнуляє старшу тетраду регістра al;
- встановлює прапор cf в 1, тим самим фіксуючи уявну позику зі старшого розряду.
Зрозуміло, що команда aas застосовується разом з основними командами віднімання sub і sbb. При цьому команду sub є сенс використовувати тільки один раз, при відніманні наймолодших цифр операндів, далі повинна застосовуватися команда sbb, яка буде враховувати можливу позику зі старшого розряду. У лістингу 7 ми обходимося однією командою sbb, яка в циклі виробляє порозрядне віднімання двох BCD-чисел.
Дана програма не вимагає особливих пояснень, коли зменшуване більше від’ємника. Тому зверніть увагу на рядок 24. З його допомогою ми передбачаємо випадок, коли після віднімання старших цифр чисел був зафіксований факт позики. Це говорить про те, що від’ємник був більше зменшуваного, в результаті чого різниця буде неправильною. Цю ситуацію треба якось обробити. З цією метою в рядку 24 командою jc аналізується прапор cf. За результатами цього аналізу ми йдемо на її гілку, позначену міткою m2, де і будуть виконуватися деякі дії.