Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекцій із Системного програмування та...docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
786.31 Кб
Скачать

5. Подання символів і рядків

На символ приділяється один байт пам'яті, у який записується код символу - ціле від 0 до 255. У ПК використається система кодування ASCII(American Standard Code for Information Interchange). Вона, звичайно, не містить кодів російських букв, тому в нашій країні застосовується деякий варіант цієї системи з російськими буквами (звичайно це альтернативне кодування ГОСТа).

Деякі особливості цих систем кодування:

- код пробілу менше коду будь-якої букви, цифри й взагалі кожного графічно представлення символу;

- коди цифр упорядковані по величині цифр і не містять пропусків, т.е. з нерівності код ('0')<=код(c)<=код('9') треба, що c - цифра;

- коди більших латинських букв упорядковані відповідно до алфавіту й не мають пропусків; аналогічно з малими латинськими буквами;

- (в альтернативному кодуванні ГОСТа) коди російських букв (як більших, так і малих) упорядковані відповідно до алфавіту, але між ними є коди інших символів.

Рядок (послідовність символів) розміщається в сусідніх байтах пам'яті (у не переверненому виді): код першого символу рядка записується в першому байті, код другого символу - у другому байті й т.п. Адресою рядка вважається адреса її першого байта.

У ПК рядком уважається також і послідовність слів (звичайно це послідовність цілих чисел). Елементи таких рядків розташовуються в послідовних комірках пам'яті, але кожен елемент представлений в "перевернутому" виді.

6. Подання адрес

Адреса - це порядковий номер комірки пам'яті, тобто ненегативне ціле число, тому в загальному випадку адреси представляються так само, як і беззнакові числа. Однак у ПК є ряд особливостей у поданні адрес.

Справа в тому, що в ПК терміном "адресу" позначають різні речі. Часто під адресою розуміється 16-бітовий зсув (offset) адреса осередку, відлічений від початку сегмента (області) пам'яті, якому належить цей осередок. У цьому випадку під адресу приділяється слово пам'яті, причому адрес записується в "переверненому" виді (як і числа-слова взагалі).

В іншому випадку під "адресою" розуміється 20-бітове абсолютне адрес деякої комірки пам'яті. У силу ряду причин у ПК такий адрес задається не як 20-бітове число, а як пари "сегмент : зсув", де "сегмент" (segment) - це перші 16 бітів початкової адреси сегмента памя’ти, якому належить осередок, а "зсув" - 16-бітова адреса цього осередку, відлічений від початку даного сегмента пам'яті (величина 16*сегмент+зсув дає абсолютний адреса осередку). Такі пари записуються у вигляді подвійного слова, причому (як і для чисел) в "перевернутім" виді: у першому слові розміщається зсув, а в другому - сегмент, причому кожне із цих слів у свою чергу представлене в "перевернутім" виді. Наприклад, пари 1234h:5678h буде записана так:

-і-і-і-і-і-і-і-і-і-і-

| 78 | 56 | 34 | 12 |

-і-і-і-і-і-і-і-і-і-і-

зсув сегмент

7. Директиви визначення даних

Для того щоб у програмі на MASM зарезервувати комірки пам'яті під константи й змінні, необхідно скористатися директивами розпізнавання даних - з назвами DB (описує дані розміром у байт), DW (розміром у слово) і DD (розміром у подвійне слово). (Директиви, або команди асемблеру, - це пропозиції програми, якій її автор повідомляє якусь інформацію асемблеру або просить щось зробити додатково, крім перекладу символьних команд на машинну мову.)

У найпростішому випадку в директиві DB, DW або DD описується одна константа, який дається ім'я для наступних посилань на неї. По цієї директиві асемблер формує машинне подання константи (якщо треба, "перевертає" її) і записує в чергову ділянку пам'яті. Адреса цього осередку стає значенням імені: всі входження імені в програму асемблер буде заміняти на цю адресу. Імена, указані в директивах DB, DW й DD, називаються іменами змінних (на відміну від міток - імен команд).

В MASM числа записуються в нормальному (непереверненому) виді в системах числення з підставою 10, 16, 8 або 2. Десяткові числа записуються як звичайно, за шістнадцятирічним числом ставиться буква h (якщо число починається з "цифри" A, B, ..., F, те спочатку обов'язковий 0),за восьмирічним числом - буква q або o, за двійковим числом - буква b.

Приклади:

A DB 162 ;описати константа-байт 162 і дати їй ім'я A

B DB 0A2h ;така ж константа, але з ім'ям B

З DW -1 ;константа-слово -1 з ім'ям З

D DW 0FFFFh ;така ж константа-слово, але з ім'ям D

E DD -1 ;-1 як подвійне слово

Константи-символи описуються в директиві DB подвійно: указується або код символу (ціле від 0 до 255), або сам символ у лапках (одинарних або подвійних); в останньому випадку асемблер сам замінить символ на його код. Наприклад, що випливають директиви еквівалентні (2A - код зірочки в ASCII):

CH DB 02Ah

CH DB '*'

CH DB "*"

Константи-адреси, як правило, задаються іменами. Так, по директиві

ADR DW CH

буде відведене слово пам'яті, якому дається ім'я ADR й у яке запишеться адреса (зсув), що відповідає імені CH. Якщо таке ж ім'я описати в директиві DD, те асемблер автоматично додасть до зсуву імені його сегмент і запише зсув у першу половину подвійного слова, а сегмент - у другу половину.

По кожній з директив DB, DW й DD можна описати змінну, тобто відвести осередок, не давши їй початкового значення. У цьому випадку в правої частини директиви вказується знак питання:

F DW ? - відвести слово й дати йому ім'я F, нічого в цей байт не записувати.

В одній директиві можна описати відразу кілька констант й/або перемінних того самого розміру, для чого їх треба перелічити через кому. Вони розміщаються в сусідніх комірках пам'яті. Приклад:

G DB 200, -5, 10h, ?, 'F'

Ім'я, зазначене в директиві, вважається як іменним першу з констант.

Для посилань на інші в MASM використаються вираження виду <ім'я> + <ціле>; наприклад, для доступу до байта із числом -5 треба вказати вираження G+1, для доступу до байта з 10h - вираження G+2 і т.д.

Якщо в директиві DB перераховані тільки символи, наприклад:

S DB 'a','+','b',

тоді цю директиву можна записати коротше, уклавши всі ці символи в одні лапки:

S DB 'a+b'

І, нарешті, якщо в директиві описується трохи однакових констант (змінних), те можна скористатися конструкцією повторення

k DUP(a,b,...,c)

яка еквівалентна повтореної k раз послідовності a,b,...,c.

Наприклад, директиви

V1 DB 0,0,0,0,0

V2 DW ?,?,?,?,?,?,?,?,?,'a',1,2,1,2,1,2,1,2

можна записати більш коротко в такий спосіб:

V1 DB 5 DUP(0)

V2 DW 9 DUP(?), 'a', 4 DUP(1,2)

Лекція 5

Тема: Структура команд. Виконавчі адреси