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