Сегмент данных предназначен для определения констант, рабочих переменных и областей ввода-вывода.
С этим сегментом связан регистр DS, который содержит адрес текущего сегмента данных.
В модели SMALL описание сегмента данных производится с помощью упрощенной директивы сегментации . DATA.
! Замеч. Из трех сегментных регистров CS, DS, SS необходимо проинициализировать в программе только регистр DS. Регистры CS, SS инициализирует сама операционная система, так как именно она определяет местоположение сегментов кода и стека и «знает», какое значение должно быть записано в соответствующие регистры.
!!! Загрузка базового адреса сегмента данных в регистр DS должна быть выполнена в программе до того, как произойдет первое обращение к данным.
Обычно инициализация сегмента DS производится следующими командами:
MOV AX,@data ; значением @data явл. Физ.адрес сегмента данных
MOV DS,AX ;вместо ax можно использ. любой регистр
общ.назначения
Для описания простых типов данных в программе используются специальные директивы резервирования и инициализации данных, которые, по сути, являются указаниями транслятору на выделение определенного объема памяти.
! Машинного эквивалента этим директивам нет; просто транслятор, обрабатывая каждую такую директиву, выделяет необходимое количество байт памяти и при необходимости инициализирует эту область некоторым значением.
Директивы резервирования и
инициализации данных простых типов:
•db — резервирование памяти для данных размером 1 байт.
•dw — резервирование памяти для данных размером 2 байта.
•dd — резервирование памяти для данных размером 4 байта.
•df — резервирование памяти для данных размером 6 байт;
•dp — резервирование памяти для данных размером 6 байт.
•dq — резервирование памяти для данных размером 8 байт.
•dt — резервирование памяти для данных размером 10 байт.
Формат этих директив :
[<имя >] Dx <выражение>
Выражение может быть
1) константой, Perem1 DB 100
2)последовательностью констант
Massiv DW 0,0,0,0,0 ; 5 элементов. Каждый по 2 б.
3) цепочкой символов, закл. в кавычки
Message DB ‘ Результат выполнения программы - ‘
4) символическим именем (из поля <имя> этой или другой директивы)
Когда
транслятор встречает директивы описания памяти с подобными операндами, то он
формирует в памяти значения адресов тех переменных, чьи имена были указаны в
качестве операндов. В зависимости от директивы, применяемой для получения такого адреса, формируется либо полный адрес
(директива dd) в виде двух байтов сегментного адреса и двух байтов смещения,
либо только смещение (директива dw).
perem2 dd 0f54d567ah
adr dw perem2
adr_full dd perem2
5) вопросительным знаком ? например, Pole db ?
Означает резервирование памяти без
инициализации (присвоения нач. знач.)
Замеч. В памяти этот байт будет 00h.
6) Для повторения операндов можно использовать директиву DUP
(duplicate - повторять, дублировать)
Massiv1 dw 5 DUP (0)
Massiv2 db
10 DUP(0), 10 DUP (1)
Massiv3 db
3 DUP(0), 1,1
Massiv4 db
100 DUP(?)
Stroka db
10 DUP(‘ ‘)
В сегменте данных наряду с директивами резервирования и инициализации данных могут использоваться псевдооператоры EQU и = (директивы определения идентификаторов). Их можно отнести к простейшим макросредствам ассемблера.
С их помощью можно определять символические имена или идентификаторы часто используемых выражений. В ходе трансляции вместо этих имен макроассемблер подставит соответствующие значения. В случае необходимости это позволяет вносить в программу минимум изменений.
Синтаксис псевдооператора EQU (equete -приравнивать).
<имя> EQU <строка или числовое выражение>
Синтаксис псевдооператора =
<имя>
= <числовое выражение>
Отличия псевдооператоров:
1. С помощью EQU имени можно ставить в соответствие как числовые выражения, так и текстовые строки, а псевдооператор = может использоваться только с числовыми выражениями.
2. Идентификаторы, определенные с помощью =, можно переопределять в тексте программы, а определенные с помощью EQU - нельзя.
Замечание.
Чтобы строка воспринималась как текстовая, а не как выражение, ее необходимо
заключить в угловые скобки <строка> . В режиме Ideal строка для EQU
всегда трактуется как текстовая.
Size
equ 10
Ak
equ ax ; переименовали
регистр
length = 50
time = 24
time = time-2
Совет!! Псевдооператор = удобно использовать для определения простых абсолютных (т.е. не зависящих от места загрузки программы в память) математических выражений.
Например, adr1 db 10 dup
(0)
adr2 db 1
dlina adr2-adr1