Беззнакові й знакові дані.

DT (10 байт).

 

- Вираз може містити константу, наприклад: FLD1 DB 25,

- або знак питання для невизначеного значення, наприклад: FLDB DB ?

Вираз може містити кілька констант, розділених комами й обмеженими тільки довжиною рядка:

FLD3 DB 11, 12, 13, 14, 15, 16, ...

Асемблер визначає ці константи у вигляді послідовності сусідніх байт. Звертання за FLD3 вказує на першу константу 11, за FLD3+1 - на другу 12. (FLD3 можна представити як FLD3+0).

Наприклад команда MOV AL,FLD3+3 завантажує в регістр AL значення 14 (0Eh).

Вираз допускає також повторення константи в наступному форматі:

[ім’я] Dn кількість повторень DUP (вираз) ...

Символьні рядки

Символьний рядок використаються для опису даних, таких як, наприклад, імена людей або заголовки сторінок. Вміст рядка виділяється одинарними лапками, наприклад, ‘PC’ або подвійними лапками - "PC". Асемблер переводить символьні рядки в об’єктний код у звичайному форматі ASCII.

Символьний рядок визначається тільки директивою DB, в якій вказується більше двох символів у нормальній послідовності зліва направо. Отже, директива DB є єдиним можливим форматом для визначення символьних даних.

Числові константи

Числові константи використаються для арифметичних величин і для aдрес пам’яті. Для опису константи лапки не ставляться. Асемблер перетворить всі числові константи в шістнадцятковий формат і записує байти в об’єктному коді в зворотної послідовності - справа наліво.

Десятковий формат. Десятковий формат допускає десяткові цифри від 0 до 9 і позначається останньою буквою D, що можна не вказувати, наприклад, 125 або 125D. Незважаючи на те, що асемблер дозволяє кодування в десятковому форматі, він перетворить ці значення в шістнадцятковий об’єктний код. Наприклад, десяткове число 125 перетвориться в. 7Dh.

Шістнадцятковий формат. Шістнадцятковий формат допускає шістнадцяткові цифри від 0 до F і позначається останньою буквою H. Оскільки асемблер думає, що з букви починаються ідентифікатори, те першою цифрою шістнадцяткової константи повинна бути цифра від 0 до 9. Наприклад, 2EH або 0FFFH, які асемблер перетворить відповідно в 2E і FF0F (байти в другому прикладі записуються в об’єктний код у зворотній послідовності).

Двійковий формат. Двійковий формат допускає двійкові цифри 0 і 1 і позначається останньою буквою B. Двійковий формат звичайно використається для більше чіткого подання бітових значень у логічних командах AND, OR, XOR і TEST. Десяткове 12, шістнадцяткове C і двійкове 1100B усі генерують один і той же код:

Вісімковий формат. Вісімковий формат допускає вісімкові цифри від 0 до 7 і позначається останньою буквою Q або O, наприклад, 253Q.

Формат з рухомою комою. Числові константи з рухомою комою задаються у форматі ціла_частина.дробова_частина Е степінь. Де Е – основа системи лічби (10). Стандарт IEEE 754-2008 визначає кілька форматів представлень чисел з рухомою комою. Розглянемо 3 з них:

· одинарної точності (32 біти): біт 31 – знак мантиси, біти 30-23 – 8-ми бітна зміщена на +127 експонента (порядок), біти 22-0 – 23-бітна мантиса без першої цифри. Для представлення у 10-тковій системі лічби використовується формула: , де S–знак, E – зміщена експонента, М – нормалізована мантиса.

· подвійної точності (64 біти): біт 63 – знак мантиси, біти 62-52 – 11-ти бітна зміщена на +1023 експонента (порядок), біти 51-0 – 52-бітна мантиса без першої цифри (нормалізована мантиса). Для представлення у 10-тковій системі лічби використовується формула: , де S–знак, E – зміщена експонента, М – нормалізована мантиса.

