ЛАБОРАТОРНА РОБОТА N 3. Визначення даних.
Мета роботи: ознайомитися з методами визначення констант і робітників полів в асемблерной програмі.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
У лабораторній роботі N 1_1 ми задавали необхідні нам дані безпосередньо в команді. Наприклад, ми писали
MOV AX,25
У цьому випадку число 25 стає частиною машинного об'єктного коду. Такий спосіб представлення даних дометаний, якщо задане число (у нашому випадку 25) зустрічається у Вашій програмі один раз. Якщо ж задане число зустрічається в програмі багаторазово, то повторне завдання його в різних командах приведе до невиправданої витрати оперативної пам'яті. Пам'ять під Ваше число буде виділятися щораз, коли Ви його указывете. Більш дометаним є запис числа в осередок оперативної пам'яті, присвоєння цьому осередку мнемонічного імені, і потім звертання до заданого числа вже по імені. У цьому випадку пам'ять під число буде виділятися один раз. У тій же лабораторній роботі N 1_1 ми використовували для збереження результатів обчислень (проміжних і остаточних) регістри загального призначення. Такий спосіб є найбільш швидкодіючим. Однак, у регістрах можна зберігати дуже обмежений обсяг інформації. Замість використання регістрів для збереження результатів можна виділяти в оперативній пам'яті так називані робочі області - визначена кількість осередків оперативної пам'яті, яким можна привласнити імена й у командах звертатися до них по іменах.
В Асемблері для опису вихідних даних і робітників областей в оперативній пам'яті служать директиви ВИЗНАЧЕННЯ ДАНИХ. За допомогою цих директив Ви можете задавати КОНСТАНТИ (числа, значення яких визначаються у вихідному тексті Вашої програми) і ПЕРЕМІННІ (робітники області визначеної довжини, значення яких може змінюватися в процесі роботи Вашої програми). Основний формат визначення даних [ім'я] Dn вираження Ім'я елемента даних не обов'язково, однак, якщо Ви хочете в програмі звертатися до цього елемента, Ви повинні це ім'я вказати. Ім'я задаєте Ви самі за правилами відповідним правилам написання міток (див. лаб. раб. N1_1). Директиви визначення даних (Dn) можуть використовуватися наступні: DB (байт), DW (слово), DD (подвійне слово), DQ (учетверенное слово) і DT (десять байт). У поле 'вираження' може знаходитися: 1. Константа. Наприклад: ABC DB 25 2. Послідовність констант. Наприклад: BCD DB 1,2,3,4,5 Константи в послідовності повинні розділятися комами. Кількість констант у послідовності обмежується довжиною рядка. Ім'я (у нашому приклад BCD) указує на першу константу з послідовності (у нашому прикладі - 1). До другої константи (2) можна звертатися по імені BCD+1, до третин - BCD+2 і так далі. 3. Як вираження може стояти знак питання (?) для невизначеного значення перемееной:
CDE DB (?) У цьому випадку значення перемінної CDE не привласнюється. 4. Вираження допускає повторення чи константи перемінної в наступному виді
[ім'я] Dn число_повторень DUP (вираження) наприклад,
DEF DB 10 DUP(?) Опертор повторення (DUP) може бути вкладеним, наприклад:
EFH DB 10 DUP(4 DUP(2)) У цьому випадку будуть сгенерированы спочатку 4 копії константи 2, а потім це значення повториться 10 разів. У результаті буде сформована послідовність із сорока двійок. Константа, що задається в поле 'вираження' може являти собою символьний чи рядок числову константу. СИМВОЛЬНИЙ РЯДОК використовується для представлення тексту. Вона полягає в чи апострофи лапк, наприклад 'Лабораторна робота N 5' чи "Лабораторна робота N 5' Асемблер переводить кожен символ символьного рядка у відповідний ASCіі-код. Символьний рядок визначається директивою DB, у якій указується більш двох символів у нормальній послідовності ліворуч праворуч.
NAME1 DB 'Лаборатороная робота N 5'
ЧИСЛОВІ КОНСТАНТИ застосовуються для арифметичних значень і для адрес пам'яті. Числова константа вказується в директиві визначення даних безпосередньо, без чи лапк апострофів. Асемблер перетворить усі числові константи в двоичные і записує їх як послідовність байтів у зворотній послідовності - праворуч ліворуч. Числові константи можуть задаватися в наступних форматах. ДЕСЯТКОВИЙ ФОРМАТ приймається по допускає десяткові цифри від 0 до 9 і позначається останньою буквою D. Десятковий формат приймається за замовчуванням, тобто якщо ніяка буква після числа не зазначена, те це десятковий формат. Десятковий формат перетвориться Асемблером у двоичный, котрий у листинге записується в шістьнадцятковому форматі. Наприклад, NAME2 DB 12D чи NAME2 DB 12 ШІСТЬНАДЦЯТКОВИЙ ФОРМАТ допускає цифри від 0 до F і бозначается наприкінці буквою H. Тому що Асемблер думає, що з букви починаються імена, то першою цифрою шістьнадцяткової константи повинна бути цифра від 0 до 9. Якщо Вам потрібно, наприклад, задати константу A0C1H, то можна записати її у вигляді0A0C1H.
NAME3 DB 0CH
ДВІЙКОВИЙ ФОРМАТ допускає цифри 0 і 1 і позначається наприкінці буквою B.
NAME4 DB 11001010B
ВІСІМКОВИЙ ФОРМАТ допускає цифри від 0 до 7 і позначається останньою буквою Q чи O. В даний час вісімковий формат використовується рідко.
NAME5 DB 10Q
Існує ще десятковий формат із плаваючою крапкою, але він використовується в основному для завдання даних для співпроцесора. При завданні символьних рядків і числових констант варто пам'ятати, що, наприклад, '14' і 14 являють собою дві різні константи. Перша перетвориться в два байти ASCіі-кода, що відповідають символам 1 і 4. Друга перетвориться в двійкове число 1110, у шестнадцатиричном представленні 0E. ДИРЕКТИВА ВИЗНАЧЕННЯ БАЙТА (DB) - визначити байт.Символьне вираження в диретиве DB може містити символьний рядок будь-якої довжини (обмежується тільки довжиною асемблерной рядка). Числова константа в диретиве DB може містити одну чи більш однобайтовых констант. Один байт у листинге представляється двома шістьнадцятковими цифрами. Найбільше позитивне шістьнадцяткове число в одному байті - 7F, усі великі числа від 80 до FF представляють негативні значення. У десятковому форматі ці межі виражаються числами +127 і -128. Приклади використання директиви визначення байта: NAME6 DB? NAME7 DB 'Завдання N 5' NAME8 DB 12H NAME9 DB 112 NAME10 DB 01101100B NAME11 DB 10,11,12,13,14 NAME12 DB 2 DUP(10) ДИРЕКТИВА ВИЗНАЧЕННЯ СЛОВА (DW) визначає константи і переменыые имеющие довжину в одне слово - два байти. Символьне вираження в DW обмежено двома символами, що Асемблер переставляє в зворотному порядку. Числове вираження в DW може містити одну чи більш двухбайтовых констант. Два байти представляються чотирма шестнадцатиричными цифрами. Найбільше позитивне шестнадцатиричное число в двох байтах - 7FFF, числа від 8000 до FFFF представляють негативні значення. У десятковому коді ці межі виражаються числами +32767 і -32768. У поле 'вираження' директиви DW може бути підставлене ім'я чи константи перменной, визначеної раніше, наприклад NAME13 DW NAME8 У цьому випадку під ім'ям NAME13 буде буде сгенерирована константа, рівна адресі (смещнгию) константи NAME8. Для директив DW, DD, DQ Асемблер перетворить константи в шестнадцатиричный об'єктний код, але записує їх у зворотному порядку проходження байтів. Таким чином, десяткове значення 12345 перетвориться в 3039H, але записується в об'єктному коді як 3930. Приклади використання директиви визначення слова: NAME14 DW? NAME15 DW 23,64 NAME16 DW '12' NAME17 DW NAME15 NAME18 DW 0110111100001010B NAME19 DW 1F0BH ДИРЕКТИВА ВИЗНАЧЕННЯ ПОДВІЙНОГО СЛОВА (DD) визначає елементи, що мають у довжину два слова - чотири байти. Розмір числових констант, використовуваних у вираженні не повинний перевищувати чотирьох байт (вісім шестнадцатиричных цифр). Найбільше позитивне шестнадцатиричное число, що може бути використане в директиві DD, - 7FFFFFFF. Діапазон негативних чисел - від 80000000 до FFFFFFFF. У десятковому коді діапазон припустимих чисел у цій директиві - від +2147483647 до -2147483648. Асемблер перетворить усі числові константи в шестнадцатиричное представлення, але записує об'єктний код у зворотній послідовності. Десяткове значення 12345 перетвориться в 00003039H, але записується в об'єктному коді як 39300000. Символьне вираження в директиві DD обмежено двома символами. Асемблер перетворить їх у ASCіі-код і вирівнює їх ліворуч як показано в приведеній нижче рядку листинга 0010 33 32 00 00 NAME20 DD '23' Приклади використання директиви визначення подвійного слова: NAME21 DD 1F00FFFFH NAME22 DD 'AB' NAME23 DD? NAME24 DD 45,47,49 NAME25 DD NAME23-NAME21 ДИРЕКТИВА ВИЗНАЧЕННЯ УЧЕТВЕРЕННОГО СЛОВА (DQ) визначає елементи, що мають довжину чотири слова (вісім байт). Використовувані в директиві числові константи не повинні перевищувати розмір вісім байт. Асемблер перетворить усі числові константи в шестнадцатиричное вираження, але записує їх в об'єктний код у зворотній послідовності. Обробка Асемблером символьних рядків у директиві DQ аналогічна обробці в директивах DW і DD. Приклади використання директиви визначення учетверен- ного слова: NAME26 DQ 245H NAME27 DQ 100 ДИРЕКТИВА ВИЗНАЧЕННЯ ДЕСЯТИ БАЙТ (DT) визначає елементи даних, що мають довжину десять байт. Призначена в основному для визначення так званих "упакованих десяткових" числових значень. Генерируемый об'єктний код залежить від версії Асемблера. Приклади використання директиви визначення десяти байт: NAME28 DT? NAME29 DT '23' БЕЗПОСЕРЕДНІ ОПЕРАНДЫ. Константа, що задається безпосередньо в команді, називається безпосереднім операндом. Значення безпосереднього операнда входить у генерируемый для цієї команди об'єктний код. Довжина безпосереднього операнда залежить від довжини першого операнда в команді. Наприклад, у команді MOV AL, XX безпосередній операнд, що ми позначили як ХХ, повинний мати довжину один байт, так регістр AL є однобайтовым регістром. У команді MOV AX, XX безпосередній операнд може мати довжину слово (два байти). При недотриманні цього правила транслятор згенерує повідомлення про помилку.
|