Страница 58 из 60
Использование функций базовой системы ввода-вывода и ДОС
В некоторых случаях желательно иметь возможность использо- вать внешние программы, написанные на ассемблере, для доступа к системным функциям. Рассмотрим несколько примеров. Пусть во время работы программы требуется изменить режим экрана. Ниже приводятся семь режимов экрана при использовании цветного графического адап- тера в операционной среде PC-DOS:
Режим Тип Размеры Адаптеры
0 Текст, черно- 40 х 25 CGA, EGA белый
1 Текст, 16 40 х 25 CGA, EGA цветов
2 Текст, черно- 80 х 25 CGA, EGA белый
3 Текст, 16 80 х 25 CGA, EGA цветов
4 Графика, 4 320 х 200 CGA, EGA цвета
5 Графика, 4 320 х 200 CGA, EGA черно-белых тона
6 Графика 640 х 200 CGA, EGA черно-белая
7 Текст, черно- 80 х 25 Монохроматический белый
8 Графика, 16 160 х 200 PCjr цветов
9 Графика, 16 320 х 200 PCjr цветов
10 Графика 320 х 200 PCjr, EGA PCjr - 4 цвета EGA - 16 цветов
13 Графика, 16 320 х 200 EGA цветов
14 Графика, 16 640 х 200 EGA цветов
15 Графика, 4 640 х 350 EGA цвета
Приводимая ниже процедура "mode" выполняет обращение к функ- ции 1 базовой системы ввода-вывода (функция установки режима) для перевода экрана в графический режим 640х200, выдачи на экран со- общения-приветствия "HI" и ожидания нажатия пользователем клавиши "RETURN". При нажатии указанной клавиши будет сделан возврат в режим цветного экрана с размерами 80х25 (приводимая программа бу- дет работать только в операционной системе PC-DOS при наличии цветного графического адаптера): program modetest;
{SL MODE}
procedure Mode(ModeSet:integer):external;
begin Mode(6); WriteLn('hi'); read; Mode(3); end.
Ниже приводится внешняя функция "mode", написанная на ас- семблере:
; Эта процедура делает установку режима экрана, используя ; 1 целочисленный параметр. code segment 'code' assume cs:code public mode mode proc near
; сохранить стек push bp mov bp,sp ; получить режим mov ax,[bp]+4 mov ah,0 ; команда для переключения режима int 010h ; вызов базовой системы ввода-вывода ; восстановление и выход pop bp ret 2 mode endp code ends end
Ниже приводится функция, которая очищает экран посредством процедуры "clr":
program clr_screen;
{SL CLR}
procedure Clr; external;
begin WriteLn('нажмите ВВОД для чистки экрана'); ReadLn; Clr; WriteLn('экран полностью очищен'); end.
Ниже приводится внешняя процедура "clr", написанная на ас- семблере.
; прерывание с номером 6 cseq segment 'code' assume cs:cseq
public clr
clr proc near ; сохранить используемые регистры push ax push bx push cx push dx mov cx, 0 ; начать с начала координат mov dh, 24 ; конец в строке 24 mov dl, 79 ; столбец 79 mov ah, 0 ; установить режим просмотра mov al, 0 ; очистить экран mov bh, 7 int 10h
; восстановление и выход pop ax pop bx pop cx pop dx clr endp cseq ends enu
Другим примером связи с базовой системой ввода-вывода посредством применения ассемблера является функция "xy", которая устанавливает курсор в координаты Х и Y. Эта функция аналогична процедурe "GotoXY", предусмотренной в языке Турбо Паскаль. В ПЭВМ фирмы IBM левый верхний угол экрана имеет координаты (0,0)
program gotoxy;
{$l XY}
var t: integer;
procedure xy(x, y): integer); external ;
begin for t := 0 to 24 do begin xy(t,t); write(t); end; end.
Ниже приводится внешняя процедура "xy", написанная на ас- семблере:
; эта функция устанавливает курсор в координаты (Х,Y) сode cseq segment 'code' assume cs:cseq
public xy xy proc near
; сохранение указателя стека puch bp mov bp,sp
; получить первый параметр mov dh,[up]+4 ; получить Х mov dl,[up]+8 ; получить Y mov ah,2 ; указатель точки перехода для ; BIOS mov bh,0 ; номер страницы int 10h
pop bp ret 4
xy endp
code ends end
|