Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._10.doc
Скачиваний:
2
Добавлен:
05.05.2019
Размер:
142.85 Кб
Скачать

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

Віднімання проводиться за правилами двійкової арифметики. Тому результат не є BCD-числом. Правильний результат в неупакованому BCD-форматі має бути 9 (0000 1001 в двійковій системі числення). При цьому передбачається позика зі старшого розряду, як при звичайній команді віднімання, тобто у випадку з BCD-числами фактично має бути виконане віднімання 16 - 7. Таким чином видно, що, як і у випадку додавання, результат віднімання потрібно коректувати. Для цього існує спеціальна команда:

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 більше 9, то команда aas виконує наступні дії:

- з вмісту молодшої тетради регістру al (зауважте - не з вмісту всього регістру) віднімає 6;

- обнуляє старшу тетраду регістра al;

- встановлює прапор cf в 1, тим самим фіксуючи уявну позику зі старшого розряду.

Зрозуміло, що команда aas застосовується разом з основними командами віднімання sub і sbb. При цьому команду sub є сенс використовувати тільки один раз, при відніманні наймолодших цифр операндів, далі повинна застосовуватися команда sbb, яка буде враховувати можливу позику зі старшого розряду. У лістингу 7 ми обходимося однією командою sbb, яка в циклі виробляє порозрядне віднімання двох BCD-чисел.

Дана програма не вимагає особливих пояснень, коли зменшуване більше від’ємника. Тому зверніть увагу на рядок 24. З його допомогою ми передбачаємо випадок, коли після віднімання старших цифр чисел був зафіксований факт позики. Це говорить про те, що від’ємник був більше зменшуваного, в результаті чого різниця буде неправильною. Цю ситуацію треба якось обробити. З цією метою в рядку 24 командою jc аналізується прапор cf. За результатами цього аналізу ми йдемо на її гілку, позначену міткою m2, де і будуть виконуватися деякі дії.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]