使用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