资源描述
附录B INT10中断号
视频服务程序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=06H
AL=翻滚行数
BH=空白行属性
CH左上角行号
CL=左上角列号
DH=右下角行号
Dl=右下角列号
输出:
无
说明:该服务程序用来创建和翻滚一正文窗口。CH和CL中给出了正文窗口左上角坐标,DH和DL中给出了正文窗口右下角坐标。AL中定义了翻滚的行数。若AL=00H,则正文窗口为空白。当滚动窗口时,底部行是空白行,其属性由BH中指定。
视频服务程序07H(向下翻滚窗口)
输入:
AH=07H
AL=翻滚行数
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中。
文件相关函数
函数名: fopen
功 能: 打开一个流
用 法: FILE *fopen(char *filename, char *type);
函数名: fclose
功 能: 关闭一个流
用 法: int fclose(FILE *stream);
fopen()函数提供了几种打开文件的方式,这是由其字符指针参数type决定的。以下给出打开方式列表:
参数
作用
R
只读
W
新建、可写,如果文件存在则覆盖
A
存在则在文件后附加,如果不存在则新建后写
r+
更新一个存在的文件(读和写)
w+
增加一个新的文件更新(读和写),如果文件存在则覆盖
a+
存在则在文件后附加(读和写),如果不存在则新建后更新(读和写)
*以文本模式打开一个存在或新建的文件,附加”t”在参数后(rt, w+t, etc.)。
*以二进制模式打开一个存在或者新建的文件,附加”b”在参数后(wb, a+b, etc.)。
函数名: fseek
功 能: 重定位流上的文件指针
用 法: int fseek(FILE *stream,long offset,int fromwhere);
读取文件函数:
函数名: fread
功 能: 从一个流中读数据
用 法: int fread( void *ptr, int size, int nitems, FILE *stream );
写入文件函数:
函数名: fwrite
功 能: 写内容到流中
用 法: int fwrite( void *ptr, int size, int nitems, FILE *stream );
fseek()函数提供了文件指针的三个初始位置,这是由其参数fromwhere决定的,以下给出其列表:
常量
值
文件定位
SEEK_SET
0
从文件头开始寻找
SEEK_CUR
1
从文件当前位置开始寻找
SEEK_END
2
从文件最后开始寻找
函数名: fprintf
功 能: 传送格式化输出到一个流中
用 法: int fprintf( FILE *stream, char *format[, argument,...] );
函数名: fscanf
功 能: 从一个流中执行格式化输入
用 法: int fscanf( FILE *stream, char *format[,argument...] );
发声函数
函数名: sound
功 能: 以指定频率打开PC扬声器
用 法: void sound(unsigned frequency);
函数名: nosound
功 能: 关闭PC扬声器
用 法: void nosound(void);
常规内存操作函数
申请函数:malloc(),farmalloc(),calloc(),farcalloc(),realloc(),farealloc()
函数名: malloc
功 能: 内存分配函数
用 法: void *malloc(unsigned size);
函数名: farmalloc
功 能: 从远堆中分配存储块
用 法: void far *farmalloc(unsigned long size);
函数名: calloc
功 能: 分配主存储器
用 法: void *calloc(size_t nelem, size_t elsize);
函数名: farcalloc
功 能: 从远堆栈中申请空间
用 法: void far *farcalloc( unsigned long units, unsigned ling unitsz );
函数名: realloc
功 能: 重新分配主存
用 法: void *realloc(void *ptr, unsigned newsize);
函数名: farrealloc
功 能: 调整远堆中的分配块
用 法: void far *farrealloc( void far *block, unsigned long newsize );
使用函数:memcpy(),memset(),memmove(),movedata()
函数名: memcpy
功 能: 从源source中拷贝n个字节到目标destin中
用 法: void *memcpy(void *destin,void *source,unsigned n);
函数名: memset
功 能: 设置s中的所有字节为ch, s数组的大小由n给定
用 法: void *memset(void *s, char ch, unsigned n);
函数名: memmove
功 能: 移动一块字节
用 法: void *memmove(void *destin,void *source,unsigned n);
函数名: movedata
功 能: 拷贝字节
用 法: void movedata(int segsrc, int offsrc, int segdest, int offdest, unsigned numbytes);
释放函数:free(),farfree()
函数名: free
功 能: 释放已分配的块
用 法: void free(void *ptr);
函数名: farfree
功 能: 从远堆中释放一块
用 法: 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.0
XMS功能调用函数
1. 测试xms是否存在
使用中断2fH的43H(AH)功能的00H(AL)子功能,可以获得是否安装了XMS驱动程序的信息,如果AL返回为80H则说明XMS安装了。以下给出具体函数:
char test_xms(){
asm {
mov ax,0x4300
int 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,0x02
xms();
error_code=_BL;
} return(error_code); }
6. 全程激活A20地址线
使用功能03H(AH)可以全程激活A20地址线,用于使用HMA,AX返回0001H表示成功、0000H表示失败,失败时BL返回错误代码,以下给出具体函数:
char global_enable_A20(){
char error_code=0xff;
if (XMS) {
asm mov ah,0x03
xms();
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,0x04
xms();
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,0x05
xms();
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,0x06
xms();
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,0x07
xms();
*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,0x08
xms();
*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); }
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)已被使用
92h
DX is less than the /HMAMIN= parameter
93h
高端内存(HMA)未被分配
94h
A20地址线已被激活
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返回页的总数。以下给出具体函数:
char get_number_of_pages(unsigned *avail,unsigned *total){
char tmp=0xff;
if (EMS) {
asm {
mov ah,0x42
int 0x67
mov tmp,ah
}
*avail=_BX;//返回可用页数
*total=_DX;//返回所有页数
} return(tmp); }
5. 分配句柄和内存
使用中断67H功能43H(AH)可以分配句柄和内存,BX给入要求分配的逻辑页的页数(逻辑页每页的大小为16K),AH返回00H表示成功、否则返回错误代码,DX返回句柄。当程序退出运行时, 句柄将被非显式的关闭并无法回收。以下给出具体函数:
char allocate_memory(unsigned *handle,unsigned page_numbers){
char tmp=0xff;
if (EMS) {
asm {
mov ah,0x43
mov bx,page_numbers
int 0x67
mov tmp,ah
}
*handle=_DX;//返回句柄
} return(tmp); }
6. 内存映射
使用中断67H功能44H(AH)可以进行内存映射,AL给入物理页页号 (0-3),BX给入要求分配的逻辑页的页数(逻辑页每页的大小为16K),DX给入句柄,AH返回00H表
展开阅读全文