╩юьрэф√ ьшъЁюяЁюЎхёёюЁэющ Єхїэшъш

DATA SEGMENT


D0аааааааааааааааааа ааааааааааа DBаааааа ааааааааааа 0F1Hаааааааааааааа ааааааааааа ;юфшэ срщЄ Ёртхэ F1H

D1аааааааааааааааааа ааааааааааа DWаааа 4567Hаааааааааааа ааааааааааа ;юфэю ёыютю , Ёртэюх 4567H

D2аааааааааааааааааа ааааааааааа DWаааа D2аааааааааааааааааа ааааааааааа ;юфэю ёыютю, Ёртэюх 0003

D3аааааааааааааааааа ааааааааааа DDааааа ааааааааааа ?ааааааааааааааааааааа ааааааааааа ;фтющэюх ёыютю схч шэшЎшрышчрЎшш

D4аааааааааааааааааа ааааааааааа DBаааааа ааааааааааа 20DUP(?)ааааааа ; фтрфЎрЄ№ срщЄют схч чэрўхэшщ

D5аааааааааааааааааа ааааааааааа DWаааа 10DUP(0)аааааа ;фхё Є№ эєыхт√ї ёыют

DATAаааааааааааа ENDS




─шЁхъЄшт√ DW ё шьхэхь D2, юяЁхфхы ■Є ёыютю, Ёртэюх 0003 - ¤Єю ёьх∙хэшх яхЁхьхэющ D2 юЄэюёшЄхы№эю эрўрыр ёхуьхэЄр, Є.х. ёыютю т ¤Єющ фшЁхъЄштх яЁхфёЄрты хЄ ёюсющ рфЁхё яхЁхьхээющ т ёхуьхэЄх. ╬фшэюўэ√щ тюяЁюёшЄхы№э√щ чэръ т яюых юяхЁрэфр ючэрўрхЄ, ўЄю ёюфхЁцшьюх  ўххъ ярь Єш эх чрфрхЄё  т фшЁхъЄштх. ╩юэёЄЁєъЎш  DUP яЁшьхэ хЄё  фы  ЁрёяЁхфхыхэш  ш шэшЎшрышчрЎшш чрфрээюую ўшёыр хфшэшЎ ярь Єш. ┬ ърўхёЄтх ¤ыхьхэЄют т ъюэёЄЁєъЎш ї DUP ьюуєЄ ЇшуєЁшЁютрЄ№ ўшёыхээ√х ш рфЁхёэ√х т√Ёрцхэш , тюяЁюёшЄхы№э√щ чэръ, ёяшёюъ шыш яютЄюЁэр  ъюэёЄЁєъЎш  DUP.

╤ЄЁюъют√х яхЁхьхээ√х.

╒юЄ  фшЁхъЄштр DB ьюцхЄ ёючфртрЄ№ ёЄЁюъют√х яхЁхьхээ√х, т  ч√ъх рёёхьсыхЁр юЄёєЄёЄтє■Є ёЄЁюъют√х ъюьрэф√ фы  ўЄхэш  ш чряшёш ёЄЁюъ, єфрыхэш  ёшьтюыют, ёЁртэхэш  юфэющ ёЄЁюъш ё фЁєующ. ▌Єш фхщёЄтш  ьюуєЄ с√Є№ Ёхрышчютрээ√х ё яюью∙№■ яЁюЎхфєЁ.

╤є∙хёЄтєхЄ эхёъюы№ъю ёЄЁюъют√ї ЇюЁьрЄют, эряЁшьхЁ,

ааааааааааа ASCII$ -ёЄЁюър - ¤Єю эрсюЁ ASCII-ёшьтюыют , чрърэўштр■∙шщё  чэръюь фюыырЁр $

ааааааааааа ASCIIZ -ёЄЁюър - - ¤Єю эрсюЁ ASCII-ёшьтюыют , чрърэўштр■∙шщё  эєыхт√ь срщЄюь.

─ы  ёючфрэш  ASCII$ - ёЄЁюъш ёыхфєхЄ шёяюы№чютрЄ№ фшЁхъЄштє DB.

str_$ аааааааааааааа db аааааа 'Hello','$'

str_$ аааааааааааааа db аааааа 'Hello $'

ааааааааааа ┴юыхх ЁрёяЁюёЄЁрэхэ√ ASCIIZ- ёЄЁюъш, юэш ёючфр■Єё  Єръцх фшЁхъЄштющ DB

