ITEEDU

使用DOS的UMB

概述:

在编制内存驻留程序时,为了少占用常规内存,往往要将程序加载到 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