CODE SEGMENT
ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE
ORG 100h
START:
mov sp,offset _END ;スタック領域を変更
mov bx,offset _END ;↓自分自身のメモリーを
mov cl,4 ; いくつにすればよいか
shr bx,cl ; 計算する
inc bx ;↑
mov ah,4ah
int 21h ;メモリー変更
mov ax,5800h
int 21h ;アロケーションストラテジの取得
mov STRATEGY,ax
;
mov ax,5802h
int 21h ;UMBのリンク状態取得
mov ah,0
mov UMBLINK,ax
mov ax,5803h
mov bx,1
int 21h ;UMBをリンク
mov ax,5801h
mov bx,82h
int 21h ;アロケーションストラテジ設定
mov ah,48h
mov bx,100h / 16
int 21h ;メモリー割り当て
pushf ;とりあえずフラグを保存
;
mov ax,5801h
mov bx,STRATEGY
int 21h ;アロケーションストラテジを戻す
mov ax,5803h
mov bx,UMBLINK
int 21h ;UMBリンク状態を戻す
popf
jc ERR01 ;メモリーを確保できたか?
mov es,ax
call DISP ;割り当てたセグメント表示
mov ah,9
mov dx,offset MSG01 ;メッセージ表示
int 21h
mov ah,49h
int 21h ;メモリー解放
mov ax,4C00h
int 21h ;終了
ERR01: ;エラールーチン
mov ah,9
mov dx,offset ERRMSG01
int 21h
mov ax,4CFFh
int 21h
DISP: ;セグメント表示
mov cx,10h
xor dx,dx
div cx
push dx
or ax,ax
jz DISPE
call DISP
DISPE:
pop dx
add dl,'0'
cmp dl,'9'
jbe DISPE10
add dl,7
DISPE10:
mov ah,2
int 21h
ret
UMBLINK dw 0
STRATEGY dw 0
MSG01 db 'が確保できました',0Dh,0Ah,24h
ERRMSG01 db '空きメモリーがありません',0Dh,0Ah,24h
_STACK dw 20 dup(?) ;スタック領域
_END:
ENDS
END START
; 一部のコンパイラでは、
;CODE ENDS
; END START
;と記述しなければいけないようです
|