Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

2.2. Как получить адрес векторной таблицы связи

Для получения адреса векторной таблицы связи можно воспользоваться недокументированной функцией 52h прерывания INT 21h . После вызова этой функции регистры ES:BX будут содержать искомый адрес. Так как описание этой функции отсутствует в руководстве по MS-DOS версии 6.22, в следующих версиях операционной системы, возможно, придется искать другой способ получения адреса векторной таблицы связи . Может также измениться формат этой таблицы.

Программа, составленная на языке ассемблера, может получить адрес векторной функции в регистрах ES:BX следующим образом:

mov  ax, 5200h
int  21h

Приведем исходный текст функции, составленной на языке программирования С, которая возвращает тот же самый адрес:

void far *get_cvt(void)
{
  union REGS  inregs, outregs;
  struct SREGS  segregs;

  inregs.h.ah = 0x52;
  intdosx (&inregs, &outregs, &segregs);
  return(MK_FP (segregs.es,outregs.x.bx));
}

Функция get_cvt вызывает прерывание MS-DOS, пользуясь для этого функцией intdosx . В качестве параметров ей передаются адреса структур и объединения inregs, outregs и segregs.

Перед вызовом функции intdosx необходимо записать в поля объединения inregs нужные значения регистров. После того как эта функция вернет управление, в поля объединения outregs и структуры segregs будут записаны значения регистров общего назначения и сегментных регистров, полученные после возврата из обработчика прерывания.

В файле dos.h описаны макрокоманды MK_FP , FP_SEG и FP_OFF :

#define MK_FP (seg,ofs)((void _seg*)(seg)+(void near*)(ofs))
#define FP_SEG (fp)((unsigned)(void _seg*)(void far*)(fp))
#define FP_OFF (fp)((unsigned)(fp))

С помощью макрокоманды MK_FP можно сконструировать дальний указатель из значений сегмента и смещения. Макрокоманды FP_SEG и FP_OFF позволяют выделить из дальнего указателя, соответственно, сегмент и смещение.

[Назад] [Содеожание] [Дальше]