Turbo C使用的汇编函数 -- XMS内存管理函数

原创 2007年09月16日 01:22:00
 

        本篇给出XMS(扩充内存)内存TC函数汇编码文件,要使用XMS,必须安装驱动程序EMM386.EXE。注意,XMS与EMS(扩展内存)是2种不同的内存管理技术规范,由于它们对内存的管理范围有重叠,所以在驱动程序中应指明EMS的大小,如果全部1M外的内存全部都给了EMS,那么,XMS就只能管理UMB和HMA内存了,而这些内存还必须在DOS中配置才有,下面的配置保证了基本内存以外的内存全部由XMS管理:

device=himem.sys
device=emm386.exe noems
dos=high,umb

/*    XMS.H    */

#ifndef    __XMS_H
#define    __XMS_H

#define    XMS_MOVEFROM    0
#define    XMS_MOVETO    1
extern int XMS_Flag;        /* XMS 内存可使用标记, 0 不可使用, 非 0 可使用 */
#ifdef    __cplusplus
extern "C" {
#endif

/* 定义使用 XMS 内存函数 */

/* 测试 XMS 内存是否可用, 将测试结果放在 XMS_Flag, 并返回 XMS_Flag */
int XMS_Init(void);
/* 返回最大 XMS 内存块字节数 */
unsigned 
long XMS_GetFree(void);
/* 分配 XMS 内存, 参数为字节数(长整型), 成功返回内存块句柄, 失败返回 0 */
unsigned XMS_Alloc( unsigned 
long );
/* 释放 XMS 内存块, 参数位内存块句柄, 成功返回 1, 失败返回 0 */
int XMS_Free( unsigned );
/* 传输数据, 参数: 缓冲区; XMS 句柄; XMS 偏移量; 字节数; 传输标记, 成功返回 1, 失败返回 0
   传输标记: XMS_MOVEFROM 从 XMS 中取数据到缓冲区;
         XMS_MOVETO 将缓冲区数据送到 XMS        
*/
int XMS_Move(void far *, unsigned, unsigned long, unsigned longint);
#ifdef    __cplusplue
}
#endif

#endif

 

    XMS.ASM

    P386N
    include        tasm_c.inc

XMS_MOVEFROM    equ    
0
XMS_MOVETO    equ    
1

    DATASEG

    PUBLIC    _XMS_GetFree
    PUBLIC    _XMS_Alloc
    PUBLIC    _XMS_Move
    PUBLIC    _XMS_Free
    PUBLIC    _XMS_Init
    PUBLIC    _XMS_Flag

XMS_addr    dd    
0
_XMS_Flag    dw    
0
;
XMS_Bytes    dd    
0
XMS_SouHand    dw    
0
XMS_SouAddr    dd    
0
XMS_DesHand    dw    
0
XMS_DesAddr    dd    
0
;
        CODESEG
;
; unsigned 
long XMS_GetFree(void)
;
PROC    _XMS_GetFree

    mov    ah, 
8
    call    [dword XMS_addr]
    mov    dx, ax
    shl    ax, 0ah
    shr    dx, 06h
    ret
ENDP
;
int XMS_Init(void);
;
PROC    _XMS_Init

    mov    ax, 4300h
    
int    02fh
    cmp    al, 80h
    jne    @@
1
    mov    ax, 4310h
    
int    02fh
    mov    [word XMS_addr
+2], es
    mov    [word XMS_addr], bx
    mov    ah, 
8
    call    [dword XMS_addr]
    mov    [word _XMS_Flag], ax
    jmp    
short @@2
@@
1:
    mov    [word _XMS_Flag], 
0
    xor    ax, ax
@@
2:
    ret
ENDP
;
; unsigned 
int XMS_Alloc(long size)
;
PROC    _XMS_Alloc

    ARG    size : dword

    mov    ax, [_XMS_Flag]
    cmp    ax, 
0
    je    @@
1
    mov     eax, [dword size]
    add    eax, 3ffh
    shr    eax, 0ah
    mov    dx, ax
    mov    ah, 
9
    call    [dword XMS_addr]
    cmp    ax, 
0
    jz    @@
1
    mov    ax, dx
@@
1:
    ret
ENDP
;
int XMS_Move(void far *buf, unsigned long ofs, unsigned long bytes, int flag)
;
PROC    _XMS_Move

    ARG    buf : far ptr, handle : word, ofs : dword, bytes : dword, flag : word
    USES    si

    mov    eax, [dword bytes]
    mov    [dword XMS_Bytes], eax
    cmp    [word flag], XMS_MOVEFROM
    jne    @@
1
    mov    ax, [handle]
    mov    [XMS_SouHand], ax
    mov    eax, [dword ofs]
    mov    [XMS_SouAddr], eax
    mov    [word XMS_DesHand], 
