中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 请看这段程序 上一主题 | 下一主题
fengdou151
初级用户





积分 30
发帖 8
注册 2007-10-7
状态 离线
『楼 主』:  请看这段程序

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位地址呢?希望各位大侠指教,谢谢!

2007-10-10 13:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: