Routine proc far


Org 100h

Cseg segment

Функцию записи в ОП адреса точки входа программы для последующего вызова.

Собственно программу.

Формат резидентной программы

Резидентные программы

End begin

Codesg ends

Main endp

Mov ax,4C00h

Mov fldc,ax

Add ax, fldb

Mov ax, flda

Main proc

Fldb dw 125

Flda dw 250

Jmp main

Org 100h

Особенности com-программы

End main

Addasm endp

Ret

Public addasm

Addasm proc near

Code

Data ends

Data segment word public

Model small

Masm

End.

Begin

Var

value1: word;

value2:word;

rez:word;

value1:=2;

value2:=3;

rez:=addasm;

writeln ('Результат:', rez);

Программа на языке Assembler

extrn value1:word

extrn value2:word

assume ds:data

main:

mov cx,ds:value1

mov dx,ds:value2

add cx,dx ; суммирование

mov ax,cx ; ax загружается результатом

 

COM- программа – односегментная программа.

· Отсутствует стек.

· Отсутствует сегмент данных.

· Данные располагаются в сегменте кода.

Для обхода данных внутри кодового сегмента используется команда jmp. В начале программы должна присутствовать директива org 100h. Эта директива загружает регистр ip адресом 100h для обхода префикса программного сегмента (в момент загрузки программы в ОП регистр CS загружается адресом PSP).

 

Пример программы типа .COM

codesg segment para 'code'

assume cs:codesg, ds:codesg, ss:codesg

begin:

fldc dw ? ;неинициализированные данные

int 21h

 

Создание объектного модуля:

 

tasm/zi <имя>,,

Создание файла с расширением .com:

 

tlink /t <имя>,,

 

DOS – однозадачная ОС, позволяет загружать на выполнение только одну программу, которая занимает все свободное адресное пространство. Загрузка очередной программы приводит к стиранию ранее загруженной программы.

Для сохранения программы в ОП необходимо оформить её по правилам написания резидентной программы. Тогда очередная загружаемая программа не будет стирать ранее загруженную.

 

Формат резидентной программы содержит три смысловые части:

3) Функцию, которая оставляет программу резидентной.

Для выполнения второй функции программа должна вычислять свой адрес входа, размер самой программы.

Резидентная программа может быть представлена в формате .exe-файла, или .com-файла.

Исполняемая часть программы должна заканчиваться директивой IRET.

Пример резидентной программы типа .com

assume cs:cseg, ds:cseg, ss:cseg

; процедура

begin: jmp short setup

push ds ;сохранение регистров

…; здесь тело процедуры

pop ds ; восстановление регистров

iret ;возврат из процедуры

finish equ $ ; определение размера программы

routine endp ; конец процедуры

; установка вектора прерывания

setup:

mov dx, offset routine ; в dx загружается адрес процедуры

;в ds записан адрес сегмента

mov al, 70h ; выбранный номер прерывания

mov ah, 25h ; номер функции прерывания 21

int 21h

;оставляем программу резидентной

mov dx, finish ; размер программы

int 27h ; оставляем программу резидентной