Федеральное агентство по образованию РФ
ГОУ ВПО ИжГТУ
Кафедра ВТ
Лабораторная работа по СПО №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-строки с полным именем программы |
Листинг программы.
.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
Демонстрация работы программы:




