Міністерство освіти та науки України Національний університет «Львівська політехніка»
ЗВІТ З лабораторної роботи №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 6С 6С 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
Висновок: я ознайомився з різними представленнями даних в мові асемблер і навчився застосовувати їх, також з розподілом пам’яті для зберігання різнотипної інформації.