str_0 аааааааааааааа db аааааа 'Hello',0

ааааааааааа ASCII - ёЄЁюъш ьюуєЄ шьхЄ№ фышэє юЄ юфэюую фю Є√ё ў срщЄ.


            Первый байт строки - это либо ASCII символ, либо нулевой байт, называемый также нулевым символом ASCII.

            Если первый символ равен 0, то строка нулевая, поэтому легко создавать переменные нулевой длины.

sbuf      db                    81  dup(0)                   ;80- символьный буфер

При создании строки таким способом всегда следует устанавливать счетчик DUP на 1 больше максимального числа символов, которое планирует записывать в эту строку,  чтобы оставалось место для нуля, которым строка всегда должна закачиваться.

Замечание!

Кавычки в кавычках. Строки, описанные с помощью директивы DB могут браться либо в апострофы ('), либо в двойные кавычки  (").

Простейший метод включения кавычек внутрь строк состоит в использовании различных типов кавычек для выделения всей строки и ее отдельных частей:

st1                   db                    ' "Прекрасно" сказал Иван', 0

st1                   db                    " ' Отлично' сказал Григорий", 0

Локальные метки.

            Различают глобальные и локальные метки. Глобальные метки доступны из любого места программы. Такие метки должны быть все разные, что создает серьезные неудобства при реализации коротких переходов , например таких

            CMP   AX,9                           ;АХ=9?

                                    JE                    SK                                           ;пропустить строку и перейти вниз, если АХ=9

            ADD    CX,10                         ;Иначе прибавить к СХ 10

                        SK:

            Короткие переходы, например JE, на метку SK являются очень часто используемыми для программирования на языке ассемблера. Скорее всего никакие другие команды не будут выполнять переходы на эту же метку, следовательно, метка SK не нужна нигде, кроме этого места. В больших программа таких переходов может существовать очень много и придется придумывать (изобретать) для каждого из них новые имена . Для упрощения этого TURBO ASSEMBLER позволяет создавать локальные метки, существующие в той части программы, в которой они нужны.



            Локальные метки идентичны любым другим меткам, за исключением того, что они начинаются с двух знаков @@. Например,

            @@ 20:

            @@ TWO:

            Внимание! Локальная метка, существует только до следующей глобальной метки.

Пример:

                                   JMP     THERE                       ; Переход на глобальную метку

@@ 20:          INC     AX

                                   CMP   AX, 30

                                   JE                    @@20                                    ; Переход на локальную метку вверх

THERE:           CMP   AX, 30

                                   JE                    @@20                                    ; Переход на локальную метку вниз

                                   XOR    CX, CX

@@20:

Массивы в языке Ассемблера.

            Не существует специальных команд, структур или методов описания и использования массивов на языке Ассемблера. Хотя работать с массивами можно. Так, например, массив целых чисел можно создать используя оператор DUP:

AR      DB       10 DUP (?) -               ;массив из 10 целых элементов.

Можно определить последовательность из 10 значений:

AR      DB                   0,1,2,3,4,5,6,7,8,9

Можно создавать и массивы из составных элементов, например строк:

            AR                  DB                  20 DUP(?),0               : AR [0]

                                                           DB                  20 DUP(?),0               : AR [1]

                                                           DB                   20 DUP(?),0               ; AR [3]

При создании больших массив следует использовать такие директивы :

LABEL -  метка

REPT - повторить

LABEL                       AR                  BYTE

REPT              100

                                                           DB                               20 DUP(?),0

ENDM

            Первая строка описывает метку AR типа BYTE . Здесь можно использовать и другие типы WORD, DWORD и т.д.



            Директива LABEL указывает ассемблеру, как адресовать последующие данные. В памяти она не резервирует никакого пространства.

            В приведенном примере следующие данные являются строками, которые всегда адресуются как одиночные байты.

            Директива REPT (повторить определенное количество раз) (в данном случае 100 раз) повторяет любой оператор языка ассемблера. Все, что находится между  REPT и ENDM (конец макро) повторяется так, как если бы эти строки набрали необходимое количество раз.

Рассмотрим удобный прием изменять каждый раз описание в определении. Например для создания массива из десяти целых элементов и задания каждому элементу массива значений от 0 до 9 можно использовать следующее описание:

VAL = 0                     ;                                              директива присваивания

LABEL           AR                              WORD

REPT              10

                                   DW     VAL

           VAL = VAL+1           ;директива присваивания

ENDM

Индексирование массивов.

            Рассмотрим способы чтения и записи значений в массивы. Например, как обратиться к четвертому элементу массива? Для этого нужно понимать, что в языке ассемблера индексы массивов - это обычные адреса. Поэтому независимо от типа данных, записанных в массив, индексация отдельных значений (т.е. отдельных элементов) сводится к двум шагам:

1)      умножить размер элемента массива на индекс массива; I

