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 позволяют выделить из дальнего указателя, соответственно, сегмент и смещение. |