INT10中断号
c语言吧
全部回复
仅看楼主
level 1
c闲人 楼主
视频服务程序00H(设置视频模式)输入: AH=00H AL=视频模式输出: 无 说明:视频服务程序00H用来设置视频配置为表10-l中列出之一。AL寄存器给定所需视频模式。若设置了新视频模式,则清除屏幕。 视频服务程序0lH(设置光标大小)输入: AH=01H CH=光标开始扫描行 CL=光标结束扫描行输出: 无说明:该服务程序用于正文模式。在一个字符单元内由一行或几行组成的光标将在字符显示位置得闪烁。该服务程序定义光标的显示行数。对CGA模式,8扫描行(0~7)用于光标。对EGA模式,使用14行(0~13)。MCGA和VGA适配器,光标可具有16扫描行(0~15)高。缺省设置如下: CGA: CH=6,CL=7 EGA: CH=ll,CL=12 MCGA和VGA: CH量13,CL=1 视频服务程序02H(设置光标位置)输入: AH=02H BH=光标页号 DH=光标行号 DL=光标列号输出: 无说明:该服务器序用于将光标移到指定行和列位置。该服务程序即可用于正文模式也可用于图形模式;然而,仅在正文模式下才显示光标。屏幕左上角为坐标系统的原点。对支持多页的正文和图形模式,则必须指定页号,以保证光标位置正确。视频服务程序03H(读光标位置)输入: AH=03H BH=页号输出: CH=光标开始行 CL=光标结束行 DH=行号 DL=列号说明:该服务程序用于获取光标大小和位置。BH给定了页号。CH中存放光标开始扫描行,而CL中为光标结束扫描行。DH中存放行位置,DL中为列位置。视频服务程序05H(设置活动显示页)输入: AH=05H AL=活动页号输出: 无 说明:该服务程序为正文和图形模式用来设置活动显示页号。AL指定所需页号。对多数正文模式,页号范围为0一7。对具有足够视频缓冲EGA和VGA适配器,可支持多页图形。对所有正文和图形模式,缺省为0页。视频服务程序06H(向上翻滚活动窗口)。输入:AH=06HAL=翻滚行数BH=空白行属性CH左上角行号CL=左上角列号 DH=右下角行号 Dl=右下角列号输出: 无 说明:该服务程序用来创建和翻滚一正文窗口。CH和CL中给出了正文窗口左上角坐标,DH和DL中给出了正文窗口右下角坐标。AL中定义了翻滚的行数。若AL=00H,则正文窗口为空白。当滚动窗口时,底部行是空白行,其属性由BH中指定。视频服务程序07H(向下翻滚窗口)输入:AH=07HAL=翻滚行数BH=空白行属性CH=左上角行号CL=左上角列号DH=右下角行号DL=右下角列号输出: 无说明:该服务程序用来创建和翻滚一正文窗口。CH和CL中给出了正文窗口左上角坐标,DH和DL中给出了正文窗口右下角坐标。AL中定义了翻滚的行数。若AL=00H,则正文窗口为空白。当滚动窗口时,顶部行为空白,其属性由BH中指定。视频服务程序08H(读字符和属性)输入: AH=08H BH=活动页号输出: AH=字符属性 AL=字符码说明:该服务程序用于读取正文或视频模式下,光标所在处字符。在图形模式下,获取的字符同图形模式下使用的字符生成表有关。在正文模式下,将获得字符的ASCII码。字符属性存放在AH中,字符ASCII码存放在AL中。图形模式下,AH中内容无意义.视频服务程序09H(写字符和属性)输入: AH=09H AL=写字符的ASCII码 BL=写字符的属性 BH=活动页号 CX=重复写字符和属性次数输出: 无 说明:该服务程序写一个字符到屏幕当前光标处。AL中指定字符码。正文模式下,BL中指定字符属性。图形模式下,BL指定背景颜色。字符可重复写。CX为写字符及属性的次数。视频服务程序0FH(取当前视频模式)输入: AH=0FH输出: AH=每行字符数 AL=当前显示模式 BH=活动页号说明:该服务程序用来获取当前视频模式,屏幕宽(以字符计),以及活动显示页号;视频显示模式存放在AL中。屏幕宽度(以字符计)存放在AH中,活动页号存放在BH中。
2004年10月22日 13点10分 1
level 1
c闲人 楼主
功 能: 从远堆中释放一块用 法: void farfree(void);指针操作函数:MK_FP(),FP_OFF(),FP_SEG()函数名: MK_FP功 能: 设置一个远指针用 法: void far *MK_FP(unsigned seg, unsigned off);函数名: FP_OFF功 能: 获取远地址偏移量用 法: unsigned FP_OFF(void far *farptr);函数名: FP_SEG功 能: 获取远地址段值用 法: unsigned FP_SEG(void far *farptr);如果想知道还剩下多少常规内存,我们可以使用以下函数:函数名: coreleft()功 能: 获取空闲内存用 法: unsigned coreleft(void);函数名: farcoreleft()功 能: 获取远堆空闲内存用 法: unsigned long farcoreleft(void);XMS功能调用索引表:功能号功能版本功能00H 功能01H 功能02H 功能03H 功能04H 功能05H 功能06H 功能07H 功能08H 功能09H 功能0AH 功能0BH 功能0CH 功能0DH 功能0EH 功能0FH 功能10H 功能11H取XMS版本号 请求高内存区HMA 释放高内存区HMA 全程启用A20 全程停用A20 局部启用A20 局部停用A20 查询A20状态 查询自由扩展内存 分配扩展内存块 释放扩展内存块 移动扩展内存块 锁住扩展内存块 扩展内存块解锁 取EMB句柄信息 重新分配扩展内存块 请求上位存储块UMB 释放上位存储块UMB XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0 XMS规范V2.0XMS功能调用函数1. 测试xms是否存在使用中断2fH的43H(AH)功能的00H(AL)子功能,可以获得是否安装了XMS驱动程序的信息,如果AL返回为80H则说明XMS安装了。以下给出具体函数:char test_xms(){ asm {mov ax,0x4300int 0x2f } if (_AL==0x80) XMS=1; return(XMS);}2. 获取xms驱动程序入口地址使用中断2fH的43H(AH)功能的10H(AL)子功能,可以获得xms驱动程序入口地址,返回的ES:BX便是具体的入口。以下给出具体函数:void get_driver_address(){ if (XMS) {asm { mov ax,0x4310 //功能号43H int 0x2f //调用中断2fH} xms=(void (far *)())(((long)(_ES)<<16)+_BX);//取到指向xms服务函数的指针 } }3. 获取XMS版本号在获得XMS驱动程序入口地址之后,我们可以根据XMS驱动程序提供的功能号来调用具体的XMS功能,使用功能00H(AH)可以获得XMS的版本信息,AX返回XMS版本号,BX返回内部修订版本,以下给出具体函数:void get_xms_version(unsigned *xms_ver,unsigned *int_ver){ if (XMS) {asm mov ah,0x00//取得功能号xms();//调用XMS驱动程序*xms_ver=_AX;//返回xms版本号*int_ver=_BX;//返回内部修订本HMA=_DX; } }4. 请求分配高端内存(High Memory Area)使用功能01H(AH)可以请求分配高端内存,同时DX给入要分配的内存字节数,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char Request_HMA(unsigned size){ char error_code=0xff; if (XMS) {asm { mov ah,0x01 mov dx,size} xms();error_code=_BL; } return(error_code); }5. 释放高端内存使用功能02H(AH)可以释放高端内存,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char Release_HMA(){ char error_code=0xff; if (XMS) {asm mov ah,0x02xms();error_code=_BL; } return(error_code); }6. 全程激活A20地址线使用功能03H(AH)可以全程激活A20地址线,用于使用HMA,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char global_enable_A20(){ char error_code=0xff;
2004年10月22日 13点10分 3
level 1
c闲人 楼主
if (XMS) {asm mov ah,0x03xms();error_code=_BL; } return(error_code); }7. 全程关闭A20地址线使用功能04H(AH)可以全程关闭A20地址线,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char global_disable_A20(){ char error_code=0xff; if (XMS) {asm mov ah,0x04xms();error_code=_BL; } return(error_code); }8. 局部激活A20地址线使用功能05H(AH)可以局部激活A20地址线, 用于直接访问扩充内存,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char local_enable_A20(){ char error_code=0xff; if (XMS) {asm mov ah,0x05xms();error_code=_BL; } return(error_code); }9. 局部关闭A20地址线使用功能06H(AH)可以局部关闭A20地址线,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char local_disable_A20(){ char error_code=0xff; if (XMS) {asm mov ah,0x06xms();error_code=_BL; } return(error_code); }10. 查询A20地址线状态使用功能07H(AH)可以查询A20地址线当前处于激活还是关闭状态,AX返回0001H表示激活、0000H表示关闭,失败时BL返回错误代码,以下给出具体函数:char query_A20_state(unsigned *state){ char error_code=0xff; if (XMS) {asm mov ah,0x07xms();*state=_AX;//返回a20地址线状态error_code=_BL; } return(error_code); }11. 查询空闲的扩充内存空间使用功能08H(AH)可以查询空闲的扩充内存空间, 不包括HMA,AX返回最大的扩充内存块的大小(单位:K),DX返回总的扩充内存块的大小(单位:K),失败时BL返回错误代码,以下给出具体函数:char query_free_xms(unsigned *max_block,unsigned *total) { char error_code=0xff; if (XMS) {asm mov ah,0x08xms();*max_block=_AX;//返回最大的扩充内存块的大小*total=_DX;// 返回总的扩充内存块的大小error_code=_BL; } return(error_code); }12. 分配扩充内存使用功能09H(AH)可以分配扩充内存,DX给入要求分配的内存块大小(单位:K),AX返回0001H表示成功、0000H表示失败,DX返回内存块的句柄,失败时BL返回错误代码,以下给出具体函数:char allocate_xms(unsigned size,unsigned *handle){ char error_code=0xff; if (XMS) {asm { mov ah,0x09 mov dx,size} xms();*handle=_DX;//返回句柄error_code=_BL; } return(error_code); }13. 释放指定句柄所分配的扩充内存使用功能0AH(AH)可以释放指定句柄所分配的扩充内存,DX给入内存块的句柄,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char free_xms(unsigned handle){ char error_code=0xff; if (XMS) {asm { mov ah,0x0a mov dx,handle} xms();error_code=_BL; } return(error_code); }14. 移动扩充内存块使用功能0BH(AH)可以移动扩充内存块,DS:SI给入xms_mov结构,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:typedef struct xms_mov { unsigned long byte_count; //移动的字节数 unsigned source_handle; //源句柄 unsigned long source_offset; //源偏移量 unsigned destination_handle; //目的句柄 unsigned long destination_offset; //目的偏移量} xmm;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); }
2004年10月22日 13点10分 4
level 1
c闲人 楼主
15. 锁定指定的句柄所分配的扩充内存块使用功能0CH(AH)可以锁定指定的句柄所分配的扩充内存块,DX给入句柄,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char lock_XMS_block(unsigned handle){ char error_code=0xff; if (XMS) {asm { mov ah,0x0c mov dx,handle} xms();error_code=_BL; } return(error_code); }16. 解锁指定的句柄所分配的扩充内存块使用功能0DH(AH)可以解锁指定的句柄所分配的扩充内存块,DX给入句柄,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char unlock_XMS_block(unsigned handle){ char error_code=0xff; if (XMS) {asm { mov ah,0x0d mov dx,handle} xms();error_code=_BL; } return(error_code); }17. 获取描写句柄的信息使用功能0EH(AH)可以获取描写句柄的信息,DX给入句柄,AX返回0001H表示成功、0000H表示失败,BH返回块锁定计数值,BL返回可用的句柄,DX返回句柄分配的块的容量(单位:K),失败时BL返回错误代码,以下给出具体函数:typedef struct XMS_handle_info { unsigned char lock_count; //块锁定计数值 unsigned char free_handle;//可用的句柄 unsigned size;//句柄分配的块的容量(单位:K)} xhi;char get_handle_info(unsigned handle,xhi *handle_info){ char error_code=0xff; if (XMS) {asm { mov ah,0x0e mov dx,handle} xms();error_code=_BL;handle_info->lock_count=_BH; handle_info->free_handle=_BL; //获取可用的句柄handle_info->size=_DX; //获取句柄分配的块的容量 } return(error_code); }18. 为句柄重新分配内存使用功能0FH(AH)可以为句柄重新分配内存,DX给入句柄,BX给入新的块的容量(单位:K),AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char reallocate_xms_block(unsigned handle,unsigned size){ char error_code=0xff; if (XMS) {asm { mov ah,0x0f mov dx,handle mov bx,size} xms();error_code=_BL; } return(error_code); }19. 请求分配UMB使用功能10H(AH)可以请求分配UMB(upper memory block,即上位内存, 640K以上的非EMS内存),DX给入块的大小(单位:节, 即paragraphs, 为16个字节),AX返回0001H表示成功、0000H表示失败,BX返回分配UMB的段地址,DX返回块的实际容量actual size of block,失败时BL返回错误代码,以下给出具体函数:typedef struct UMB_info { unsigned UMB_segment; unsigned size;} ui;char request_UMB(unsigned size,ui *info){ char error_code=0xff; if (XMS) {asm { mov ah,0x10 mov dx,size} xms();error_code=_BL;info->UMB_segment=_BX;//返回umb段地址info->size=_DX;//返回容量 } return(error_code); }20. 释放UMB使用功能11H(AH)可以释放UMB(upper memory block),640K以上的非EMS内存),DX给入要释放的UMB内存的段地址,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:char release_UMB(unsigned segment){ char error_code=0xff; if (XMS) {asm { mov ah,0x10 mov dx,segment} xms();error_code=_BL; } return(error_code); }这里值得一提的是HIMEM.SYS需要至少为256字节的栈空间。此外给出错误时BL返回的错误代码及其含义:返回错误代码含义80h没有提供的功能 81h检测到虚拟盘(Vdisk) 82h发生A20地址线错误 8Eh一般驱动程序错误 8Fh致命的驱动程序错误 90h高端内存(HMA)不存在 91h高端内存(HMA)已被使用
2004年10月22日 13点10分 5
level 1
c闲人 楼主
92hDX is less than the /HMAMIN= parameter 93h高端内存(HMA)未被分配 94hA20地址线已被激活 A0h所有扩充内存已被分配 A1h所有可用的句柄已被分配 A2h无效的句柄 A3h无效的源句柄 A4h无效的源偏移 A5h无效的目的句柄 A6h无效的目的偏移 A7h无效的长度 A8h移动有非法的重叠 A9h发生奇偶校验错误 AAh块未加锁 ABh块已被锁定 ACh块锁定计数溢出 ADh锁定失败 B0h只有更小一些的UMB空间 B1h没有可用的UMB空间EMS功能调用索引EMS功能调用索引:功能号功能功能40H 功能41H 功能42H 功能43H 功能44H 功能45H 功能46H 功能47H 功能48H 功能4BH 功能4CH 功能4DH取得EMS程序状态 取得物理映射页面的段地址 获取逻辑页页数信息 分配句柄和内存 内存映射 释放句柄和内存 获取EMM的版本号 保存指定句柄映射关系 恢复指定句柄映射关系 获取EMM的句柄数 获取指定句柄所分配的逻辑页页数 获取所有句柄分配情况1. 测试EMS管理程序测试EMS管理程序, 找到返回1, 否则返回0,以下给出具体函数:char test_ems() { int i; union REGS inregs,outregs; struct SREGS segs; struct DeviceHeader {struct DeviceHeader far *link;unsigned attributes;unsigned strategy_offset;unsigned interrupt_offset;char name_of_number_of_units[8]; } far *dev; unsigned char major,minor,c[13]; inregs.x.ax=0x3001;//dos中断功能30子功能01读取当前扩充内存是否有效 intdos(&inregs,&outregs);//DOS中断 major=outregs.h.al;//返回扩充内存状态 minor=outregs.h.ah; if (major<2) return(0);//扩充内存无效 else { inregs.h.ah=0x52;//dos中断功能52返回计算机内存中启用服务设备名称链表 intdosx(&inregs,&outregs,&segs);//dos中断 if (major==2)//获得设备起始地址 dev=(struct DeviceHeader far *)MK_FP(segs.es+1,outregs.x.bx+7); else if ((major==3) && (minor==0)) dev=(struct DeviceHeader far *)MK_FP(segs.es+2,outregs.x.bx+8); else dev=(struct DeviceHeader far *)MK_FP(segs.es+2,outregs.x.bx+2); c[8]=NULL; while (FP_OFF(dev)!=0xffff) {//直到设备全部被检测 if (dev->attributes & 0x8000) { for (i=0;i<8;i++)//名称长度8位 c[i]=dev->name_of_number_of_units[i]; }//取设备名称 if (!strcmp(c,"EMMXXXX0")) {//将设备名称与扩充内存名字比较 EMS=1;//扩充内存存在 return(1); } dev=dev->link; }//指向下一个设备 } return(0); }2. 取得管理程序状态在确认EMS存在时,使用中断67H功能40H(AH)可以取得管理程序状态,AH返回00H表示成功、否则返回错误代码。以下给出具体函数:char get_EMS_status(){ char tmp=0xff; if (EMS) {asm { mov ah,0x40//功能号40h int 0x67//调用中断67h mov tmp,ah//返回值} } return(tmp); }3. 取得物理映射页面的段地址使用中断67H功能41H(AH)可以取得物理映射页面的段地址,AH返回00H表示成功、否则返回错误代码,BX返回物理映射页面的段地址。使用此功能可确定EMS在1Mb常规内存中的映射位置,此物理映射页面的大小为64K, 分为0-3页, 每页为16K,因为EMS逻辑页的大小为16K, 也就是说我们最多可同时将4 个EMS逻辑页映射到物理页上。以下给出具体函数:char get_page_frame_segment(unsigned *segment){ char tmp=0xff; if (EMS) {asm { mov ah,0x41 int 0x67 mov tmp,ah}*segment=_BX;//取得段地址 } return(tmp); }4. 获取逻辑页页数信息使用中断67H功能42H(AH)可以获取逻辑页页数信息,AH返回00H表示成功、否则返回错误代码,BX返回未分配的页数,DX返回页的总数。以下给出具体函数:
2004年10月22日 13点10分 6
level 0
向c闲人的贡献致敬
2004年10月23日 01点10分 10
level 7
好学者小晖 ,不是汇编吧吧主吗?你好你好!可惜汇编吧日渐冷清,哎~~~欢迎来到C吧!无效敬上
2005年06月18日 10点06分 11
level 7
汗~~~怎么是2004-10-23??我以为是他顶上来的~~~既然没有顶怎么会浮上来?奇怪~~
2005年06月18日 10点06分 12
level 0
这篇帖子真是太好了,我到处找过今天终于找到了.只是有没有所有中断的资料?INT10的功能太少了,我还想看看其它的.
2006年08月18日 11点08分 13
level 7
怎么又被顶上来了……寒一下各位挖坟强人啊
2006年08月18日 11点08分 14
level 0
忍不住又顶,各位别打我哦。
2006年11月04日 08点11分 15
level 1
闲人大哥,谢谢你了!谢谢了!
2007年06月28日 11点06分 16
level 1
当然要顶了 这么好的帖~~~~
2007年07月18日 15点07分 17
level 0
正愁找不到关于使用扩展内存的资料呢!
2008年02月01日 10点02分 18
level 1
C闲人,久仰大名
2008年02月01日 12点02分 19
level 0
太牛!!!
2008年06月08日 08点06分 20
level 5
我日,着贴怎么这么牛啊
2008年06月08日 13点06分 21
level 0
什么朝代的帖吖?不过的确是好东西!
2008年06月12日 14点06分 22
level 1
呃,irq中断号咋看?谢谢
2010年08月14日 09点08分 24
1 2 尾页