使用DOSUMB


概述:

     在编制内存驻留程序时,为了少占用常规内存,往往要将程序加载到 UMB 中,本文讲述如何检测及使用UMB 内存。
     要分配 UMB 内存,需要先设置 DOS 的内存分配策略,使 DOS 分配内存时从高到低寻找,再设置 UMB 链的状态,将 UMB 内存加入 DOS 内存链,如果 UMB 内存存在的话,设置完毕后用普通的分配内存功能INT 21H 的 48H, 分配到的就是 UMB 内存,但要注意的是在分配内存完毕后必须将内存分配策略复原。在分配到 UMB 内存后,需要将执行程序移动到 UMB 中,再释放原来的常规内存。

有关的中断资料:

1.DOS 中断 21H 的 58H         入口参数: AH = 58H, AL = 子功能

功能号 入口参数 出口参数
AL=00H
取分配策略
  AX = 当前策略
AX=00H 低内存最先符合
AX=01H 低内存最佳符合
AX=02H 低内存最后符合
AX=40H 高内存最先符合
AX=41H 高内存最佳符合
AX=42H 高内存最后符合
AL = 01H
设置分配策略
BL = 新策略 (见上AX)  
AL = 02H
取UMB链状态
  AL=00H UMB不是DOS内存链的一部分
AL=01H UMB是DOS 内存链的一部分
AL = 03H设置UMB链的状态 BX=00H 从DOS内存链中移出UMB  
BX=01H 将UMB加入DOS内存链

汇编编程示例:

;=========== Check if has free umb =======
;    input:    BP = memory block needed
;    output:   CY = no free umb
;        NC = has free umb
;        AX = umb segment

ALLOC_UMB    PROC

        mov    ax,5800h         ;取内存分配策略
        int    21h
        push   ax
        mov    ax,5802h         ;取UMB状态
        int    21h
        xor    ah,ah
        push   ax

        mov    ax,5801h         ;设置内存分配策略
        mov    bx,41h           ;UMB best fit
        int    21h
        mov    ax,5803h         ;设置UMB状态
        mov    bx,1
        int    21h

        mov    ah,48h           ;分配内存
        mov    bx,bp
        int    21h
        mov    si,ax

        mov    ax,5803h         ;恢复UMB状态
        pop    bx
        int    21h
        mov    ax,5801h         ;恢复内存分配策略
        pop    bx
        int    21h

        mov    ax,si            ;如果分配到的内存段地址
        cmp    ax,0a000h        ;小于A000,说明无UMB
        jb     au_err            ;分配到的是常规内存
        clc
        ret
au_err:
        stc
        ret

ALLOC_UMB    ENDP





(C) Copyright by LuoYunBin's Win32 ASM Page,http://asm.yeah.net