Міністерство освіти та науки України
Національний університет «Львівська політехніка»

ЗВІТ
З лабораторної роботи №3
З дисципліни: «Засоби системного програмування»
На тему: «Розподіл пам’яті в мовы програмування Асемблер»

Завдання:
Написати програму для ознайомлення з різними типами представлення даних і розподілом пам’яті для їх збереження. Лістинг програми (вмістиме файлу *.lst):
.model small
.stack 100h
.data
msg db 'hello','$' ; 6 байт
A dw 2 dup(-1,3/2) ; 4 байта
B dw 1234h, 0ff01h ; 4 байта
C dw 1234Q, 1010B ; 4 байта
D dd 1.0E2, 0C0000010r ; 8 байт
E dw $ - msg ; 2 байта
F DW E ; 2 байта
G DQ -1.2 ; 8 байт
.code
go:
mov ax, @data
mov ds,ax
mov ah, 4Ch
int 21h
end go
Аналіз вхідних даних і вмістимого дампу пам’яті:
Дамп пам’яті містить наступні дані:
‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘$’ -1 3/2 -1 3/2 1234h 0ff01h 1234Q 1010B
68
65


6F
24
FF FF
01 00
FF FF
01 00
34 12
01 FF
9C 02
0A 00

1.0E2 0C0000010r $-msg E -1.2
00 00 С8 42
10 00 00 C0
1E 00
1E 00
33 33 33 33 33 33 F3 BF


‘h’ – 68 – 16-ий код ASCII
‘e’ – 65 – 16-ий код ASCII
‘l’ – 6C – 16-ий код ASCII
‘l’ – 6C – 16-ий код ASCII
‘o’ – 6F – 16-ий код ASCII
‘$’ – 24 – 16-ий код ASCII
-110 = -0000 0000 0000 00012 – прямий код
1111 1111 1111 11112 – доповняльний код
FF FF16
3/2 = 1 – діляться 2 цілих числа, тому результат цілий, відкидається дробова частина. 110 = 0000 0000 0000 00012 = 00 0116
2 dup ()- двічі дублює дані в розміщені в дужках
1234h – так і представляється в пам’яті 123416
0FF01 – аналогічно до попереднього випадку 0 напочатку числа вказує, що це число, а не мітка
1234Q = 12348 = 0000 0010 1001 11002 = 02 9С16
1010B = 0000 0000 0000 10102 = 00 0A16
1.0E2 = 100,010 = 64,016 = 0110 0100,02
1 біт 8 біт 23 біта
s
e

m


s = 0 (знак +)
m = 1,100 1000 0000 0000 0000 0000
e = 6 + 127 = 13310 = 8516 = 1000 01012
0100 0010 1100 1000 0000 0000 0000 0000
42 C8 00 00
В пам’ять буде записано 42 C8 00 00
0C0000010r – дані, які реально записані в пам’ять. Ці дані можуть бути числом з плаваючою комою
Якщо підставити ці дані під формат з плаваючою комою отримаємо:
1 біт 8 біт 23 біта
s
e

m



s
e
m

1
1000 0000
000 0000 0000 0000 0001 0000

(-1)S1,m2e -127 - за цією формулою отримаємо результат
(-1)11,02128-127 = -1*2,01 = -2,010
$ - Містить зміщення в сегменті наступної вільної комірки пам’яті (00 1E)
msg – мітка яка вказує на сегмент даних (00 00)
В результаті виконання операції $ - msg отримаємо значення 00 1E, яке вказує на кількість байт які займає сегмент даних до використання символа $
E – в пам'ять заносить адреса на яка вказує мітка E (00 1E)
-1,210 = -1,0011(0011)2
1 біт 11 біт 52 біта
s
e

m


S = 1 (знак мінус)
e = 0111 1111 111
m = 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011
s
e
m

1
0111 1111 111
0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011

В пам'ять буде записано BF F3 33 33 33 33 33 33

Висновок і результат роботи програми:

Висновок: я ознайомився з різними представленнями даних в мові асемблер і навчився застосовувати їх, також з розподілом пам’яті для зберігання різнотипної інформації.