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

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 (&regs, &regs, &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. Эта спецификация удобна для вывода значения дальнего указателя в формате <сегмент:смещение>.

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