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



         

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


/p>

Содержимое регистров АХ, вх, сх и DX довольно часто рассматривается как пара 8-разрядных компонент, для обозначения которых используются сочетания АН (старшие 8 битов регистра АХ), AL (младшие 8 битов регистра АХ), ВН, BL, CH, CL, DH, DL.

Если в программу на Си или Паскале не включены непосредственные команды ассемблера, то прямого доступа к машинным регистрам у пользователя нет. Для вызова системной функции по описанной выше схеме приходится обращаться к специальным процедурам-посредникам, которые пересылают значения из данных программы в машинные регистры, моделируют соответствующее программное прерывание и возвращают на поля программы содержимое машинных регистров.

Мы остановимся более детально на двух таких посредниках, считая, что остальными вы научитесь пользоваться самостоятельно.

ТС: int86(n,&in_regs,&out_regs) ;

intdos(&in_regs,&out_regs); //частный случай при n=0х21

ТР: Intr(n,regs);

MSDOS(regs); {частный случай при n=$21}

Часть названия указанных процедур произошла от английского слова interrupt — прерывание. В функциях Си прослеживаются фрагменты обозначений старых процессоров фирмы Intel — 8086, 80186, 80286, 80386, 80486.

Основная часть системных функций поддерживается встроенным программным обеспечением материнской платы, которое раньше было жестко "зашито" в микросхемы BIOS, а теперь находится в более современной перепрограммируемой флэш-памяти. Значительная группа системных функций с общим номером 33 (Ox2i=$2i) составляет часть операционной системы MS-DOS. В этой группе насчитывается 85 подфункций.

В заголовочном файле dos. h описано следующее объединение двух структур:

Struct WORDREGS

{unsigned int ax,t>x, cx,dx, si,di,cflags, flags;} ;

struct BYTEREGS {unsigned char al,ah,bl,bh,cl,ch,dl,dh;};

union REGS {struct WORDREGS x; struct BYTEREGS h;};

К типу REGS относятся аргументы in_regs и out_regs, адреса которых задаются при вызове функций intse и intdos. Если мы включаем в свою программу, например, объединение с именем reg (union REGS reg;), то можем манипулировать c именами полей reg.x. ax, reg.x.bx, reg.h.al, reg.h. ah.




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