· розширеної точності (80 біт): біт 79 – знак мантиси, біти 78-64 – 15-ти бітна зміщена на +16383 експонента (порядок), біти 63-0 – 64-бітна мантиса з першою цифрою (біт 63 рівний 1). Для представлення у 10-тковій системі лічби використовується формула: , де S–знак, E – зміщена експонента, М – мантиса.

Беззнакові й знакові дані.

Числові поля можуть трактуватися як знакові, або як беззнакові. Це контролюється при написанні програми самостійно. Для беззнакових величин всі біти є бітами даних Для знакових величин лівий біт є знаковим.

Директива визначення байта (DB)

Один байт виражається двома шістнадцятковими цифрами. Для беззнакових величин за допомогою цієї директиви можна представити числа від 0 до 255 (FFh). Для знакових даних найбільше додатне число в одному байті це 7F, всі "більші" числа від 80 до FF представляють від’ємні значення. У десятковому виразі ці межі визначаються числами +127 і -128.

Директива визначення слова (DW)

Директива DW визначає елементи, які мають довжину в одне слово (два байти). . Два байти представляються чотирма шістнадцятковими цифрами. Для беззнакових величин за допомогою цієї директиви можна представити числа від 0 до 65535 (FFh). Для знакових даних найбільше додатне шістнадцяткове число у двох байтах це 7FFF; всі "більші" числа від 8000 до FFFF представляють від’ємні значення. У десятковому форматі ці межі визначаються числами +32767 і -32768.

Символьний вираз в DW обмежений двома символами, які асемблер представляє в об’єктному коді так, що, наприклад, ‘PC’ стає ‘CP’. Для визначення символьних рядків директива DW має обмежене застосування.

Директиви визначення DD,DQ та є аналогічними до DW з відповідними довжинами даних.

Директива EQU

Директива EQU не визначає елемент даних, але визначає значення, що може бути використане для підстановки в інших командах. Припустимо, що в сегменті даних закодовано наступну директиву EQU:

TIMES EQU 10

Ім’я, у цьому випадку TIMES, може бути представлено будь-яким припустимим в асемблері ім’ям. Тепер, у якій би команді або директиві не використалося слово TIMES асемблер підставить значення 10. Наприклад, асемблер перетворить директиву

FIELDA DB TIMES DUP (?)

в директиву

FIELDA DB 10 DUP (?)

Ім’я, пов’язане з деяким значенням за допомогою директиви EQU, може використатися в командах, наприклад:

COUNTR EQU 05

.......

MOV CX,COUNTR

Асемблер заміняє ім’я COUNTR у команді MOV на значення 05, створюючи операнд з безпосереднім значенням, так, ніби було закодовано MOV CX,05 ;Асемблер підставляє 05.

Перевага директиви EQU полягає в тоту, що багато команд можуть використати значення, визначене іменем COUNTR. Якщо це значення повинне бути змінене, то зміні підлягає лише одна директива EQU. Природно, що використання директиви EQU доцільне лише там, де підстановка має сенс для асемблера. У директиві EQU можна використати символічні імена:

 

1. TP EQU TOTALPAY

2. MPY EQU MUL

Перший приклад припускає, що в сегменті дані програми визначене ім’я TOTALPAY. Для будь-якої команди, що містить операнд TP, асемблер замінить його на адресу TOTALPAY. Другий приклад показує можливість використання в програмі слова MPY замість звичайного мнемокоду MUL.

 

Директива LABEL

Директива LABEL створює мітку, яка не займає місця в пам’яті, а просто вказує на адресу команди або дані, що слідують за нею. Має наступний формат:

мітка LABEL тип

Мітка – це назва містки, параметр тип може приймати одне з значень: BYTE (1 байт), WORD (2 байти), DWORD (4 байти), FWORD (6 байт), QWORD (8 байт), TBYTE (10 байт), NEAR (ближня мітка), FAR (дальня мітка). Мітка отримує значення рівне зміщенню в сегменті адрес наступної за нею команди або зміщенню в сегменті даних наступного за нею операнду і тип вказаний явно. За допомогою міток з різними типами зручно організовувати доступ до одних і тих самих даних, що інтерпретуватимуться по різному в залежності від типу мітки. Наприклад, як байти чи як слова. Або здійснювати ближні чи дальні перерходи.

