Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опорний конспект лекцій_ Асемблер.Docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
506.89 Кб
Скачать
      1. Неупаковані bcd-числа

Корекція операції додавання двох BCD-чисел: aaa (ASCII Adjust for Addition)

aaa

Команда не має операндів і працює неявно з регістром al і аналізує значення його молодшої тетради. Якщо це значення менше 9, то прапор cf скидується в 0, і здійснюється перехід до наступної команди. Якщо це значення більше 9, то виконуються наступні дії:

o до вмісту молодшої тетради al (але не до всього регістра) добавляється 6, тим самим коректується десяткове значення у вірну сторону;

o прапор встановлюється в 1, тим самим фіксується перенос у старший розряд для того, щоб його можна було врахувати у наступних діях.

Корекція операції віднімання двох BCD-чисел: aas (ASCII Adjust for Substraction)

aas

Команда не має операндів і працює неявно з регістром al і аналізує значення його молодшої тетради. Якщо це значення менше 9, то прапор cf скидується в 0, і здійснюється перехід до наступної команди. Якщо це значення більше 9, то виконуються наступні дії:

o із вмісту молодшої тетради al (але не всього регістра) віднімається 6, тим самим коректується десяткове значення у вірну сторону;

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

o прапор встановлюється в 1, тим самим фіксується уявна позика із старшого розряду для того, щоб його можна було це врахувати у наступних діях.

Команда aas застосовується після команд sub, sbb.

Із прикладів додавання і віднімання неупакованих чисел видно, що нема стандартних алгоритмів для їх виконання. Програміст повинен сам реалізовувати ці операції. Це відноситься і до операцій множення і ділення. Є команди тільки для множення і ділення однорозрядних неупакованих чисел. Для множення чисел довільної розмірності необхідно реалізувати процес множення, наприклад в “стовпчик”

Для того, щоб перемножити два однорозрядних BCD-числа, необхідно:

o помістити один із співмножників у регістр al (як цього вимагає команда mul);

o помістити другий операнд у регістр або пам’ять (один байт);

o перемножити співмножники командою mul;

o отриманий результат скоректувати.

Для корекції результату після множення використовується команда aam (ASCII Adjust for Multiplication):

aam

Вона не має операндів і працює з регістром ax наступним чином:

o ділить al на 10;

o в результаті ділення частка записується в al, а залишок в ah.

Операція ділення двох неупакованих чисел має деяку відмінність. Тут також потрібно виконувати дії по корекції результату, але перед діленням. Попередньо в регістрі ax необхідно отримати дві неупаковані BCD-цифри діленого з допомогою команди aad (ASCII Adjust for Division):

aad

Команда не має операндів і перетворює двозначне BCD-число в регістрі ax у двійкове число. Це двійкове число буде грати роль діленого. Крім перетворення, команда aad поміщає отримане двійкове число в регістр al. Ділене буде звичайно двійковим числом в діапазоні 0-99. Алгоритм цих перетворень:

o помножити старшу цифру початкового BCD-числа в ax (вміст ah) на 10; o виконати додавання ah+al, результат (двійкове число) занести в al; o обнулити вміст ah.

Далі виконується звичайна команда div для ділення вмісту ax на одну BCD-цифру, що знаходиться у байтовому регістрі або пам’яті. Для ділення чисел більшої розрядності необхідно реалізовувати додатковий алгоритм.