Міністерство освіти і науки
Національний університет «Львівська політехніка»
Кафедра ЕОМ
Звіт
до лабораторної роботи № 3
з дисципліни: “ Засоби системного програмування”
на тему: “ Дослідження способів представлення даних в
пам’яті комп’ютера з архітектурою х86”
Мета
Вивчити способи задання констант та змінних в Асемблері, набути навики інтерпретування даних в пам’яті комп’ютера з архітектурою х86.
Короткі теоретичні відомості
Асемблер допускає два основні методи визначення даних: через вказування довжини даних та за їх значенням. В першому випадку використовуються директиви визначення даних, а у другому безпосереднє значення або директива EQU.
Розглянемо основний формат визначення даних:
[ім’я] Dn вираз
- Ім’я елемента даних не є обов’язковим але якщо в програмі є посилання на деякий елемент, те це робиться за допомогою імені.
- Для визначення елементів даних є наступні директиви:
DB (байт)
DW (слово – 2 байти)
DD (подвійне слово – 4 байти),
DQ (8 байт)
DT (10 байт).
Директива EQU
Директива EQU не визначає елемент даних, але визначає значення, що може бути використане для підстановки в інших командах.
Директива LABEL
Директива LABEL створює мітку, яка не займає місця в пам’яті, а просто вказує на адресу команди або дані, що слідують за нею. Має наступний формат:
мітка LABEL тип
Мітка – це назва містки, параметр тип може приймати одне з значень: BYTE (1 байт), WORD (2 байти), DWORD (4 байти), FWORD (6 байт), QWORD (8 байт), TBYTE (10 байт), NEAR (ближня мітка), FAR (дальня мітка). Мітка отримує значення рівне зміщенню в сегменті адрес наступної за нею команди або зміщенню в сегменті даних наступного за нею операнду і тип вказаний явно. За допомогою міток з різними типами зручно організовувати доступ до одних і тих самих даних, що інтерпретуватимуться по різному в залежності від типу мітки. Наприклад, як байти чи як слова. Або здійснювати ближні чи дальні перерходи.
Завдання:
Створити *.exe програму, яка розміщує в пам’яті даних комп’ютера, операнди, що задані варіантом.Вхідні операнди А, В, С, D, E, F з індексом u вважати без знаковими і довжиною в байтах, згідно з індексу, з індексом fs вважати з рухомою комою одинарної точності (32 біти), з індексом fd вважати з рухомою комою подвійної точності (64 біти), з індексом fe вважати з рухомою комою розширеної точності (80 біт); операнди А, В, С розмістити в сегменті DATA з довільним вирівнюванням сегменту, D, E, F розмістити в сегменті DATA1 з вирівнюванням сегменту BYTE, WORD, DWORD, PARA, PAGE. Крім цього операнд А є масивом з 3-ох елементів. При оголошені призначити операндам початкові значення використовуючи всі можливі системи лічби. К – константа, довжина якої визначається значенням(згідно варіанту), а значення задане в шістнадцятковому форматі. Для її опису слід використати директиву EQU. Задати одну мітку в довільному місці сегменту даних. В одному з сегментів на вибір розташувати змінну Message db 'Прізвище',13,10,'$', де 'Прізвище' – прізвище виконавця роботи, яке вивести на екран.
За допомогою Debug, дослідити представлення даних в пам’яті комп’ютера для кожного з варіантів вирівнювання (продемонструвати розміщення даних та здійснити інтерпретацію).
Скласти звіт про виконану роботу з приведенням тексту програми з коментарями, дампу пам’яті для кожного з варіантів вирівнювання стеку, та аналітично інтерпретувати дані для кожної зі змінних.
Індивідуальне завдання(Варіант 27):
№
Операнди
K
27
A4,B3u,C2,Dfs,E8,F8, K
A77627
Текст програми та результати її виконання:
STACK SEGMENT PARA STACK 'STACK'
db 100h DUP (?)
STACK ENDS
DATA SEGMENT WORD 'DATA'
Message db 'YAROM',13,10,'$'
A dd 4513fa12h
B dw 0005h, 00B5Ch
C dw 0123Q,0ABCh, 9874
DATA ENDS
DATA1 SEGMENT WORD 'DATA'
LBL LABEL BYTE
D dd 3.14e3; 32/8=4 byte
E dq 1235674489ABCDEFh ; 16 digit (unsigned)
F dq 1234524489ABCDEFh
K equ A77627h
DATA1 ENDS
CODE SEGMENT PARA 'CODE'
ASSUME cs:CODE, ds:DATA
Start:
push ds ;initialize stack segment
sub ax,ax ;initialize stack segment
push ax ;initialize stack segment
mov ax,Data ;initialize data segment
mov ds,ax ;initialize data segment
mov ah,09 ;display message
mov dx,OFFSET Message
int 21h
mov ah,4Ch ;DOS terminate program function
int 21h ;end of the program
CODE ENDS
END Start
/Рис.1 Результат виконання програми
Дамп пам’яті містить такі дані:
Стрічка яка міститься під міткою Message – “YAROM” ASCII код даної стрічки відповідає сумі ASCII кодів всіх літер стрічки: ВПК: 59 41 52 4F 4D.
Змінна A:
ВПК: 12 FA 13 45
Змінна B:
ВПК: 05 00 5C 0B
Змінна C:
01 23q=00 53h
0A BCh
9874 = 2692h
ВПК: 53 00 BC 0A 92 26
Мітка LBL (параметр типу BYTE)Пам’ять не виділяється, мітка вказує на молодший байт змінної, яка знаходиться зразу після неї, а саме: EF.
Змінна D:
ВПК: 00 40 44 45
Змінна E:
ВПК: EF CD AB 89 44 67 35 12
Змінна F:
ВПК: EF CD AB 89 44 52 34 12
Дамп пам’яті відображено на рис.2, де оранжевим кольором відображена стрічка Message, червоним– змінна А, жовтим– змінна В, зеленим – змінна С, рожевим – змінна D, фіолетовим– змінна E, синім – змінна F. Чорним позначено байт вирівнювання границі. Коричневим колом відмічений перший байт змінної D, на який вказує мітка
“LBL+0”. Константа К не заноситься в пам’ять, а заміняється числом, що їй відповідає у тексті програми на етапі розбору коду препроцесором.
Рис.2. Вмістиме дампу пам’яті
Висновок:
Під час виконання даної лабораторної роботи я дослідив систему представлення даних у пам’яті комп’ютера з архітектурою х86 та вдосконалив навички у користуванні відлагоджувачем Turbo Debuger.