- •Тема 2. Архітектура процесора і мова асемблера: Основи програмування на мові асемблера
- •1.1. Команды пересилки даних загального призначення
- •1.2. Команди вводу-виводу в порт
- •1.3. Команди роботи з адресами і покажчиками пам'яті
- •1.4. Команди перетворення даних
- •2.1. Огляд групи арифметичних команд і даних
- •2.2. Цілі двійкові числа
- •2.3. Десяткові числа
1.4. Команди перетворення даних
До цієї групи можна віднести багато команд мікропроцесора, але більшість з них мають ті або інші особливості, які вимагають віднести їх до інших функціональних груп.
Тому з усієї сукупності команд мікропроцесора безпосередньо до команд перетворення даних можна віднести тільки одну команду:
xlat [адреса_таблиці_перекодування]
Лістинг 2. Використання таблиці перекодування <1>;---------Prg_8_2.asm---------------------- <2>;Програма перетворення двузначного шістнадцяткового числа <3>;в двійкове представлення з використанням команди xlat. <4>;Вхід: початкове шістнадцяткове число; вводиться с клавіатури. <5>;Вихід: результат перетворення в регістрі dx. <6>.data ;сегмент даних <7> message db ‘Введіть дві шістнадцяткові цифри,$’ <8> tabl db 48 dup (0),0,1,2,3,4,5,6,7,8,9, 7 dup (0), <9> db 0ah,0bh,0ch,0dh,0eh,0fh,26 dup (0) <10> db 0ah,0bh,0ch,0dh,0eh,0fh, 152 dup (0) <11> .stack 256 ;сегмент стеку <12> .code <13> ;початок сегмента коду <14> proc main ;початок процедури main <15> mov ax,@data ;адреса сегменту даних в регістр ax <16> mov ds,ax ;ax записуємо в ds <17> lea bx,tabl ;завант. адреси рядка байтів в рег. bx <18> mov ah,9 <19> mov dx,offset message <20> int 21h ;вивести запрошення до вводу <21> xor ax,ax ;очистити регістр ax <22> mov ah,1h ;значення 1h в регістр ah <23> int 21h ;вводимо першу цифру в al <24> xlat ;перекодування першого введеного символа в al <25> mov dl,al <26> shl dl,4 ;зсув dl вліво для звільн. міста для молод. цифри <27> int 21h ;введення другого символа в al <28> xlat ;перекодування другого введеного символа в al <29> add al,dl ;додаємо для отримання результату <30> mov ax,4c00h ;пересилання 4c00h в регістр ax <31> int 21h ;завершення програми <32> endp main ;кінець процедури main <33> code ends ;кінець сегмента коду <34> end main ;кінець програми з точкою входа main |
Слово "таблиця" вельми умовно - по суті це просто рядок байтів. Адреса байта в рядку, яким буде проводитися заміщення вмісту регістра al, визначається сумою (bx) + (al), тобто вміст al виконує роль індексу в байтовому масиві.
При роботі з командою xlat зверніть увагу на такий тонкий момент. Незважаючи на те, що в команді вказується адреса рядка байтів, з якої повинно бути забрано нове значення, ця адреса має бути попередньо завантажена (наприклад, за допомогою команди lea) в регістр bx. Таким чином, операнд [адреса_таблиці_перекодування] насправді не потрібен (необов'язковість операнда показана занесенням його в квадратні дужки). Що стосується рядка байтів (таблиці перекодування), то вона являє собою область пам'яті розміром від 1 до 255 байтів (діапазон числа без знака в 8-бітному регістрі).
Як ілюстрацію роботи даної команди ми розглянемо програму, яка перетворює двозначне шістнадцяткове число, що вводиться з клавіатури (тобто в символьному вигляді), в еквівалентне двійкове представлення в регістрі al. У лістингу 2 наведено варіант цієї програми з використанням команди xlat.
Сама по собі програма проста; складність викликає звичайно формування таблиці перекодування. Обговоримо цей момент детальніше.
Перш за все потрібно визначитися зі значеннями тих байтів, які ви будете змінювати. У нашому випадку це символи шістнадцяткових цифр. Сконструюємо в сегменті даних таблицю, в якій на місця байтів, що відповідають символам шістнадцяткових цифр, поміщаємо їх нові значення, тобто двійкові еквіваленти шістнадцяткових цифр. Рядки 8-10 лістингу 2 демонструють, як це зробити. Байти цієї таблиці, зміщення яких не збігаються зі значенням кодів шістнадцяткових цифр, нульові. Такими є перші 48 байт таблиці, проміжні байти і частина в кінці таблиці.
Бажано визначити всі 256 байтів таблиці. Справа в тому, що якщо ми помилково помістимо в al код символу, відмінний від символу шістнадцятковій цифри, то після виконання команди xlat отримаємо непередбачуваний результат. У разі лістингу 2 це буде нуль, що не зовсім коректно, тому що незрозуміло, що ж насправді було в al - код символу "0" або щось інше.
Тому, мабуть, є сенс тут поставити "захист від дурня", помістивши в невикористовувані байти таблиці якийсь певний символ. Після кожного виконання xlat потрібно буде просто контролювати значення в al на предмет збігу з цим символом, і якщо воно сталося, видавати повідомлення про помилку.
Після того як таблиця складена, з нею можна працювати. У сегменті команд рядок 18 ініціалізує регістр bx значенням адреси таблиці tabl. Далі все дуже просто. По черзі вводяться символи двох шістнадцяткових цифр, і проводиться їх перекодування у відповідні двійкові еквіваленти.
2. Група арифметичних команд і даних
Мікропроцесор може виконувати цілочисельні операції та операції з плаваючою точкою (комою). Для цього в його архітектурі є два окремі блоки:
• пристрій для виконання цілочисельних операцій;
• пристрій з плаваючою точкою (співпроцесор).
Кожен з цих пристроїв має свою систему команд. У принципі, цілочисельний пристрій може взяти на себе багато функцій пристрою з плаваючою точкою, але це потребує великих обчислювальних витрат. Для більшості завдань, що використовують мову асемблера, достатньо цілочисельної арифметики.