2)      прибавить результат к базовому адресу массива.

Пример. В простом массиве байтов, если I=0, тогда I*1=0*1=0 плюс адрес ar (база) определяет первый элемент массива ar [0] Второй элемент ar [1] (I=1) расположен по базовому адресу плюс 1 (I*1=1) и т.д.



            Итак, нужно значение индекса массива преобразовать в адрес памяти. Пример приведен на рис 1.

            Из рисунка видно, что индекс 0 эквивалентен адресу 000D , т.е. базовому адресу всего массива.


Индекс 1 соответствует 000Е, индекс 2 - 000F и так до индекса 7, который определяет элемент с адресом 0014.

Пример. Работа с элементами 100 - битового массива. Режим TURBO ASSEMBLER IDEAL.

DATASEG

AR                  DB                              100 DUP(?)

CODESEG

MOV              AL, [AR+63]   ; Добавление 64-того элемента массива к AL

В большинстве случаев под индексы массивов предпочитают использовать регистры или переменные в памяти. Применяется базовый способ адресации, можно записывать значения индексов массивов в регистр ВХ.

Например, в регистр AL надо загрузить элемент массива AR c индексом index. Это можно сделать так:

DATASEG

INDEX                       DW                 ?

ARRAY                      DB                              10 DUP(?)

CODESEG

MOV              BX, [INDEX]              ; получить значение индекса.

MOV              AL, [BX+AR]             ; AL
Для этих же целей можно использовать регистры SI и DI

MOV  SI, [INDEX]                           ; Получить значение индекса

MOV  AL, [SI+AR]                           ; AL
MOV  DI, [INDEX]                           ; Получить значение индекса

MOV  AL,[DI+AR]                            ; AL
Операторы TYPE, LENGTH, SIZE.

Эти встроенные операторы используются в выражениях, где запрашивается тип информации.

Оператор TYPE (тип) сообщает, сколько байт отведено для переменной (1 (DB) ,    2 (DW) или 4 (DD)).Это тип элемента.

Оператор LENGTH (длина) сообщает число основных единиц памяти (байт, слов или двойных слов), распределенных в строке с определенной переменной. Количество элементов в массиве.

Оператор SIZE (размер) сообщает, сколько байт памяти распределено при определении переменной. Для этих операторов справедливо соотношение.

SIZE<имя> = LENGTH<имя>*  TYPE<имя>

Пример применения рассматриваемых операторов:

DATASEG

AR                  DW     20 DUP(?)                  ; память, выделяемая в сегменте данных под массив,



; нужно подсчитать, какую сумму он занимает в  ; памяти

SUB    AX, AX                                              ; обнулить АХ

MOV  CX, LENGTH AR      ; число элементов массива AR в СХ

MOV  SI, SIZE AR                            ; индекс конца массива

                        SUM:   SUB    SI, TYPE AR                          ; чтобы осуществить переход на предыдущий

; элемент, вычитается размерность элемента массива.

                                               ADD    AX, AR [SI]                ; прибавить элемент

                                               LOOP SUM               ; цикл будет выполняться до тех пор, пока СХ не

; обратится в нуль.

Замена атрибутов переменных.

Переменная имеет три атрибута: тип, сегмент, смещение в сегменте.

Оператор замены типа имеет формат:

                       BYTE

                       WORD                       PTR < имя переменной >

                       DWORD

Конструкция <тип> PTR < имя переменной > означает, что в команде следует использовать сегмент и смещение с именем  <имя переменной>, но с явно заданным типом.

Пример:

MOV  BYTE  PTR     DW5, 7;

ADD   AL, BYTE                   PTR     DW5;

Оператор замены типа требуется для устранения неоднозначности, которая может возникнуть в обращениях типа:

INC    [BХ]                ;инкремент байта или слова ?

            При оперировании байтом нужно явно определить тип операнда:


╤юфхЁцрэшх Ёрчфхыр