ДИРЕКТИВА ВИЗНАЧЕННЯ ДЕСЯТИ БАЙТ (DT)



Директива DT визначає елементи даних, що мають довжину в десять байт. Призначення цієї директиви зв'язане з "упакованими десятковими" числовими величинами (див. гл.13). По директиві DT генеруються різні константи, у залежності від версії асемблера; для практичного застосування ознайомтеся з посібником з вашому aссемблера. На рис. 5.1 приведені приклади директиви DT для невизначеного елемента і для двосимвольної константи. Програма на рис.5.1 містить тільки сегмент даних. Xоча асcемблер не видає повідомлень про помилки, у таблиці LINK MAP з'явиться попередження: "Warning: No STACK Segment", а компоновщик LINK видасть "There were 1 errors detected" (Виявлена 1 помилка). Незважаючи на це попередження можна використовувати відлагоджувач DEBUG для перегляду об'єктного коду, як показано на рис. 5.2. Права сторона дампа чітко показує символьні дані, як, наприклад, "Personal Computer".

БЕЗПОСЕРЕДНІ ОПЕРАНДИ

На рис. 2.1 у розділі 2 було показано використання безпосередніх операндів. Команда MOV AX,0123H пересилає безпосередню шіст. константу 0123 у регістр AX. Трьохбайтний об'єктний код для цієї команди є B82301, де B8 позначає "переслати безпосереднє значення в регістр AX", a наступні два байти містять саме значення. Багато команд мають два операнди: перший може бути регістр адреси або пам'яті, а другий - безпосередньо константа.

Використання безпосереднього операнда є ефективнішим ніж визначення числової константи в сегменті даних і організації зсилки на неї в операнді команди MOV, наприклад, cегмент даних: AMT1 DW 0123H? cегмент кодів: MOV AX,AMT1.

Довжина безпосередніх операндів.

Довжина безпосередньої константи залежить від довжини першого операнда. Наприклад, якщо випливає що безпосередній операнд є двобайтним, регістр AL має тільки один байт: MOV AL,0123H (помилка) однак, якщо безпосередній операнд коротший, ніж той що одержує операнд, як у наступному прикладі - ADD AX,25H (немає помилки) то асемблер розширює безпосередній операнд до двох байт, 0025 і записує об'єктний код у вигляді 2500.

Безпосередні формати

Безпосередня константа може бути шістнадцятковою, напpиклад, 0123H; десятковою, наприклад, 291 (яку асемблер конвертує в тичину.0123); чи двійковою, наприклад, 100100011В (яка перетвориться в тичину. 0123). Нижче приведений список команд, що допускають безпосередні операнди:

Команди пересилання і порівняння: MOV, CMP.

Арифметичні команди: ADC, ADD, SBB, SUB.

Команди зрушення: RCL, RCR, ROL, ROR, SHL, SAR, SHR.

Логічні команди: AND, OR, TEST, XOR.

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

ДИРЕКТИВА EQU

Директива EQU не визначає елемент даних, але визначає значення, що може бути використане для постановки в інших командах. Припустимо, що в сегменті даних закодовано наступна директиву EQU:

 

TIMES EQU 10

 

Ім'я, у даному випадку TIMES, може бути представлено будь-яким припустимим в асемблері ім'ям. Тепер, в якій-би команді чи директиві не використовувалося слово TIMES асемблер підставить значення 10. Наприклад, асемблер перетворить директиву - FIELDA DB TIMES DUP (?) у FIELDA DB 10 DUP (?).

Ім'я, зв'язане з деяким значенням за допомогою директиви EQU, може використовуватися в командах, наприклад:

 

COUNTR EQU 05

MOV CX,COUNTR

 

Асемблер заміняє ім'я COUNTR у команді MOV на значення 05, створюючи операнд із безпосереднім значенням, так, нібито він закодований.

 

MOV CX,05; Асемблер підставляє 05

 

Тут перевага директиви EQU полягає в тому, що багато команд можуть використовувати значення, визначене по імені COUNTR. Якщо це значення повинне бути змінене, то зміні підлягає лише одна директива EQU. Природньо, що використання директиви EQU розумне лише там, де підстановка має сенс для асемблера. У директиві EQU можна використо- вувати символічні імена:

1. TP EQU TOTALPAY

2. MPY EQU MUL

Перший приклад припускає, що в сегменті даної програми визначено ім'я TOTALPAY. Для будь-якої команди, що містить операнд TP, асемблер замінить його на адресу TOTALPAY. Другий приклад показує можливість використання в програмі слова MPY замість звичайного мнемокоду MUL.

 


Дата добавления: 2019-07-15; просмотров: 208; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!