Вирівнювання сегментів

Оголошення сегменту має наступну структуру:

 

ім’я_сегменту segment readonly вирівнювання тип розрядність ’клас’

.....

ім’я_сегменту ends

П’ять операндів директиви segment, що відображені курсивом є необов’язковими. Для того, щоб задати вирівнювання сегментів в адресному просторі необхідно задати параметру вирівнювання одне з значень:

· BYTE – адреса сегменту може починатися з будь-якої адреси;

· WORD – адреса сегменту може починатися з парної адреси;

· DWORD – адреса сегменту може починатися з адреси, кратної 4;

· PARA – адреса сегменту може починатися з адреси, кратної 16 (границя параграфа);

· PAGE – адреса сегменту може починатися з адреси, кратної 256 (границя сторінки).

По замовчуванню вирівнювання відбувається по границі параграфу.

Задавши ’клас’ сегменту можна забезпечити послідовне розташування сегментів у пам’яті. Клас сегменту – це будь-яка мітка, що розташована в лапках. Всі сегменти з однаковим класом розташовуються в пам’яті один за одним.

Контрольні запитання:

1. Як визначаються в Асемблері дані довжиною в 2 байти? Як вони записуються у пам’ять?

2. Чим відрізняються директива EQU від DW ?

3. Як відбувається вирівнювання сегментів?

4. Як у пам’яті визначається число з рухомою комою?

5. Як інтерпретувати число з рухомою комою з розширеною точністю?

 

Література:

1. Р.Джордейн.Справочник програмиста персональных компъютеров типа ІBM PC XT и AT. - M."Финансы и статистика",1992,стор.13-31.

2. Л.О.Березко,В.В.Троценко. Особливості програмування в турбо-асемблері. -Киів,НМК ВО,1992.

3. Л.Дао. Программирование микропроцессора 8088.Пер.с англ.-М."Мир",1988.

4. П.Абель.Язык ассемблера для ІBM PC и программирования. Пер. з англ.-М.,"Высшая школа",1992.

5. Зубков С.В. Assembler для DOS, WINDOWS и UNIX. – М.: ДМК Пресс, 2000. с.106-126.


ЗАВДАННЯ

1. Створити *.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,'$', де 'Прізвище' – прізвище виконавця роботи, яке вивести на екран.

2. За допомогою Debug, дослідити представлення даних в пам’яті комп’ютера для кожного з варіантів вирівнювання (продемонструвати розміщення даних та здійснити інтерпретацію).

3. Скласти звіт про виконану роботу з приведенням тексту програми з коментарями, дампу пам’яті для кожного з варіантів вирівнювання стеку, та аналітично інтерпретувати дані для кожної зі змінних.

4. Дати відповідь на контрольні запитання.

 

 

Варіанти завдань:

Операнди K
A2,B1u,C4,Dfd,E10,F3, K
A2,B4u,Cfs,D8u,E10,F5, K
A4,B3u,C4,Dfd,E10,F8, K
A1,B4u,Cfs,D10u,E1,F8, K
A8,B1u,C4,Dfd,E10,F5, K
A2,B4u,Cfs,D8u,E10,F7, K 6DD02316
A4,B5u,C4,Dfs,E10,F8, K
A4,B2u,Cds,D10u,E1,F8, K
A1,B3u,C4,Dfd,E8,F2, K
A2,B5u,Cfs,D8u,E10,F4, K
A4,B3u,C4,Dfd,E8,F8, K
A2,B4u,Cfd,D10u,E1,F8, K 7055E0AC
A8,B1u,C4,Dfe,E2,F5, K
A2,B3u,Cfd,D8u,E10,F1, K
A4,B5u,C4,Dfe,E10,F8, K 4569600F
A1,B3u,Cfe,D10u,E4,F8, K
A1,B1u,C3,Dfe,E10,F4, K
A2,B4u,Cfs,D8u,E10,F5, K
A4,B3u,C4,Dfd,E10,F8, K
A8,B4u,Cfe,D10u,E1,F8, K
A10,B1u,C4,Dfs,E8,F5, K
A8,B4u,Cfd,D8u,E10,F7, K
A4,B5u,C4,Dfe,E10,F8, K 7AA02023
A2,B2u,Cfs,D10u,E1,F8, K
A1,B3u,C4,Dfd,E8,F4, K 2B05025
A2,B6u,Cfs,D8u,E10,F4, K 6C26
A4,B3u,C2,Dfs,E8,F8, K A77627
A8,B4u,Cfd,D10u,E1,F2, K 3FF28
A10,B1u,C4,Dfe,E2,F5, K 12A0C029
A2,B6u,Cfd,D8u,E10,F1, K

 

 


