请熟悉dos下编程的兄弟帮忙写注释(2)

liszt 2004-08-05 04:55:52
我对dos下编程不太懂,特别是涉及到汇编和寄存器的地方
越详细越好啊.哥们看不懂.学习学习...

//设置扩充内存
int setup_himem()
{
unsigned int Xms_contrl,Xms_contrl_seg;
int XMS_free;
register int setup_case;

asm{
MOV AX,0X4300
INT 0X2F
XOR AH,AH
MOV setup_case,AX
}
if (setup_case!=0x80)return (ERROR);

asm{
push es
MOV AX,0X4310
INT 0X2F
MOV Xms_contrl,BX
MOV BX,ES
MOV Xms_contrl_seg,BX
pop es
}
XMS_control=(void (*)())(MK_FP(Xms_contrl_seg,Xms_contrl));
XMS_control_p=&XMS_control;
asm{
MOV AH,0X05
CALL XMS_control
MOV setup_case,AX
}
if ( setup_case ==0 )return(ERROR);

asm{
MOV AH,0X08
CALL XMS_control
MOV XMS_free,AX
}
printf("\nHimem Free %d KB ....\n", XMS_free);
if ( XMS_free ==0 )return(ERROR);
return (TRUE) ;
}

unsigned int setup_IMG_cache()
{
unsigned int Block_N;
unsigned int ren_val;

asm{
MOV DX,2048
MOV AH,0X09
CALL XMS_control
MOV Block_N,DX
MOV ren_val,AX
}
if ( ren_val == 1 ){
asm{
MOV DX,Block_N
MOV AH,0X0C
CALL XMS_control
}
}
else{
makesound();
printf("\nNo Enough Himem memory!!!");
return(ERROR);
}
return(Block_N);
}

int Close_IMG_cache(unsigned int Block_N)
{
asm{
MOV DX,Block_N
MOV AH,0X0D
CALL XMS_control
}
asm{
MOV DX,Block_N
MOV AH,0X0A
CALL XMS_control
}
return(TRUE);
}
...全文
128 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
grrrrrr 2004-08-06
  • 打赏
  • 举报
回复
到汇编区问一问把
kim1977 2004-08-06
  • 打赏
  • 举报
回复
谢谢ma100(),期待有详细的注释.
ma100 2004-08-05
  • 打赏
  • 举报
回复
在DOS环境下,用C语言编写图形处理程序,有时宝贵的640K常规内存就显得太小了,一个有效的办法是把一些临时数据存储到外存(硬盘)上,但我们都知道外部存储器的速度往往不尽如人意,另一种更好的办法是使用扩充内存。在DOS环境进行保护模式下,编写者可以直接访问扩充内存,但这很容易造成系统崩溃,在此我想介绍的方法是使用延伸内存规范Extended Memory Specification(XMS)来管理延伸内存。使用扩充内存之前,必须确认用户的计算机系统中有一定容量的扩充内存,并在CONFIG.SYS文件中设置DEVICE=C:\DOS\HIMEM.SYS。这样扩充内存就处于扩充内存驱动程序(XMS)的管理之下,下面先介绍一下XMS的常用功能调用:(使用BIOS中断 INT 2FH)

1.检查XMS驱动程序是否已经安装
入口:AX=4300H
INT 2FH
出口:AX=安装标志(0=未安装,80H=HIMEM.SYS安装成功)
2.取得XMS服务程序的入口地址
入口:AX=4310H
INT 2FH
出口:BX=XMS服务程序入口地址的偏移量
ES=XMS服务程序入口地址的段址
3.检查扩充内存是否可用
入口:AX=08H
INT 2FH
出口:AX=以KB计的最大自由扩充内存的大小
DX=以KB计的自由扩充内存的总和
BL=错误代码
(080H=功能未实现,081H=检测到了VDISK设备,0A0H=所有的扩充内存都已经被分配)
4.申请一扩充内存
入口:AH=09H
DX=以KB计的扩充内存块的大小
INT 2FH
出口:AX=状态(0=失败,1=成功)
DX=所分配的扩充内存块的句柄
BL=错误代码
(080H=功能未实现,081H=检测到了VDISK设备,0A0H=所有的扩充内存都已经被分配,0A1H=所有句柄被占用)
5.释放扩充内存块
入口:AH=0AH
DX=所分配的扩充内存块的句柄
INT 2FH
出口:AX=状态(0=失败,1=成功)
(080H=功能未实现,081H=检测到了VDISK设备,0A0H=句柄无效,0A2H=句柄加锁)
6.扩充内存和常规内存数据交换
入口:AH=0BH
DS:SI=指向扩充块移动结构的指针
INT 2FH
出口:AX=状态(0=失败,1=成功)
BL=错误代码
(80H=功能未实现,81H=检测到了VDISK设备,82H=A20地址线出现错误,A3H=无效源句柄,A4H=无源偏移量,A5H=无效目的句柄,A6H=无效目的偏移量,A7H=无效长量,A8H=移动有重叠,A9H=奇偶校检错)
入口的DS:SI所指的数据结构为:
struct EMB
{unsigned long len; /*需传输的数据字节数(32位)*/
unsigned sour_handle; /*源数据块句柄 */
unsigned long soru_offset; /*源偏移量(32)位 */
unsigned dest_handle; /*目的数据块句柄 */
unsigned long dest_offset; /*目的偏移量(32位) */
};

liszt 2004-08-05
  • 打赏
  • 举报
回复
哎,看到这些汇编程序我就头大啊,难道让我再去学汇编吗。5555
liszt 2004-08-05
  • 打赏
  • 举报
回复
up,分不够再加.
liszt 2004-08-05
  • 打赏
  • 举报
回复
呵,还有一个
int exit_himem ()
{
int exit_case ;
asm{
MOV AH,0X06
CALL XMS_control
MOV exit_case,AX
}
if ( exit_case ==0 ) return (ERROR);

return (TRUE) ;
}

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