有关资料:
1.DOS 中断 2FH 的 4300H 及 4310H 功能
功能号 | 入口参数 | 出口参数 |
AX=4300H XMS安装检测 |
AL=80H 已安装XMS | |
AL<>80H XMS未安装 | ||
AX=4310H 取驱动程序地址 |
ES:BX=驱动程序入口地址 |
2.远调用 XMS 驱动程序的功能表
功能号 | 入口参数 | 出口参数 |
AH=09H 分配XMS内存 |
DX=所需的KB | AX=0001H 成功 则DX=XMS 内存句柄 |
AX=0000H 失败 | ||
AH=0AH 释放XMS内存 |
DX=XMS句柄 | AX=0001H 成功 |
AX=0000H 失败 | ||
AH=0BH 移动XMS内存 |
DS:SI指向EMM结构 | AX=0001H 成功 |
AX=0000H 失败 |
3.EMM 结构的格式
偏移量 | 大小 | 说明 |
00H | Double word | 要移动的字节数(必须是偶数) |
04H | Word | 源句柄(0 表示常规内存) |
06H | Double word | 源块中的偏移量 |
0AH | Word | 目的句柄(0 表示常规内存) |
0CH | Double word | 目的块中的偏移量 |
汇编编程示例:
;定义 EMM 结构 EMM DW 0,0 ;double word -- how many bytes to move DW 0 ;word -- source handle DW 0,0 ;double word -- source offset & segment DW 0 ;word -- target handle DW 0,0 ;double word -- target offset & segment OFFXMS DW 0 ;XMS驱动程序的入口地址 SEGXMS DW 0 HANDLE_XMS DW 0 ;申请到的XMS句柄;以下程序检测及申请XMS内存
MOV AX,4300H ;检测有无XMS INT 2FH CMP AL,80H JNZ NO_XMS MOV AX,4310H ;保存XMS驱动程序地址 INT 2FH MOV OFFXMS,BX MOV SEGXMS,ES MOV AH,9 ;分配XMS内存 MOV DX,100 ;分配100KB CALL DWORD PTR OFFXMS OR AX,AX JZ NO_MORE_XMS ;AX=0 则分配失败 MOV XMS_HANDLE,DX;以下程序将内存A000:0000处的64K字节移到XMS块中
MOV EMM,0 MOV EMM+2,1 ;10000H为64K MOV EMM+4,0 ;source handle = 普通内存 MOV EMM+6,0 ;源地址A000:0000 MOV EMM+8,0A000H MOV BX,XMS_HANDLE MOV EMM+0AH,BX ;targat handle = XMS MOV EMM+0CH,0 ;移动到XMS的起始地址 MOV EMM+0EH,0 MOV SI,OFFSET EMM MOV AH,0BH CALL DWORD PTR OFFXMS;以下程序将XMS块中的64K字节移到内存A000:0000处
MOV EMM,0 MOV EMM+2,1 ;bytes = 10000H (64K) MOV BX,XMS_HANDLE MOV EMM+4,BX ;source handle MOV EMM+6,0 ;source offset MOV EMM+8,0 MOV EMM+0AH,0 ;target handle 0 for MEM MOV EMM+0CH,0 ;target offset MOV EMM+0EH,0A000H MOV SI,OFFSET EMM MOV AH,0BH CALL DWORD PTR OFFXMS;以下程序释放XMS内存
MOV AH,0AH ;free XMS memory MOV DX,CS:XMS_HANDLE CALL DWORD PTR CS:OFFXMS