Приклад виконання

Завдання: Написати програму, яка розміщує в пам’яті даних комп’ютера, операнди, що задані варіантом.
Вхідні операнди А, В, С, D, E, F з індексом u вважати без знаковими і довжиною в байтах, згідно з індексу, з індексом fs вважати з рухомою комою одинарної точності (32 біти), з індексом fd вважати з рухомою комою подвійної точності (64 біти), з індексом fe вважати з рухомою комою розширеної точності (80 біт); операнди А, В, С розмістити в сегменті DATA з довільним вирівнюванням сегменту, D, E, F розмістити в сегменті DATA1 з вирівнюванням сегменту BYTE, WORD, DWORD, PARA, PAGE (див. [5]). Крім цього операнд А є масивом з 3-ох елементів. При оголошені призначити операндам початкові значення використовуючи всі можливі системи лічби. К – константа, довжина якої визначається значенням(згідно варіанту), а значення задане в шістнадцятковому форматі. Для її опису слід використати директиву EQU. Задати одну мітку в довільному місці сегменту даних. В одному з сегментів на вибір розташувати змінну HelloMessage db 'Hello, world',13,10,'$', яку вивести на екран.

 

Задані операнди:

A2,B3u,C4,Dfe,E1,F8, K = 52A8h

 

Операнд B є трибайтним, його можна представити трьома однобайтними, або двома двобайтними числами, або одним 4 байтним з старшим байтом рівним 0, оскільки він є без знаковим. Представлення двобайтними числами є оптимальним варіантом з точки зору ефективності проведення обчислень з цим числом.

Отже, сегмент даних може буде описаний таким чином:

 

DATA SEGMENT WORD 'DATA'

HelloMessage db 'Hello, world',13,10,'$'

A dw 0123Q,0ABCh, 9874

B dw 00A5h,0AB3Ch,

C dd 512h

DATA ENDS

 

DATA1 SEGMENT PARA 'DATA'

LBL LABEL BYTE

D dt 3.14e8

E db 11111010b

F dq 12356789ABCDEFh

K equ 578h

DATA1 ENDS

 

Дамп пам’яті відображено на рис.1, де червоним кольором відображена перша змінна (операнд), бузковим – друга, зеленим – третя, жовтим – четверта для кожного з сегментів. Константа К не заноситься в пам’ять а заміняється числом, що їй відповідає, у тексті програми на етапі розбору коду препроцесором.

 

Рис.1. Вмістиме дампу пам’яті

 

Лістинг програми

 

STACK SEGMENT PARA STACK 'STACK'

db 100h DUP (?)

STACK ENDS

DATA SEGMENT WORD 'DATA'

HelloMessage db 'Hello, world',13,10,'$'

A dw 0123Q,0ABCh, 9874

B dw 00A5h,0AB3Ch

C dd 512h

DATA ENDS

 

DATA1 SEGMENT PARA 'DATA'

LBL LABEL BYTE

D dt 3.14e8

E db 11111010b

F dq 12356789ABCDEFh

K equ 578h

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