有关的中断资料:
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