Міністерство освіти та науки України
Національний університет «Львівська політехніка»
ЗВІТ
З лабораторної роботи №3
З дисципліни: «Засоби системного програмування»
На тему: «Дослідження способів представлення даних в пам’яті комп’ютера з архітектурою х86.»
Мета: вивчити способи задання констант та змінних в Асемблері, набути навики інтерпретування даних в пам’яті комп’ютера з архітектурою х86.
ЗАВДАННЯ:
Створити *.exe програму, яка розміщує в пам’яті даних комп’ютера, операнди, що задані варіантом. Вхідні операнди А, В, С, D, E, F з індексом u вважати без знаковими і довжиною в байтах, згідно з індексу, з індексом fs вважати з рухомою комою одинарної точності (32 біти), з індексом fd вважати з рухомою комою подвійної точності (64 біти), з індексом fe вважати з рухомою комою розширеної точності (80 біт); операнди А, В, С розмістити в сегменті DATA з довільним вирівнюванням сегменту, D, E, F розмістити в сегменті DATA1 з вирівнюванням сегменту BYTE, WORD, DWORD, PARA, PAGE (див. [5]). Крім цього операнд А є масивом з 3-ох елементів. При оголошені призначити операндам початкові значення використовуючи всі можливі системи лічби. К – константа, довжина якої визначається значенням(згідно варіанту), а значення задане в шістнадцятковому форматі. Для її опису слід використати директиву EQU. Задати одну мітку в довільному місці сегменту даних. В одному з сегментів на вибір розташувати змінну Message db 'Прізвище',13,10,'$', де 'Прізвище' – прізвище виконавця роботи, яке вивести на екран.
За допомогою Debug, дослідити представлення даних в пам’яті комп’ютера для кожного з варіантів вирівнювання (продемонструвати розміщення даних та здійснити інтерпретацію).
Скласти звіт про виконану роботу з приведенням тексту програми з коментарями, дампу пам’яті для кожного з варіантів вирівнювання стеку, та аналітично інтерпретувати дані для кожної зі змінних.
Дати відповідь на контрольні запитання.
ВАРІАНТИ ЗАВДАНЬ:
№
Операнди
K
1
A2,B1u,C4,Dfd,E10,F3, K
1254021
2
A2,B4u,Cfs,D8u,E10,F5, K
202
3
A4,B3u,C4,Dfd,E10,F8, K
37788663
4
A1,B4u,Cfs,D10u,E1,F8, K
45694
5
A8,B1u,C4,Dfd,E10,F5, K
505
6
A2,B4u,Cfs,D8u,E10,F7, K
6DD02316
7
A4,B5u,C4,Dfs,E10,F8, K
717
8
A4,B2u,Cds,D10u,E1,F8, K
88
9
A1,B3u,C4,Dfd,E8,F2, K
29
10
A2,B5u,Cfs,D8u,E10,F4, K
2310
11
A4,B3u,C4,Dfd,E8,F8, K
311
12
A2,B4u,Cfd,D10u,E1,F8, K
7055E0AC
13
A8,B1u,C4,Dfe,E2,F5, K
2513
14
A2,B3u,Cfd,D8u,E10,F1, K
614
15
A4,B5u,C4,Dfe,E10,F8, K
4569600F
16
A1,B3u,Cfe,D10u,E4,F8, K
616
17
A1,B1u,C3,Dfe,E10,F4, K
1017
18
A2,B4u,Cfs,D8u,E10,F5, K
56987018
19
A4,B3u,C4,Dfd,E10,F8, K
4019
20
A8,B4u,Cfe,D10u,E1,F8, K
18932020
21
A10,B1u,C4,Dfs,E8,F5, K
21
22
A8,B4u,Cfd,D8u,E10,F7, K
45781022
23
A4,B5u,C4,Dfe,E10,F8, K
7AA02023
24
A2,B2u,Cfs,D10u,E1,F8, K
74569024
25
A1,B3u,C4,Dfd,E8,F4, K
2B05025
26
A2,B6u,Cfs,D8u,E10,F4, K
6C26
27
A4,B3u,C2,Dfs,E8,F8, K
A77627
28
A8,B4u,Cfd,D10u,E1,F2, K
3FF28
29
A10,B1u,C4,Dfe,E2,F5, K
12A0C029
30
A2,B6u,Cfd,D8u,E10,F1, K
25630
Мій варіант: №2
Лістинг програми
STACK SEGMENT PARA STACK 'STACK'
db 100h DUP (?)
STACK ENDS
DATA SEGMENT PAGE 'DATA'
HelloMessage db 'Bakay',13,10,'$'
A dw 0123Q,0ABCh, 9874
B dd 4513fa12h
C dd 3.14e3; 32/8=4 byte
DATA ENDS
DATA1 SEGMENT DWORD 'DATA'
LBL LABEL BYTE
D dq 1235674489ABCDEFh ; 16 digit (unsigned)
E dt 123567114489ABCDEFh ; 20 digit (signed), >0
F dw 00BCh, 4BCDh, 2ADBh ; 5 byte = 3*2 byte, signed
K equ 202h
DATA1 ENDS
CODE SEGMENT PARA 'CODE'
ASSUME cs:CODE, ds:DATA
ProgramStart:
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 HelloMessage
int 21h
mov ah,4Ch ;DOS terminate program function
int 21h ;end of the program
CODE ENDS
END ProgramStart
Скріншот дампу пам’яті
Червоним кольором виділена змінна HelloMessage, далі жовтим кольором змінна A, фіолетовим кольором змінна B, жовтим кольором змінна C, фіолетовим кольором змінна D, помаранчевим кольором змінна E, червоним кольором змінна F. Асемблер перетворює всі змінні в шістнадцятковий формат і записує байти в об’єктному коді в зворотної послідовності - справа наліво.
Переведення змінних у представлення в пам’яті комп’ютера
В дампі пам’яті всі змінні зберігаються в 16 системі числення.
Символьна змінна HelloMessage зберігається в пам’яті за допомогою ASCII коду – записується 16-кове значення кожного символу.
B – 42
a – 61
k – 6B
a – 61
y – 79
13 – 0D
10 – 0A
$ – 24
В результаті в дампі ми отримаємо: 42 61 6B 61 79 0D 0A 24
Під кожний елемент змінної А виділяється 2 байти:
Значення 0123Q 8 системи числення переводиться в 16 систему числення – 00 53. Оскільки дані зберігаються в пам’яті комп’ютера в зворотній послідовності, то це число записується в дамп як 53 00. Число 0ABCh змінної А вже є у 16 коді, тому переводити не потрібно, а тільки записується у зворотньому порядку – BC 0A. Число 9874 змінної А задане у 10 системі числення. Переводимо його у 16 СЧ і отримуємо число 26 92, а за аналогічним принципом воно в пам’яті запишеться як 92 26.
Під змінну B виділяється 4 байти. Вона є вже записана у 16 СЧ: 4513FA12h, тому переводити не потрібно, а тільки записати у зворотній послідовності: 12 FA 13 45.
Під змінну C також виділяється 4 байти. Ця змінна є у форматі з рухомою комою одинарної точності і записана у 10 СЧ. Після переводу у 16 СЧ буде 45444000h, а у зворотньому порядку в дампі отримаємо 00 40 44 45.
Два наступних байти пропускаються, оскільки вирівнювання наступного сегменту є зі значенням DWORD, а отже адреса сегменту може починатися тільки з адреси кратної 4.
Змінна D займає 8 байт і вже є записана у 16 СЧ: 1235674489ABCDEFh, тому переводити не потрібно, а тільки записати у зворотній послідовності: EF CD AB 89 44 67 35 12.
Змінна E займає 10 байт і вже є записана у 16 СЧ: 00123567114489ABCDEFh, тому переводити не потрібно, а тільки записати у зворотній послідовності: EF CD AB 89 44 11 67 35 12 00.
Під кожний елемент змінної F виділяється 2 байти:
Значення 00BCh є у 16 системі числення, тому просто записуємо у зворотньому порядку – BC 00. Аналогічно робимо і для решти частин змінної F: 4BCDh => CD 4B, 2ADB => DB 2A.
Висновок
На цій лабораторній роботі я вивчив способи задання констант та змінних в Асемблері, набув навики інтерпретування даних в пам’яті комп’ютера з архітектурою х86.