帐号 密码  
 
多路树查找-外部查找(B树)【源代码】

多路树查找-外部查找(B树)【下载及演示说明】

双向链表演示程序【下载及演示说明】

循环链表演示程序【下载及演示说明】

链表【讲解】

动态存储分配之边界标识法演示程序【下载及演示说明】

动态存储分配之边界标识法【讲解】

首次适应算法和最佳适应算法【讲解】

动态存储分配之边界标识法【源代码】

振荡排序算法【讲解】

振荡排序演示程序【下载及演示说明】

树和二叉树相互转化【讲解】

深度优先搜索【下载及演示说明】

深度优先搜索【源代码】

朴素字符串匹配演示程序【下载及演示说明】

当前1/4页
首页 上一页 下一页 尾页

算法讲堂

    本栏目所有文章由本站组织业内技术专家原创而成,用汇编语言向学习者讲解经典问题的编程思想和编程方法。

    本栏目所有文章的版权归本站所有,转载请注明出处为汇编网<www.asmedu.net> 。

    现本栏目的内容处于不断添加中,请随时关注。
算法讲堂-》动态存储分配之边界标识法【源代码】
    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]

Copyright C 2006-2024 ASMEDU.NET All Rights Reserved
Email: asmedu@163.com