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

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 іншим байтом з таблиці в пам'яті, розташованої за адресою, вказаною операндом [адреса_таблиці_перекодування].

Слово "таблиця" вельми умовно - по суті це просто рядок байтів. Адреса байта в рядку, яким буде проводитися заміщення вмісту регістра 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. Група арифметичних команд і даних

Мікропроцесор може виконувати цілочисельні операції та операції з плаваючою точкою (комою). Для цього в його архітектурі є два окремі блоки:

• пристрій для виконання цілочисельних операцій;

• пристрій з плаваючою точкою (співпроцесор).

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

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