Введение в технологию программирования на языке Ассемблера, страница 8

Завершить выполнение COM-программы можно непосредственно командой Int 20h. Однако  команда ret на один байт короче но, в то же время, передает управление на нулевой адрес текущего сегмента, то есть на первый байт PSP. А там находится код команды Int 20h, которая  используется для возвращения управления в DOS. (DOS при вызове COM-файла помещает в стек сегментный адрес программы и ноль).

                                         Модель памяти small.

Модель small, используемая при написании большинства ассемблерных программ,  предусматривает размещение кода программ отдельно в кодовом сегменте, а данные и стек, объединенные в одну группу (DGROUP), - в другом отдельном сегменте. Для Ассемблеров MASM и TASM вместо DGROUP можно использовать предопределенную метку @data.Переходы в программе и вызовы подпрограмм, а также доступ ко всем переменным осуществляется с помощью короткой (near) адресации. В результате трансляции ассемблерных программ, при использовании этой модели памяти, формируется исполняемый файл типа exe.

При запуске exeпрограммы,регистр DS должен содержать указатель начального адреса размещения сегмента, в котором находятся данные и стек программы. Однако к этому времени в DS содержится служебный блок префикса программного сегмента PSP. Поэтому первой командой в кодовом сегменте должна быть команда инициализации (указания размещения в адресном пространстве) общего сегмента данных и стека, который обычно носит предопределенное имя DGROUP, или @data. Это указание осуществляется занесением в сегментный регистр DS этого предопределенного имени. Но команд для непосредственной пересылки данных из памяти в сегментный регистр DS нет. Поэтому для инициализации регистра DS используют две команды. Сначала начальный адрес этого общего сегмента данных и стека заносят в регистр общего назначения AX, а затем передают его в сегментный регистр DS.

Размер стека, в программе, транслируемой при модели памяти small, должен задаваться непосредственно, в отличие от случая использования модели tiny, при которой стек формируется автоматически.

Например:  .model small

                    .steck 100h

Если же размер стека явно не указан, по умолчанию он будет сформирован размером 1 Кбайт.

Открытие (начало) сегмента данных определяется строкой с упрощенной директивой .data. В последующих строках директивами резервирования и инициализации данных (псевдокомандами определения переменных) осуществляется описание всех данных, которые будут использоваться в ассемблируемой программе.

Псевдокоманда – это директива ассемблера, которая приводит к включению данных или кода в программу, хотя сама никакой команде процессора не соответствует. Псевдокоманды определения переменных указывают Ассемблеру, что в соответствующем месте программы  (по соответствующему адресу) располагается переменная, устанавливают ее тип (байт, слово, вещественное число и т.д.), задают начальное значение и ставят в соответствие переменной ее имя, которое будет использоваться для обращения к этим данным.

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

         Имя_переменной              d*                значение

гдеd* - одна из нижеприведенных директив:

    db – определить байт;

    dw – определить слово (два байта);

    dd – определить двойное слово (четыре байта);

и еще несколько определений более крупных единиц данных.

Поле значения может быть представлено одним или несколькими числами, строкой символов (взятой в кавычки), а также   операторов ?  и DUP, разделенных запятыми. Если будет в этом поле записано несколько чисел, то имя переменной будет соответствовать адресу первого из указанных значений. Если вместо конкретного значения числа будет записан оператор ?, переменная считается неинициализированной и ее значение на момент запуска программы может оказаться произвольным. Оператор DUPслужит для заполнения последовательности ячеек памятинекоторымиповторяющимися данными.

Например, директива:

                    Table1               db              128 dup(FFh)

cоздает массив единиц в памяти объемом 128 байт, начиная с ячейки по адресу, определенному меткой Table1. А директива:

                     Table2               dw              512 dup(?)

создает массив из 512 неинициализированных слов, адрес первого из которых указывает переменная Table2.      

При необходимости формирования целого сегмента неизменяемых данных, т.е. таблицу констант, часто используют директиву .const, а при задании сегмента неинициализированных данных – директиву .data?.

Пример программы с использованием модели памяти типа small.

; Progr2.asm

; Выводит на экран сообщение о результате  и завершается.          

                    .model         small                     ; Задание модели памяти.

                    .stack           100h                     ; Инициализация сегмента стека.

                    .data

data1              dw             0035h                               ; Инициализация данных.        

data2             dw             0010h                               ;

data3              dw             0010h                   ;        

data4              dw                  ?                      ;

message         db              ‘результат равен:‘,’$'       

                    .code

main            proc

                    mov             ax, DGROUP       ; Инициализация

                    mov             ds, ax                    ; сегмента данных

                    mov              ax, data1                        

                    mov             bx, data2

                    mul              bx                         

                    div               data3

mov             [data4],ax

                    mov             ah, 09                     ;

                    mov             dx, offset message ; вывод строки на экран          

                    int                21h                        ;

                    mov             ah, 40h                   ; вывод результата

                    mov             bx, 01                               ; вывод на экран

                    mov             cx, 02                     ; число выводимых байтов