МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Лабораторна робота №3
з дисципліни " Засоби системного програмування "
Тема: способів представлення даних в пам’яті комп’ютера з архітектурою х86.
Мета: вивчити способи задання констант та змінних в Асемблері, набути навики інтерпретування даних в пам’яті комп’ютера з архітектурою х86.
Теоретична частина.
Визначення даних в мові Assembler.
Асемблер допускає два основні методи визначення даних: через вказування довжини даних та за їх значенням. В першому випадку використовуються директиви визначення даних, а у другому безпосереднє значення або директива EQU.
Розглянемо основний формат визначення даних:
[ім’я] Dn вираз
- Ім’я елемента даних не є обов’язковим але якщо в програмі є посилання на деякий елемент, те це робиться за допомогою імені.
- Для визначення елементів даних є наступні директиви:
DB (байт)
DW (слово – 2 байти)
DD (подвійне слово – 4 байти),
DQ (8 байт)
DT (10 байт).
Вираз може містити константу, наприклад: FLD1 DB 25,
або знак питання для невизначеного значення, наприклад: FLDB DB ?
Вираз може містити кілька констант, розділених комами й обмеженими тільки довжиною рядка:
FLD3 DB 11, 12, 13, 14, 15, 16, ...
Асемблер визначає ці константи у вигляді послідовності сусідніх байт. Звертання за FLD3 вказує на першу константу 11, за FLD3+1 - на другу 12. (FLD3 можна представити як FLD3+0).
Наприклад команда MOV AL,FLD3+3 завантажує в регістр AL значення 14 (0Eh).
Вираз допускає також повторення константи в наступному форматі:
[ім’я] Dn кількість повторень DUP (вираз) ...
Директива 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.
Директива LABEL
Директива LABEL створює мітку, яка не займає місця в пам’яті, а просто вказує на адресу команди або дані, що слідують за нею. Має наступний формат:
мітка LABEL тип
Мітка – це назва мітки, параметр тип може приймати одне з значень: BYTE (1 байт), WORD (2 байти), DWORD (4 байти), FWORD (6 байт), QWORD (8 байт), TBYTE (10 байт), NEAR (ближня мітка), FAR (дальня мітка). Мітка отримує значення рівне зміщенню в сегменті адрес наступної за нею команди або зміщенню в сегменті даних наступного за нею операнду і тип вказаний явно. За допомогою міток з різними типами зручно організовувати доступ до одних і тих самих даних, що інтерпретуватимуться по різному в залежності від типу мітки. Наприклад, як байти чи як слова. Або здійснювати ближні чи дальні переходи.
Вирівнювання сегментів
Оголошення сегменту має наступну структуру:
ім’я_сегменту segment readonly вирівнювання тип розрядність ’клас’
ім’я_сегменту ends
П’ять операндів директиви segment, що відображені курсивом є необов’язковими. Для того, щоб задати вирівнювання сегментів в адресному просторі необхідно задати параметру вирівнювання одне з значень:
BYTE – адреса сегменту може починатися з будь-якої адреси;
WORD – адреса сегменту може починатися з парної адреси;
DWORD – адреса сегменту може починатися з адреси, кратної 4;
PARA – адреса сегменту може починатися з адреси, кратної 16 (границя параграфа);
PAGE – адреса сегменту може починатися з адреси, кратної 256 (границя сторінки).
За замовчуванням вирівнювання відбувається по границі параграфу.
Задавши ’клас’ сегменту можна забезпечити послідовне розташування сегментів у пам’яті. Клас сегменту – це будь-яка мітка, що розташована в лапках. Всі сегменти з однаковим класом розташовуються в пам’яті один за одним.
Індивідуальне завдання
3
A4,B3u,C4,Dfd,E10,F8, K
37788663
Текст програми
STACK SEGMENT PARA STACK 'STACK'
db 100h DUP (?)
STACK ENDS
DATA SEGMENT WORD 'DATA'
HelloMessage db 'Voloshyn',13,10,'$'
A dd 0123Q,0ABCh, 9874
B dw 00A5h,0AB3Ch
C dd 512h
DATA ENDS
DATA1 SEGMENT PARA 'DATA'
LBL LABEL BYTE
D dt 3.1487878788
E dt 11111010b
F dq 12356789ABCDEFh
K equ 37788663h
DATA1 ENDS
CODE SEGMENT PARA 'CODE'
ASSUME cs:CODE, ds:DATA
ProgramStart:
push ds
sub ax,ax
push ax
mov ax,Data
mov ds,ax
mov ah,09
mov dx,OFFSET HelloMessage
int 21h
mov ah,4Ch
int 21h
CODE ENDS
END ProgramStart
Результат програми
/
Висовок: На даній лабораторній роботі я вивчив способи задання констант та змінних в Асемблері, набув навики інтерпретування даних в пам’яті комп’ютера з архітектурою х86.