雪地里裸体后空翻360°包3宿跪求——懂汇编的进
题目要求是:用汇编(X86的)实现二叉树的存储,然后使用先序中序后序三种方式输出结点...
甚是不懂!有热心群众帮帮忙的么...兹有例子一份,如果可以麻烦给加点注释,最好每两行解释一下,
好心人若有写一份的定当感激不尽...
平日里不学习净DOTA去了...555...
PAGE 60,132
TITLE BINTREE
.MODEL SMALL
.STACK 64
.DATA
BUFF1 DB 10 DUP(?) ;暂存结点数
BUFF2 DB 40 DUP(?) ;顺序存储结点数组
BUFF3 DB 40 DUP(?) ;结点中序存储
BUFF4 DB 40 DUP(?) ;结点后序存储
NODE DB 2,?,2 DUP(?) ;存储输入字符缓冲区
MESS0 DB 0AH,0DH,'$'
MESS1 DB 'Please enter the root:','$'
MESS2 DB "'S left children:",'$'
MESS3 DB "'S right children:",'$'
MESS4 DB "PreOrderTraverse is:",'$'
MESS5 DB "InOrderTraverse is:",'$'
MESS6 DB "PostOrderTraverse is:",'$'
NODES DW 0H
NODSI DW 0H
;===================================================================
.CODE
;===================================================================
;主过程
;===================================================================
MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX ;初始化段寄存器
LEA DX,MESS1 ;提示输入根结点
MOV AH,09H
INT 21H
CALL ROOT ;调用ROOT过程输入根结点
MOV DL,'$'
MOV [SI],DL ;在字符串末尾加'$'符
MOV [DI],DL
CALL HUICHE ;回车换行
CALL PREORDER ;先序输出
CALL INORDER ;中序输出
CALL POSTOUT ;后序处理
CALL POSTORDER ;后序输出
MOV AH,1
INT 21H
MOV AX,4C00H
INT 21H
MAIN ENDP
;========================================================================
;回车换行
;========================================================================
HUICHE PROC NEAR
MOV DX,OFFSET MESS0
MOV AH,09
INT 21H
RET
HUICHE ENDP
;=========================================================================
;根(ROOT)节点输入
;=========================================================================
ROOT PROC NEAR
LEA DX,NODE ;将字符存入缓冲区并回显
MOV AH,0AH
INT 21H
MOV DL,NODE+2
CMP DL,0DH
JE ENDROOT
CALL HUICHE ;回车换行
CALL HUIXIAN ;显示该输入节点的内容
MOV BP,OFFSET BUFF4 ;将后序存储区的首地址赋给BP寄存器
MOV DI,OFFSET BUFF3 ;将中序存储区的首地址赋给DI寄存器
MOV SI,OFFSET BUFF2 ;将顺序存储区的首地址赋给SI寄存器
MOV WORD PTR NODSI,SI
MOV BX,OFFSET BUFF1
MOV WORD PTR NODES,BX
CALL CUNCHU
MOV DX,OFFSET MESS2 ;询问是否输入左节点
MOV AH,09H
INT 21H
CALL LEFT ;输入左节点
ENDROOT:
RET
ROOT ENDP
;==========================================================================
;LEFT过程输入左子树
;==========================================================================
LEFT PROC NEAR
LEA DX,NODE ;将字符存入缓冲区并回显
MOV AH,0AH
INT 21H
MOV DL,0DH ;是否是回车键
CMP DL,NODE+2
JE RIGHTNODE ;是则转RIGHTNODE
CALL HUICHE
CALL HUIXIAN ;显示该输入节点的内容
CALL CUNCHU
MOV DX,OFFSET MESS2 ;询问是否输入左节点
MOV AH,09H
INT 21H
CALL LEFT
JMP ENDED
RIGHTNODE:
CALL KONGGE ;存储空格
CALL RIGHT
ENDED:
RET
LEFT ENDP
;==========================================================================
;RIGHT过程输入右子树
;==========================================================================
RIGHT PROC NEAR
CALL HUICHE
CMP BX,WORD PTR NODES
JE ENDRET
DEC BX
MOV DL,[BX]
MOV [DI],DL ;中序存储数组
INC DI
MOV AH,2
INT 21H
MOV DX,OFFSET MESS3 ;询问是否输入右节点
MOV AH,09H
INT 21H
LEA DX,NODE
MOV AH,0AH
INT 21H
MOV DL,0DH ;是否是回车键
CMP DL,NODE+2
JE RIGHT2 ;是则转RIGHT2
CALL HUICHE
CALL HUIXIAN
CALL CUNCHU
MOV DX,OFFSET MESS2 ;询问是否输入左节点
MOV AH,09H
INT 21H
CALL LEFT
JMP ENDRET
RIGHT2:
CALL KONGGE
CALL RIGHT
ENDRET:
RET
RIGHT ENDP
;========================================================================
KONGGE PROC NEAR ;存储空格
MOV BYTE PTR[SI],20H
INC SI
RET
KONGGE ENDP
;========================================================================
;显示当前节点的内容
;========================================================================
HUIXIAN PROC NEAR
MOV DL,NODE +2 ;显示该输入节点的内容
MOV AH,2 ;调用INT中断的2号功能显示一个字符
INT 21H
RET
HUIXIAN ENDP
;===========================================================================
;存储节点数组
;===========================================================================
CUNCHU PROC NEAR
MOV [BX],DL
MOV [SI],DL
INC SI
INC BX
RET
CUNCHU ENDP
;=======================================================================
;后序存储处理
;========================================================================
POSTOUT PROC NEAR
LEA SI,OFFSET BUFF2 ;初始化索引寄存器的值
LEA DI,OFFSET BUFF3
MOV BX,WORD PTR NODSI ;将字符串的首地址送给索引指针BX
MOV DL,[BX]
MOV [SI],DL
MOV [DI],DL
INC SI
INC DI
INC BX
CALL POSTCUN
RET
POSTOUT ENDP
;========================================================================
POSTCUN PROC NEAR
XUNHUAN:
MOV DL,[BX]
CMP DL,20H ;比较当前字符是否是空格
JE KONGE1
CMP [BX],'$' ;比较是否是'$'
JE JIESHU ;是结束循环
MOV [SI],DL
MOV [DI],DL
INC SI
INC DI
INC BX
JMP XUNHUAN
KONGE1:
DEC SI
MOV DL,[BX-1]
CMP DL,20H ;比较上一字符是否是空格
JE KONGE2 ;是则转移KONGE2
INC BX
JMP XUNHUAN ;继续循环
KONGE2:
INC BX
XUNHUAN2:
MOV DL,[SI]
DEC DI
CMP [DI],DL ;比较[SI]和[DI]中的内容是否相等
JE ENDXUNHUAN ;是结束内循环
MOV DL,[DI]
MOV DS:[BP],DL ;存储后序数组
INC BP
JMP XUNHUAN2
ENDXUNHUAN:
INC DI
JMP XUNHUAN ;继续外层循环
JIESHU:
MOV DL,'$'
MOV DS:[BP],DL ;在字符串末尾加'$'符
RET
POSTCUN ENDP
;========================================================================
;先序遍历
;========================================================================
PREORDER PROC NEAR
MOV DX,OFFSET MESS4
MOV AH,09H
INT 21H
MOV BX,WORD PTR NODSI
ADD1:
CMP BYTE PTR[BX],20H ;比较是否是空格
JE ADD2 ;是则转移ADD2
CMP [BX],'$' ;比较是否是空格
JE JIESHU2 ;是则结束输出
MOV DL,[BX]
MOV AH,02H
INT 21H ;调用中断输出当前字符
INC BX ;索引指针BX加1
JMP ADD1 ;检查输出下一字符
ADD2:
INC BX ;空格不输出,索引指针BX加1
JMP ADD1 ;检查输出下一字符
JIESHU2:
CALL HUICHE
RET
PREORDER ENDP
;=========================================================================
;中序遍历
;=========================================================================
INORDER PROC NEAR
MOV DX,OFFSET MESS5
MOV AH,09H
INT 21H
LEA DX,BUFF3
MOV AH,09H
INT 21H
CALL HUICHE
RET
INORDER ENDP
;=========================================================================
;后序遍历
;=========================================================================
POSTORDER PROC NEAR
MOV DX,OFFSET MESS6
MOV AH,09H
INT 21H
LEA DX,BUFF4
MOV AH,09H
INT 21H
RET
POSTORDER ENDP
END MAIN