PC_DOSSaveReturn();                                    /* Save environment to return to DOS        */

PC_VectSet(VECT_DOS_CHAIN, PC_TickISR);                /* Store MS-DOS\’s tick to chain             */

void PC_VectSet (INT8U vect, void (*isr)(void))
&leftsign;
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif   
    INT16U    *pvect;
   
   
    pvect    = (INT16U *)MK_FP(0×0000, vect * 4);     /* Point into IVT at desired vector location     */
    OS_ENTER_CRITICAL();
    *pvect++ = (INT16U)FP_OFF(isr);                   /* Store ISR offset                              */
    *pvect   = (INT16U)FP_SEG(isr);                   /* Store ISR segment                             */
    OS_EXIT_CRITICAL();
&rightsign;
直接访问0X0000地址,找了半天资料,发现这个;

#include <stdio.h>
#include <dos.h>
main(int argc, char **argv)
&leftsign;
 unsigned int far *vecbase = MK_FP(0×0000, 0×0000);
 int int_num;

 if(argc == 1) &leftsign;
  printf("INTVEC  Shows interrupt vector for an interrupt\\n");
  printf("usage: intvec <IntNum &line; X>\\n");
  printf("X shows all 256 interrupt vectors\\n");
  exit(0);
 &rightsign;

 if((argv[1][0] == \’x\’) &line;&line; (argv[1][0] == \’X\’)) &leftsign;
  for(int_num = 0; int_num < 256; int_num++) &leftsign;
   printf("INT %02Xh vector = ", int_num);
   printf("%04X:%04X\\n",vecbase[int_num * 2 + 1],vecbase[int_num * 2]);
  &rightsign;
 &rightsign; else &leftsign;
  if(sscanf(argv[1],"%X", &int_num)) &leftsign;
   printf("INT %02Xh vector = ", int_num);
   printf("%04X:%04X\\n", vecbase[int_num * 2 + 1], vecbase[int_num * 2]);
  &rightsign; else
   printf("Error: bad number\\n");
 &rightsign;
&rightsign;
好像是打印所有的中断向量?

INT FAh vector = 0080:0001
INT FBh vector = 7C00:0001
INT FCh vector = 4CFA:4E4C
INT FDh vector = 0202:F000
INT FEh vector = 0002:4C72
INT FFh vector = 02F8:03F8

历史博文

标签:,
七月 27, 2005 at 5:07 下午 by yippee 1,014 次
Category: Dev
Tags: ,