Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sistemnoe_programmirovanie / 06 Мр по лаб_раб_Асс_инф.doc
Скачиваний:
135
Добавлен:
18.02.2016
Размер:
1.18 Mб
Скачать

%Title "Имя exe-файла программы"

Ideal ;Переводит Turbo Assembler в режим Ideal

Model small ;Директива описания модели памяти. Вводит упрощенные директивы

;управления сегментами

P486N ;Разрешает инструкции старших поколений процессоров. При её

;отсутствии действует по умолчанию P8086. Разрешает использование

;32 – разрядных регистров для адресации и хранения данных

Stack 256 ;Резервирует пространство для стека программы (значение в байтах,

;следующее за директивой)

;1. Здесь следует располагать макроопределения EQU и =

;2. Вставьте здесь директиву Include "filename"

Dataseg ;Начало сегмента инициализированных данных. Допускается также

;расположение здесь и неинициализированных данных, начальные

;значения которых неизвестны на момент запуска программы

;1. Здесь описываются переменные с помощью директив DB,DW и т. п.

;2. Здесь опишите все переменные типа Extrn

Codeseg ;Начало сегмента кода, т.е. части программы, содержащей команды

; процессора.

;Здесь определите все подпрограммы типа Extrn

Start: mov ax, @data ;Точка начала исполнения программы

mov ds,ax ;Установка в регистре DS адреса сегмента данных

;Здесь располагается программа, вызовы подпрограмм и т. п.

Exit: mov ax,4C00h ;Функция DOS: Выход из программы

int 21h ;Вызов DOS. Останов программы

End Start ;Директива конца программы/точки входа. Текст,

;расположенный после этой строки будет игнорироваться ассемблером.

Рис. 1.1Шаблон структуры программы типа.exe

Образ программы в памяти, представленный на рис. 1.2, начинается с префикса программного сегмента PSP(Program Segment Prefix).PSPвсегда имеет размер 256 байтов и содержит данные, используемые операционной системой в процессе исполнения программы. Вслед заPSPрасполагаются сегменты программы. Сегментные регистрыesиdsавтоматически инициализируются на началоPSP.Это даёт возможность, при сохранении значения одного из регистров, обращаться кPSPв случае необходимости. В указатель командipзагружается относительный адрес точки входа в программу (операнд директивыEND), а в указатель стекаsp-смещение конца сегмента стека. Таким образом, после загрузки программы в память, адресуемыми являются все сегменты, кроме сегмента данных. Использование директивыModel,делает доступным ассемблеру несколько служебных идентификаторов, к которым можно обращаться во время работы программы, чтобы получить информацию об адресах используемых сегментов. Например:

@code– 16-разрядный адрес сегмента кода,

@data – 16-разрядный адрес сегмента данных типаnear,

@stack– 16-разрядный адрес сегмента стека.

Вот поэтому-то имя предопределённого идентификатора @dataи используется в первой паре команд кодового сегмента для загрузки сегмента данных.

Объём памяти, занимаемый программой: (138B-1373)*10h+100h=280h=640 байт

Рис. 1.2Образ программыhello.exeв памяти, загруженной командойTdhello.exe

Завершение программы означает передачу управления командному процессору DOS – Command.com, который выводит на экран системный запрос в ожидании следующей команды от оператора. Делается это с помощью функции DOS (ah = 4Ch). Эта функция требует единственного параметра – кода возврата, который и помещается программой в регистрal. Если этот код равен нулю, то исполнение программы прошло корректно, в противном случае была допущена ошибка в предшествующих обращениях программы к другим системным функциям DOS.

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

Шаблон программы типа .comприведён на рис. 1.3. При компоновке программы необходимо использовать опцию /t, которая указывает на создание файла.com вместо.exe.

Образ памяти программы типа .comпоказан на рис. 1.4. После загрузки программы в память все 4 сегментных регистра указывают на начало единственного сегмента –PSP. Указатель стека автоматически инициализируется числом 0FFFEh. Таким образом, независимо от фактического размера программы, ей выделяется 64 Кбайт адресного пространства, нижнюю часть которого занимает стек.