中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-10-31 18:19
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行
DOS开发编程 & 发展交流 (开发室) » 请看这段程序
可打印版本  968 / 1
第1楼 fengdou151 发表于 2007-10-10 11:01
初级用户 发帖 8 积分 30
请看这段程序
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楼 shanliang8008 发表于 2007-10-10 14:33
银牌会员 发帖 514 积分 1,148 来自 河北
太深奥了 貌似有写DOS软件就是这么实现的 可以用DOS内存工具查一查
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023