0
    mov    eax, [dword buf]
    mov    [dword XMS_DesAddr], eax
    jmp    
short @@2
@@
1:
    mov    [word XMS_SouHand], 
0
    mov    eax, [dword buf]
    mov    [XMS_SouAddr], eax
    mov    ax, [handle]
    mov    [XMS_DesHand], ax
    mov    eax, [dword ofs]
    mov    [dword XMS_DesAddr], eax
@@
2:
    lea    si, [XMS_Bytes]
    mov    ah, 0bh
    call    [dword ES_ XMS_addr]
    ret
ENDP
;
int XMS_Free(handle)
;
PROC    _XMS_Free

    ARG     handle : word

    mov    ah, 0ah
    mov    dx, [handle]
    call    [dword XMS_addr]
    ret
ENDP
;
    END

      上面的文件中使用的插入文件tasm_c.inc和编译文件在《Turbo C使用的汇编函数 -- VGA 12H模式图形函数(一)》中。本来想找个测试代码,可是代码确实太长(一个完整的程序),反正XMS函数调用也不复杂,也就免了。

        连续几篇文章,将我十多年前自认为精华的代码全掏空了,从1998年,我就很少接触C/C++,虽说C/C++的代码还能看懂,也能写几句,但社会变化太快,近十年的时间不知改变了许多,有时候,我也用C/C++写点东西,但自从在Delphi版被一个自认为的C++“高手”的家伙所辱后,就没有再正二八经的用过“C++”(我其实是实话实说,说我不懂STL,也不喜欢它,他说,不懂STL就是不懂C++,当然还有他人帮腔也这么说,我只好无话可说了,原来我不用STL写的代码不能叫C++代码?!不过,偶尔也用BCB做点试验,反正BCB主要用VCL,极少用到STL)。幸好我只是个业余编程爱好者,不靠它吃饭!

        再次声明,这几篇文章的代码是1995年前的东西,用现在的眼光去看它们,还不知道是不是C函数,只能供初学者们借鉴参考。至于是否有错误,我就不得而知了,不过,我以前使用时,没出过什么问题。有错误或建议,请来信:maozefa@hotmail.com

 

C/C++与汇编的函数相互调用分析

转自:http://blog.sina.com.cn/s/blog_4ae178ba01012d3o.html C/C++与汇编的函数相互调用分析 write by 九天雁翎(JTian...
  • woshiyuanlei
  • woshiyuanlei
  • 2017年01月22日 15:01
  • 1262

C函数与汇编函数之间参数及返回值传递方法

AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所示,AAPCS为ARM的R0~R15寄存器做了定义,明确了它们在函数中的职责: 图 8 AAPCS关于ARM寄存...
  • zuotian5212008
  • zuotian5212008
  • 2015年07月22日 16:06
  • 3822

x86 和 x64 汇编调用C 函数参数传递规则(GCC)

在ubuntu12.04 AMD64 位系统下
  • liliang365
  • liliang365
  • 2014年04月11日 15:05
  • 3024

XMS内存管理函数

  • 2015年05月20日 17:46
  • 6KB
  • 下载

VS2017如何使用C_C++语言调用汇编函数

VS2017如何使用C_C++语言调用汇编函数1. 使用VS 创建一个新的空项目2. 新建 main.cpp 文件和 test.asm 文件3. main.cpp 文件与 test.asm 文件 ...
  • qq_33775402
  • qq_33775402
  • 2017年12月17日 21:50
  • 139

内存管理C函数

  • 2013年10月14日 17:25
  • 1KB
  • 下载

VS2017中实现C程序调用汇编函数

VS2017中实现C程序调用汇编函数使用的开发环境 windows10 visual studio community 2017 操作过程 新建一个Win32控制台程序, 便于测试在源文件目录下添加 ...
  • dfq12345
  • dfq12345
  • 2017年04月09日 18:43
  • 2762

C于汇编函数的相互调用

C函数的调用机制 函数调用操作包括从一块代码到另一块代码之间的双向数据操作和执行控制转移。CPU为控制传递提供指令,而数据的传递和局部变量存储空间的分配与回收则通过栈操作实现。 栈帧结构 ...
  • skyFuhrer
  • skyFuhrer
  • 2013年05月18日 16:52
  • 1116

C函数与汇编函数之间参数及返回值传递方法

AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所示,AAPCS为ARM的R0~R15寄存器做了定义,明确了它们在函数中的职责:                  ...
  • hcx25909
  • hcx25909
  • 2013年01月14日 19:41
  • 8864

C函数与汇编函数之间参数及返回值传递方法

转自:http://blog.csdn.net/hcx25909/article/details/8502255 AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所...
  • deng_sai
  • deng_sai
  • 2016年11月07日 23:54
  • 423
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Turbo C使用的汇编函数 -- XMS内存管理函数
举报原因:
原因补充:

(最多只允许输入30个字)