Практика программирования (Бейсик, Си, Паскаль)



         

Глава 10. - часть 3


При работе с программными прерываниями значения этих полей можно считать идентичными с содержимым соответствующих машинных регистров — АХ, вх, AL, АН. На практике в программах на Си редко используют два разных объединения in_regs и out_regs, первое из которых выполняет роль полей с входной информацией, а второе — роль полей, на которые заносятся результаты работы системной функции. Обычно входные и выходные данные располагают на одном и том же поле.

В этом смысле авторы системы Turbo Pascal поступили более рационально, использовав в аналогичных процедурах на один аргумент меньше. Данные процедур intr и MSDOS располагаются на полях записи с вариантами типа Registers, описанного в модуле DOS следующим образом:

type

Registers=record case integer of

0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,flags:word);

1: (AL,AH,BL,BH,CL,CH,DL,DH:byte) ; end;

Если в программе на Паскале объявлена запись reg (reg:Registers;), то мы можем использовать переменные с именами reg.АХ, RеG.вх, reg.AL, reg.АН, имея в виду, что их значения идентичны содержимому машинных регистров

АХ, ВХ, AL, АН.

Приводимые ниже фрагменты программ заменяют процедуру gotoxy, перемещающую курсор дисплея в позицию с заданными координатами на текстовой странице с указанным номером. Новая функция (процедура) movetoxy обходится только входными данными.

Программа 10_1.с

#include <dos.h>

void movetoxy(int x, int y, int page)

{

union REGS r;

r.h.ah=2; //номер подфункции позиционирования курсора

г.h.bh=page; //номер текстовой страницы, от 0 до 7

r.h.dl=x; //номер столбца, от 1 до 80

r.h.dh=y; //номер строки, от 1 до 25

int86(0xl0,&r,&r); //обращение к группе функций BIOS с номером 16

}

Программа 10_1.pas

program cursor; uses Dos;

procedure movetoxy(x,y,page:byte);

var

Registers r; begin

r.AH:=2;

r.BH:=page;

r.DL:=x;

r.DH:=y;

Intr ($10, r) ;

end;

Примером системной функции, возвращающей несколько результатов, является процедура вывода текущей даты, использующая подфункцию с номером 0х2А ($2A) в прерывании 0x33 ($33). После ее выполнения в участках памяти, соответствующих машинным регистрам, находится следующая информация:




Содержание  Назад  Вперед