assume cs:code,ds:data,ss:stack
data segment
db 'RABC.DE..F...GHK....#'
db "Copyright (c) 2007 www.asmedu.net#"
PTCV db 16 dup(0)
PTCDA db 128 dup(0)
PTCDB db 128 dup(0)
PTCDC db 128 dup(0)
data ends
stack segment stack
dw 32 dup(0)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,0
call PToCTree
call CToPTree
mov ax,4c00h
int 21h
;-----------------------------------PToCTree start
;ds:si
PToCTree:
;生成一个树放在本方法PTCData空间中
;PTCDA[0]存储数组的索引值
;PTCDB存储转换之后的二叉树,存储数据依次是节点,左节点索引,右节点索引
push ax
push di
push si
push bx
push dx
mov di,0
mov byte ptr PTCV[0],0
mov al,[si]
mov PTCDA[di],al
mov byte ptr PTCDA[di + 1],-1
mov byte ptr PTCDA[di + 3],1
add di,8
inc si
PTCS:
mov al,[si]
mov PTCDA[di],al
mov al,PTCV[0]
mov PTCDA[di + 1],al
mov PTCDA[di + 3],1
add di,8
inc si
cmp byte ptr [si],'#'
je PTCC
cmp byte ptr [si],'.'
jne PTCS
PTCS1:
add byte ptr PTCV[0],8
inc si
cmp byte ptr [si],'#'
je PTCC
cmp byte ptr [si],'.'
je PTCS1
jmp PTCS
PTCC:
;生成树结束
mov byte ptr PTCDA[di],'#'
;-----------------------------------------------生成树结束
;--------------------------------------------------------------------------树转换成二叉树
mov al,PTCDA[0]
mov PTCDB[0],al
mov byte ptr PTCDB[7],0
mov di,0
mov si,0
mov bx,0
PTCCS1:
push bx
mov bx,offset PTCDA
call PTCF1
pop bx
cmp word ptr PTCV[0],-1
je PTCBackDataA
;左子树
mov al,PTCV[0]
mov ah,PTCV[1]
mov di,ax
add si,8
mov ax,si
mov byte ptr PTCDB[bx + 1],al
mov al,PTCDA[di]
mov PTCDB[si],al
mov byte ptr PTCDB[si + 3],bl
mov al,PTCDB[bx + 7]
inc al
mov PTCDB[si + 7],al
mov bx,si
jmp PTCCS1
PTCBackDataA:
;右子树
;回溯
mov byte ptr PTCDB[bx + 1],-1
PTCBackDataB:
mov ax,0
mov al,PTCDA[di + 1]
mov di,ax
push bx
mov bx,offset PTCDA
call PTCF1
pop bx
cmp word ptr PTCV[0],-1
je PTCNodeOver
mov al,PTCV[0]
mov ah,PTCV[1]
mov di,ax
add si,8
mov al,PTCDA[di]
mov PTCDB[si],al
mov ax,si
mov byte ptr PTCDB[bx + 2],al
mov byte ptr PTCDB[si + 3],bl
mov al,PTCDB[bx + 7]
inc al
mov PTCDB[si + 7],al
mov bx,si
jmp PTCCS1
PTCNodeOver:
mov byte ptr PTCDB[bx + 2],-1
call PTCF2
mov ax,0
mov al,PTCDA[di + 1]
cmp byte ptr PTCDA[di + 1],-1
je PTCReturn
jmp PTCBackDataB
PTCReturn:
mov byte ptr PTCDB[2],-1
mov byte ptr PTCDB[3],-1
mov byte ptr PTCDB[si + 8],'#'
mov bx,offset PTCDA
call ResumeSign
pop dx
pop bx
pop si
pop di
pop ax
ret
;--------function1 start
;在ds:[bx]指向的数据中查找当前节点di的孩子
PTCF1:
push si
push ax
mov si,di
add si,8
PTCF1S1:
cmp byte ptr [bx + si],'#'
je PTCF1ReturnB
mov ax,0
mov al,[bx + si + 1]
cmp ax,di
je PTCF1ReturnA
add si,8
jmp PTCF1S1
PTCF1S2:
add si,8
jmp PTCF1S1
PTCF1ReturnA:
cmp byte ptr [bx + si + 2],1
je PTCF1S2
mov byte ptr [bx + si + 2],1
mov word ptr PTCV[0],si
jmp PTCF1Return
PTCF1ReturnB:
mov word ptr PTCV[0],-1
PTCF1Return:
pop ax
pop si
ret
;--------function1 end
;--------function2 start
PTCF2: ;查找当前节点的父
push ax
PTCF2S:
sub bx,8
mov ax,0
mov al,PTCDA[di]
cmp al,PTCDB[bx]
je PTCF2Return
jmp PTCF2S
PTCF2Return:
pop ax
ret
;--------function2 end
;-----------------------------------PToCTree end
;-----------------------------------CToPTree start
;-------------------------------------------------------------------------二叉树向树的转换
CToPTree:
push ax
push bx
push di
push si
mov bx,0
mov di,0
mov si,0
mov al,PTCDB[bx]
mov PTCDC[di],al
mov byte ptr PTCDC[di + 1],-1
mov byte ptr PTCDC[di + 3],1
CTPS:
cmp byte ptr PTCDB[bx + 1],-1
je CTPS1
mov ax,0
mov al,PTCDB[bx + 1]
mov bx,ax
add si,8
mov al,PTCDB[bx]
mov PTCDC[si],al
mov ax,di
mov PTCDC[si + 1],al
mov di,si
mov byte ptr PTCDC[di + 3],1
jmp CTPS
CTPS1:
cmp byte ptr PTCDB[bx + 2],-1
je CTPS2
mov ax,0
mov al,PTCDB[bx + 2]
mov bx,ax
add si,8
mov al,PTCDB[bx]
mov PTCDC[si],al
mov al,PTCDC[di + 1]
mov PTCDC[si + 1],al
mov di,si
mov byte ptr PTCDC[di + 3],1
jmp CTPS
CTPS2:
mov ax,0
mov al,PTCDC[di + 1]
mov di,ax
call CTPF1
cmp byte ptr PTCDC[di + 1],-1
je CTPReturn
jmp CTPS1
CTPReturn:
mov byte ptr PTCDC[si + 8],'#'
pop si
pop di
pop bx
pop ax
ret
;--------function1 start
CTPF1: ;查找
push ax
CTPF1S:
sub bx,8
mov al,PTCDC[di]
cmp al,PTCDB[bx]
je CTPF1Return
jmp CTPF1S
CTPF1Return:
pop ax
ret
;--------function1 end
;-----------------------------------CToPTree end
;--------恢复树的访问标志位
ResumeSign:
push di
push ax
mov di,0
RSS:
cmp byte ptr [bx + di],'#'
je RSReturn
mov al,PTCV[7]
mov [bx + di + 2],al
mov byte ptr [bx + di + 4],0
add di,8
jmp RSS
RSReturn:
pop ax
pop di
ret
;--------结束
code ends
end start
[07/09/22] |