assume cs:code,ds:data
data segment
;申请空间的大小
size_n dw 0
;总空间的大小
TOTAL_SIZE DW 100
;最小剩余量的值
SIZE_SMALL_N dw 10
;指向未分配的结点
pointer_pav dw 0
;指向刚分配完的结点
pointer_p dw 0
;辅助指针变量
pointer_t dw 0
pointer_s dw 0
pointer_q dw 0
pointer_ql dw 0
pointer_f dw 0
;保存已分配的结点的首部地址
pointer_release1 dw 0
pointer_release2 dw 0
pointer_release3 dw 0
pointer_release4 dw 0
;分配回收空间
MEMORY_SPACE dw 100 dup (0)
data ends
code segment
start:
;初始化空间的数据结构
call Init_Space
;设置未分配空间的头指针和要申请的空间大小
mov ax,offset MEMORY_SPACE
mov pointer_pav,ax
mov size_n,20
;调用分配子程序,对此申请进行分配
call AllocBoundTag
;设置未分配空间的头指针和第二次要申请的空间大小
mov ax,offset memory_space
mov pointer_pav,ax
mov size_n,40
;调用分配子程序,对此申请进行分配
call AllocBoundTag
;保存刚分配的结点的头指针
mov ax,pointer_p
mov pointer_release1,ax
;设置未分配空间的头指针和第三次要申请的空间大小
mov ax,offset memory_space
mov pointer_pav,ax
mov size_n,20
;调用分配子程序,对此申请进行分配
call AllocBoundTag
;保存刚分配的结点的头指针
mov ax,pointer_p
mov pointer_release4,ax
;设置要释放结点的头指针
mov ax,pointer_release1
mov pointer_p,ax
;调用第一种回收子程序,对此节点进行回收
call release1_start
;设置要释放结点的头指针
mov ax,pointer_release4
mov pointer_p,ax
;调用第四种回收子程序,对此节点进行回收
call release4_start
mov ax,4c00h
int 21h
;初始化空间结构
;参数: (无)
;返回: (无)
Init_Space:
push ax
push bx
;前驱结点:llink
mov bx,offset MEMORY_SPACE
mov [bx],bx
;块标志:tag
add bx,2
mov word ptr [bx],0
;结点的大小:size
add bx,2
mov ax,TOTAL_SIZE
mov word ptr [bx],ax
;后继结点:rlink
add bx,2
mov word ptr [bx],offset MEMORY_SPACE
mov bx,offset MEMORY_SPACE
add bx,TOTAL_SIZE
;底部域,块标志:tag
sub bx,2
mov word ptr [bx],0
;底部域,指向本结点头部:uplink
sub bx,2
mov word ptr [bx],offset MEMORY_SPACE
pop bx
pop ax
ret
;空间分配子程序
;参数: (无)
;返回:
; (DL)=结果 0:失败;1:成功
AllocBoundTag:
push ax
push bx
mov bx,pointer_pav
mov pointer_p,bx
loop_start:
mov bx,pointer_p
cmp bx,0
je loop_finish
mov ax,size_n
add bx,4
cmp [bx],ax
ja loop_finish
add bx,2
mov ax,pointer_pav
cmp [bx],ax
je loop_finish
mov bx,[bx]
mov pointer_p,bx
jmp loop_start
loop_finish:
cmp pointer_p,0
je alloc_null
mov bx,pointer_p
add bx,4
mov dx,size_n
cmp [bx],dx
jb alloc_null
mov bx,pointer_p
add bx,4
mov ax,[bx]
mov bx,pointer_p
add bx,ax
sub bx,4
mov pointer_f,bx
mov bx,pointer_p
add bx,6
mov ax,[bx]
mov pointer_pav,ax
mov bx,pointer_p
add bx,4
mov dx,[bx]
mov ax,size_n
sub dx,ax
cmp dx,SIZE_SMALL_N
ja modify
jmp cont
alloc_null:
mov dl,0
jmp AllocBoundTag_finish
cont:
mov ax,pointer_pav
mov bx,pointer_p
cmp ax,bx
je set_table_null
mov bx,pointer_p
mov ax,[bx]
mov bx,pointer_pav
mov [bx],ax
mov ax,pointer_pav
mov bx,pointer_p
mov bx,[bx]
add bx,6
mov [bx],ax
jmp set_tag
set_table_null:
mov pointer_pav,0
set_tag:
mov bx,pointer_p
add bx,2
mov word ptr [bx],1
mov bx,pointer_f
add bx,2
mov word ptr [bx],1
jmp alloc_success
modify:
mov bx,pointer_f
add bx,2
mov word ptr [bx],1
mov bx,pointer_p
add bx,4
mov dx,size_n
sub [bx],dx
mov bx,pointer_p
add bx,4
mov ax,[bx]
mov bx,pointer_p
add bx,ax
sub bx,2
mov word ptr [bx],0
sub bx,2
mov ax,pointer_p
mov [bx],ax
mov pointer_f,bx
add bx,4
mov pointer_p,bx
add bx,2
mov word ptr [bx],1
add bx,2
mov ax,size_n
mov [bx],ax
jmp alloc_success
alloc_success:
mov dl,1
AllocBoundTag_finish:
pop bx
pop ax
ret
;回收子程序1:左右邻区均为占用块的情况
;参数: (无)
;返回: (无)
release1_start:
push ax
push bx
push dx
push si
mov bx,pointer_p
add bx,2
mov word ptr [bx],0
mov bx,pointer_p
add bx,4
mov ax,[bx]
add ax,pointer_p
sub ax,4
mov bx,ax
mov ax,pointer_p
mov [bx],ax
add bx,2
mov word ptr [bx],0
mov bx,pointer_pav
cmp bx,0
je pav_is_null
mov dx,pointer_pav
mov bx,dx
mov dx,[bx]
mov pointer_q,dx
mov si,pointer_p
add si,6
mov [si],bx
mov si,pointer_p
mov ax,pointer_q
mov [si],ax
mov ax,pointer_p
mov bx,pointer_pav
mov [bx],ax
mov si,pointer_q
add si,6
mov [si],ax
mov pointer_pav,ax
jmp release1_finish
pav_is_null:
mov ax,pointer_p
mov bx,pointer_p
mov pointer_pav,ax
mov [bx],ax
add bx,6
mov [bx],ax
release1_finish:
pop si
pop dx
pop bx
pop ax
ret
;回收子程序2:左邻区为空闲块,而右邻区为占用块的情况
;参数: (无)
;返回: (无)
release2_start:
push ax
push bx
push dx
mov bx,pointer_p
add bx,4
mov ax,[bx]
mov size_n,ax
mov bx,pointer_p
sub bx,4
mov dx,[bx]
mov pointer_s,dx
mov bx,pointer_s
add bx,4
mov dx,size_n
add [bx],dx
mov bx,pointer_p
add bx,size_n
sub bx,4
mov pointer_f,bx
mov dx,pointer_s
mov [bx],dx
add bx,2
mov word ptr [bx],0
release2_finish:
pop dx
pop bx
pop ax
ret
;回收子程序3:右邻区为空闲块,而左邻区为占用块的情况
;参数: (无)
;返回: (无)
release3_start:
push ax
push bx
push dx
mov bx,pointer_p
mov ax,pointer_p
add bx,4
add ax,[bx]
mov pointer_t,ax
mov bx,pointer_p
add bx,2
mov word ptr [bx],0
mov bx,pointer_t
mov dx,[bx]
mov pointer_q,dx
mov ax,pointer_q
mov bx,pointer_p
mov [bx],ax
mov ax,pointer_p
mov bx,pointer_q
add bx,6
mov [bx],ax
mov bx,pointer_t
add bx,6
mov ax,[bx]
mov pointer_ql,ax
mov bx,pointer_p
add bx,6
mov [bx],ax
mov ax,pointer_p
mov bx,pointer_ql
mov [bx],ax
mov bx,pointer_p
add bx,4
mov si,pointer_t
add si,4
mov ax,[si]
add [bx],ax
mov bx,pointer_t
add bx,[si]
sub bx,4
mov ax,pointer_p
mov [bx],ax
release3_finish:
pop dx
pop bx
pop ax
ret
;回收子程序4:左右邻区均为空闲块的情况
;参数: (无)
;返回: (无)
release4_start:
push ax
push bx
push dx
mov bx,pointer_p
add bx,4
mov ax,[bx]
mov size_n,ax
mov bx,pointer_p
sub bx,4
mov dx,[bx]
mov pointer_s,dx
mov bx,pointer_p
mov ax,bx
add bx,4
add ax,[bx]
mov pointer_t,ax
mov bx,pointer_t
add bx,4
mov ax,[bx]
add ax,size_n
mov bx,pointer_s
add bx,4
add [bx],ax
mov bx,pointer_t
mov dx,[bx]
mov pointer_q,dx
add bx,6
mov dx,[bx]
mov pointer_ql,dx
mov bx,pointer_q
add bx,6
mov ax,pointer_ql
mov [bx],ax
mov bx,pointer_ql
mov ax,pointer_q
mov [bx],ax
mov bx,pointer_t
mov ax,bx
add bx,4
add ax,[bx]
sub ax,4
mov bx,ax
mov ax,pointer_s
mov [bx],ax
release4_finish:
pop dx
pop bx
pop ax
ret
code ends
end start
[07/10/23] |