中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-01 11:16
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » 请看这段程序 查看 818 回复 1
楼 主 请看这段程序 发表于 2007-10-10 11:01 ·  中国 浙江 宁波 联通
初级用户
积分 30
发帖 8
注册 2007-10-07 17:44
18年会员
UID 99125
性别 男
状态 离线
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位地址呢?希望各位大侠指教,谢谢!
2 发表于 2007-10-10 14:33 ·  中国 河北 唐山 联通
银牌会员
★★★
积分 1,148
发帖 514
注册 2007-06-01 12:51
19年会员
UID 89959
性别 男
来自 河北
状态 离线
太深奥了 貌似有写DOS软件就是这么实现的 可以用DOS内存工具查一查
论坛跳转: