MS-DOS для программиста
© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.
2.3. Программа CVTADDR
Программа CVTADDR (листинг 2.1) выводит на консоль
адрес векторной таблицы связи.
Листинг 2.1. Файл cvtaddr\cvtaddr.cpp
#include <stdio.h>
#include <conio.h>
#include <dos.h>
typedef struct
{
unsigned mcb_seg;
void far *dev_cb;
void far *file_tab;
void far *clock_dr;
void far *con_dr;
unsigned max_btbl;
void far *disk_buf;
void far *drv_info;
void far *fcb_tabl;
unsigned fcb_size;
unsigned char num_bdev;
unsigned char lastdriv;
} CVT ;
typedef CVT far* LPCVT ;
void main(void)
{
union REGS regs;
struct SREGS sregs;
LPCVT lpCVT;
// Получаем адрес векторной таблицы связи
regs.h.ah = 0x52;
intdosx (®s, ®s, &sregs);
// Передвигаем указатель на поле msb_seg
lpCVT = (LPCVT )MK_FP (sregs.es, regs.x.bx - 2);
// Выводим адрес векторной таблицы связи,
// вычисленный с учетом смещения
printf("\nАдрес CVT : %Fp", (LPCVT )lpCVT);
printf("\n\nНажмите любую клавишу...");
getch();
}
Обратите внимание, что указатель lpCVT
устанавливается на поле msb_seg, для чего значение
компоненты смещения адреса, полученного от
функции 52h, уменьшается на 2 байта. Это сделано для
удобства использования структуры CVT .
При выводе адреса векторной таблицы связи мы
использовали спецификацию формата вывода %Fp. Эта
спецификация удобна для вывода значения
дальнего указателя в формате
<сегмент:смещение>.
|