Назад

Назад

Сегмент данных

 

Сегмент данных предназначен для определения констант, рабочих переменных и областей ввода-вывода.

С этим сегментом связан регистр 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