Федеральное агентство по образованию РФ

ГОУ ВПО ИжГТУ

Кафедра ВТ

Лабораторная работа по СПО №3 на тему:

Вызов исполняемых модулей

Выполнил: студент группы 5-78-1

Проверил:

Ижевск 2010 г.

Цель работы: Изучение работы с ресурсами компьютера: видеопамять и мышь. Изучение запуска исполняемых программ из под dos

Задание: Используя функций DOS и BIOS создать цветной оконный интерфейс с выбором исполняемой программы. Работа с меню должна поддерживать мышь и клавиатуру.

Описание основной функции

DOS Fn 4bH: выполнить или загрузить программу -- EXEC

Вход

    AH = 4bH DS:DX = адрес строки ASCIIZ с именем файла, содержащего программу ES:BX = адрес EPB (EXEC Parameter Block - блока параметров EXEC) AL = 0 = загрузить и выполнить

Выход

    AX = код ошибки если CF установлен

Описание:

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

DS:DX указывает на строку ASCIIZ в форме: "d:\путь\имяфайла",0. если диск или путь опущены, они подразумеваются по умолчанию.

ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL.

AL=0 EXEC: так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4aH до вызова EXEC (AL=0). обычная последовательность:

1.  Вызовите функцию 4aH с ES = сегменту PSP и BX = минимальному объему памяти, требуемой вашей программе (в параграфах).

НЕ нашли? Не то? Что вы ищете?

2.  Подготовьте строку ASCIIZ с именем вызываемого программного файла и установите DS:DX на первый символ этой строки.

3.  Подготовьте блок параметров EXEC со всеми необходимыми полями.

4.  Сохраните текущие значения SS, SP, DS, ES и DTA в переменных, адресуемых через регистр CS (CS - это единственная точка для ссылок после того, как EXEC вернет управление от ребенка).

5.  Выдайте вызов EXEC с AL=0.

6.  Восстановите локальные значения SS и SP.

7.  Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC.

8.  Восстановите DS, ES и локальную DTA, если необходимо.

9.  Проверьте код выхода через функцию 4dH WAIT (если надо).

Таблица использованных прерываний:

Номер прерывания

Номер функции

Описание

10h

Ah = 00h

Установка видеорежима

Ah = 02h

Установка курсора в позицию dl = x, dh = y

Ah = 09h

Печать символа по координатам курсора

AL = ASCII код символа

CX = кол-во экземпляров символа

BL = атрибут(цвет)

16h

Ah = 11h

Проверка наличия символа

Если ZF = 0 буфер пуст иначе AL = ASCII код символа

21h

AH = 0Ch

Al = 00h

Очистка буфера клавиатуры

Читает символ без ожидания и без вывода

33h

Ax = 0

Проверка работоспособности мыши

АХ = 0000h, если мышь или драйвер мыши не установлены

АХ = FFFFh, если драйвер и мышь установлены

Ax = 1

Показывает курсор на экране

Ax = 3

Генерирует в регистре BX реакцию:

0бит - если нажата левая клавиша мыши

1бит – если нажата правая клавиша мыши

2бит – если нажата средняя клавиша мыши

СХ = Х-координата

DX = Y-координата

21h

Ah = 4ah

Сжать или расширить блок памяти

ES = сегмент распределенного блока памяти

BX = желаемый размер блока в 16-байтовых параграфах

Ah = 4bh

AL = 00h 

Загрузить и выполнить программу.

DS:DX — адрес ASCIZ-строки с полным именем программы
ES:BX — адрес блока параметров ЕРВ


Листинг программы.

.286

include mac. inc

data segment

fn_ap db '1\ASM_PAS. EXE',0

fn_aa db '1\ASM_ASM. EXE',0

fn_pp db '1\PAS_PAS. EXE',0

fn_pa db '1\PAS_ASM. EXE',0

fn_lr2 db '1\LAB2.EXE',0

keep_ss dw 1

keep_sp dw 1

keep_es dw 1

spc db ' '

a_p db '1. ASM_PAS. EXE',0

a_a db '2. ASM_ASM. EXE',0

p_p db '3. PAS_PAS. EXE',0

