Board logo

标题: 请看这段程序 [打印本页]

作者: fengdou151     时间: 2007-10-10 13:08    标题: 请看这段程序

char XMS=0,HMA=0,UMB=0;

void (far *xms)(void);
void get_driver_address()
{
  if (XMS)
  {
    asm {
      mov ax,0x4310
      int 0x2f
    }
    xms=(void (far *)())(((long)(_ES)<<16)+_BX);
  }
}
typedef struct xms_mov {
  unsigned long byte_count;             //移动的字节数
  unsigned source_handle;                     //源句柄
  unsigned long source_offset;          //源偏移量
  unsigned destination_handle;          //目的句柄
  unsigned long destination_offset;     //目的偏移量
} xmm;
xmm xmove;

char move_xms(xmm *xmm_ptr)
{
  char error_code=0xff;
  if (XMS)
  {
    unsigned xseg=FP_SEG(xmm_ptr),xoff=FP_OFF(xmm_ptr);
    asm {
      mov ah,0x0b
      mov si,xoff
      mov ds,xseg
    }
    xms();//这条语句的作用是什么?
    error_code=_BL;
  }
  return(error_code);
}

移动常规内存到扩展内存中时具体是怎么操作的,定义这个结构的作用是什么?寄存器SI和DS在这里具体的含义是什么?是指移动到扩展内存中的偏移地址和段基址吗?具体是怎样定位扩展内存的地址呢?如果到扩展内存的数据量很大,是不是通过偏移地址和段基址能够访问扩展内存的32位地址呢?希望各位大侠指教,谢谢!




欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) Powered by Discuz! 2.5