Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГОС_ответы.doc
Скачиваний:
35
Добавлен:
27.10.2018
Размер:
21.59 Mб
Скачать

26 Асемблер. Структура програми (директиви сегментування segment та з використанням директиви model; директиви assume; моделі пам’яті; ініціалізація сегментних регістрів)

Микропроцессор имеет шесть сегментных регистров, посредством которых может одновременно работать:

1) с одним сегментом кода; 2) с одним сегментом стека; 3) с одним сегментом данных; 4)с тремя дополнительными сегментами данных.

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

Синтаксис описания сегмента. Для реализации различных вариантов такого объединения и предназначены операнды в директиве SEGMENT .

Все сегменты сами по себе равноправны, так как директивы SEGMENT и ENDS не содержат информации о функциональном назначении сегментов. Для того чтобы использовать их как сегменты кода, данных или стека, необходимо предварительно сообщить транслятору об этом, для чего используют специальную директиву ASSUME. Эта директива сообщает транслятору о том, какой сегмент к какому сегментному регистру привязан. В свою очередь, это позволит транслятору корректно связывать символические имена, определенные в сегментах.

Для простых программ, содержащих по одному сегменту для кода, данных и стека, в трансляторы MASM и TASM ввели возможность использования упрощенных директив сегментации. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL , которая частично стала управлять размещением сегментов и выполнять функции директивы ASSUME. Эта директива связывает сегменты, которые в случае использования упрощенных директив сегментации имеют предопределенные имена, с сегментными регистрами (хотя явно инициализировать ds все равно придется).

title Структура программы

data segment para 'data'

abc db (?)

data ends

stk segment stack

db 256 dup (?) stk ends

code segment para 'code' start:

assume cs:code,ds:data,ss:stk

mov ax,data

mov ds,ax

mov ax,4c00h int 21h

code ends

end start

Регистр ds необходимо специально инициализировать. Это связано с тем, что после загрузки программы в память он содержит адрес начала образа программы в памяти, который начинается с префикса программного сегмента (PSP), создаваемого операционной системой и равного 256 байт. После этой области начинается собственно сегмент кода, и операционная система знает этот адрес и заносит его в регистр сегмента кода. Вслед за сегментом кода располагается сегмент данных и физический адрес начала этого сегмента необходимо загрузить в регистр ds. Поскольку передача непосредственных значений в сегментные регистры запрещена, то это осуществляется обычно через регистр ах.

Далее приведен пример программы с использованием упрощенных директив сегментации:

Листинг 1. Использование упрощенных директив сегментации

;---------Prg_3_1.asm-------------------------------

masm  ;режим работы TASM: ideal или masm

model  small           ;модель памяти

.data                   ;сегмент данных

message db      'Введите две шестнадцатеричные цифры,$'

.stack                  ;сегмент стека

        db      256     dup ('?')       ;сегмент стека

.code                   ;сегмент кода

main  proc            ;начало процедуры main

        mov ax,@data  ;заносим адрес сегмента данных в регистр ax

        mov ds,ax   ; ax в ds

;далее текст программы

        mov  ax,4c00h        ;пересылка 4c00h в регистр ax