p_a db '4. PAS_ASM. EXE',0

lr2 db '5. LAB2.EXE',0

ext db '6. EXIT',0

lst equ 14

l2 equ 11

lse equ 7

lvd equ 6

xb equ 20 ; для кнопок

yb equ 8

dxb equ 10

dyb equ 6

xr1 equ 18 ; для окна

yr1 equ 6

dxr equ 18

dyr equ 10

pr1 dw 0 ; для имитации двойного щелчка

pr2 dw 0

pr3 dw 0

pr4 dw 0

pr5 dw 0

pr6 dw 0

mous dw 0

data ends

steck Segment Stack

dw 128 dup(?)

steck ends

code segment

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

Main proc far

push ds

mov ax,0

push ax

mov ax, data

mov ds, ax

xor dx, dx

mov ax,3h

int 10h ;видеорежим 3 (очистка экрана)

cld ;обработка строк в прямом направлении

window 1fh,1fh,1fh,1fh,1fh,1fh

mov ax,0 ;инициализировать мышь

int 33h

mov ax,1 ;показать курсор мыши

int 33h

m1:

mov ax,3 ;определить состояние мыши

int 33h

cmp bx,1 ;левая кнопка

jne kl ;если не левая - проверяем клавиатуру

cmp mous,1 ;проверяем признак нажатия лев. кн. мыши

mov mous, bx ;сохраняем признак

je m1 ;если равен то возвращаемся к проверке мыши

jmp n1 ;иначе (bx=1 mous=0) то переход к основному коду

kl:

mov mous, bx

mov ah,11h ;проверка наличия символа без ожидания

xor al, al

int 16h

jz m1 ;ZF=1 - буфер пуст

clrkey ;очистка буфера

cmp al,31h ;в al код символа

jl m1

cmp al,36h

jg m1

xor ah, ah

sub al,31h ;по нажатой цифре формируем смещение по вертикале

mov cx, xb ;занесли х (расположение кнопок)

mov dx, yb ;занесли у

add dx, ax ;+ смещение по вертикале

jmp k1

;------

n1: shr cx,3 ; делим на 8

shr dx,3

k1:

;кнопка ap

check xb, lst, yb, n2 ;Если координаты не те то проверяем кнопку aa

cmp pr1,0 ;проверяем признак нажатия

je ap1 ;не нажата - выделить кнопку

jmp ap ;нажата - запустить ехе

ap1: window 3fh,1fh,1fh,1fh,1fh,1fh

priznak 1,0,0,0,0,0

jmp m1

ap:

clrscr

runexe fn_ap ;запуск ехе

window 1fh,1fh,1fh,1fh,1fh,1fh ;вырисовываем окно

priznak 0,0,0,0,0,0

jmp m1

;------

n2:

;кнопка aa

check xb, lst, yb+1,n3

cmp pr2,0

je aa1

jmp aa

aa1: window 1fh,3fh,1fh,1fh,1fh,1fh

priznak 0,1,0,0,0,0

jmp m1

aa:

clrscr

runexe fn_aa

window 1fh,1fh,1fh,1fh,1fh,1fh

priznak 0,0,0,0,0,0

jmp m1

;------

n3:

;кнопка pp

check xb, lst, yb+2,n4

cmp pr3,0

je pp1

jmp pp

pp1: window 1fh,1fh,3fh,1fh,1fh,1fh

priznak 0,0,1,0,0,0

jmp m1

pp:

clrscr

runexe fn_pp

window 1fh,1fh,1fh,1fh,1fh,1fh

priznak 0,0,0,0,0,0

jmp m1

;------

n4:

;кнопка pa

check xb, lst, yb+3,n5

cmp pr4,0

je pa1

jmp pa

pa1: window 1fh,1fh,1fh,3fh,1fh,1fh

priznak 0,0,0,1,0,0

jmp m1

pa:

clrscr

runexe fn_pa

window 1fh,1fh,1fh,1fh,1fh,1fh

priznak 0,0,0,0,0,0

jmp m1

;------

n5:

;кнопка lr2

check xb, l2,yb+4,n6

cmp pr5,0

je lr1

jmp lr

