Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
43
Добавлен:
15.04.2015
Размер:
1.15 Mб
Скачать

Int 10h; вывод символа

ret

asmproc endp

end main

  1. Возврат данных в вызывающую программу

Программа на ассемблере возвращает результат в регистрах:

  • ax – слово

  • al – байт

  • в паре dx:ax – двойное слово: dx – старшие разряды, ax–младшие

  • в паре dx:ax – указатель: dx – адрес сегмента, ax – смещение

Пример взаимодействия программ

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

Program prg;

function addasm : word; external;

{$L <имя>, obj} ; подключение объектного файла

var

value1: word;

value2:word;

rez:word;

begin

value1:=2;

value2:=3;

rez:=addasm;

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

end.

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

masm

model small

data segment word public

extrn value1:word

extrn value2:word

data ends

.code

assume ds:data

main:

addasm proc near

public addasm

mov cx,ds:value1

mov dx,ds:value2

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

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

ret

addasm endp

end main

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

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

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

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

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

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

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

codesg segment para 'code'

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

org 100h

begin:

jmp main

flda dw 250

fldb dw 125

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

main proc

mov ax, flda

add ax, fldb

mov fldc,ax

mov ax,4C00h

int 21h

main endp

codesg ends

end begin

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

tasm/zi <имя>,,

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

tlink /t <имя>,,

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

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

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

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

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

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

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

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

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

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

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

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

cseg segment

org 100h

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

; процедура

begin: jmp short setup

routine proc far

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 ; размер программы