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 ; оставляем программу резидентной