lr1: window 1fh,1fh,1fh,1fh,3fh,1fh

priznak 0,0,0,0,1,0

jmp m1

lr:

clrscr

runexe fn_lr2

window 1fh,1fh,1fh,1fh,1fh,1fh

priznak 0,0,0,0,0,0

jmp m1

;------

n6:

;кнопка exit

check xb, lse, yb+5,m1 ;Если координаты не те то возвращаемся на начало

cmp pr6,0

je ex1

jmp ex

ex1: window 1fh,1fh,1fh,1fh,1fh,3fh

priznak 0,0,0,0,0,1

jmp m1

ex:

;выход из цикла

;------

;выход из программы

mov ax,0003h

int 10h ;видеорежим 3 (очистка экрана)

cld ;обработка строк в прямом направлении

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

int 21h ;вызов прерывания с номером 21h

Main endp

Code ends

Zseg segment

Zseg ends

End Main

Файл с макросами mac. inc

WINDOW macro c1,c2,c3,c4,c5,c6

clrscr

clrkey

;------

ramka xr1,yr1,dxr, dyr,b

ramka xr1+1,yr1+1,dxr-2,dyr-2,b

;------

wrtstr a_p, xb, yb, c1 ;кнопка a-p

wrtstr a_a, xb, yb+1,c2 ;кнопка a-a

wrtstr p_p, xb, yb+2,c3 ;кнопка p-p

wrtstr p_a, xb, yb+3,c4 ;кнопка p-a

wrtstr lr2,xb, yb+4,c5 ;кнопка lr2

wrtstr ext, xb, yb+5,c6 ;кнопка exit

endm

priznak macro a1,a2,a3,a4,a5,a6

mov pr1,a1

mov pr2,a2

mov pr3,a3

mov pr4,a4

mov pr5,a5

mov pr6,a6

endm

wrtstr macro adr, x,y, clr

local n, m

; надпись с адресом adr по х у

lea si, adr

mov dl, x

mov dh, y

n:

xor bh, bh ;номер видеостраницы

mov cx,1 ;длина выводимой строки

mov al,[si]

cmp al,0

je m

mov ah,02h

int 10h

mov bl, clr ; цвет фона и символа

mov ah,09h

int 10h

inc dl

inc si

jmp n

m:

endm

ramka macro x1,y1,dx2,dy2,clr

local m1

push cx

mov dh, y1 ;по вертикале

mov dl, x1 ;по горизонтале

mov cx, dy2

m1:

push cx

xor bh, bh ;номер видеостраницы

mov cx, dx2 ;длина выводимой строки

mov al, spc ;адрес строки в пару ES:BP

mov ah,2h

int 10h

mov bl, clr ;атрибут

mov ah,9h

int 10h

pop cx

inc dh

loop m1

pop cx

endm

check macro x, dxb, y,metka

local p1,n1

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

cmp cx, x

jl p1

cmp cx, x+dxb

jge p1

cmp dx, y

jl p1

cmp dx, y+1

jge p1

jmp n1

p1: jmp metka ;Если координаты не те то переход

n1:

endm

clrscr macro

mov ah,06 ;очистка экрана

mov al,0

mov bh,07

mov dx,184Fh

mov cx,0

int 10h

mov ah,02

mov bh,0

mov dx,0

int 10h

endm

runexe macro name1

local nn

;Макрос загрузки EXE-файла

mov bx, Zseg

mov ax, es

sub bx, ax

mov ah,4ah

int 21h

mov keep_ss, ss ;сохранить копии SS и SP

mov keep_sp, sp

mov keep_es, es

mov dx, offset name1 ;указываем на строку имени файла

mov ax, seg name1

mov ds, ax

mov ah,4bh ;загрузка программы

mov al,0

int 21h

mov es, keep_es

mov ss, keep_ss

mov sp, keep_sp

mov ax, data ;восстанавливаем регистры

mov ds, ax

endm

clrkey macro

push ax

mov ah,0ch ;очистка буфера клавиатуры

mov al,00h ;читает символ без ожидания и без вывода

int 21h

pop ax

endm
Командная строка:

tasm main

tlink main

main

Демонстрация работы программы: