雪地里裸体后空翻360°包3宿跪求——懂汇编的进

cjz010 2009-05-01 05:18:55
题目要求是:用汇编(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
...全文
189 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ASSM701 2009-05-02
  • 打赏
  • 举报
回复
好长的代码啊!!!
mengcheng8487 2009-05-02
  • 打赏
  • 举报
回复
帮顶。。。。
BAYNPU 2009-05-01
  • 打赏
  • 举报
回复
不是都已经加注注释吗,不过这个在MASM6.15汇编时程序有点问题:
...
CMP byte ptr[BX],'$' ;比较是否是'$'
...
CMP byte ptr [BX],'$' ;比较是否是空格
....
源码链接: https://pan.quark.cn/s/a4b39357ea24 ### Ubuntu 用户磁盘空间分配与 Linux 硬盘分区方案深入剖析 #### 标题与描述中的核心知识要点说明 本文件将系统性地阐释在 Ubuntu 操作系统中如何为用户科学地分配磁盘空间,并深入分析适用于 Linux 的硬盘分区策略。文件不仅会介绍基础的目录结构及其功能,还会提供具体的分区指导以及在实际操作过程中需要留意的事项。 #### 目录结构及其功能说明 - **/bin**:系统常用基础命令的存储位置。 - **/boot**:含启动时所需文件,例如内核镜像和初始化脚本等。 - **/dev**:存放设备文件。 - **/etc**:存储系统配置信息。 - **/home**:用户个人目录,每个用户拥有独立的子目录。 - **/lib**:存放运行二制文件所需的共享库。 - **/mnt**:用于临时挂载其他文件系统的目录,可用于挂载软盘或 CD-ROM 设备。 - **/proc**:虚拟文件系统目录,存储当前运行内核的相关信息。 - **/root**:超级用户(root)的主目录。 - **/sbin**:系统管理程序的存放位置。 - **/tmp**:临时文件存储的目录。 - **/usr**:存放只读数据,括应用程序的可执行文件和文档等。 - **/var**:存储可变数据文件,例如日志文件和邮件队列等。 - **/X11R6**:X Window 系统的安装路径。 #### 硬盘分区策略分析 文件中强调,在 Linux 环境下行硬盘分区时需要综合考量多个因素,以确保系统的稳定运行和性能表现。以下是一些关键的分区建议: 1. **/boot ...
代码转载自:https://pan.quark.cn/s/4f1937b2c732 Quartus Prime是由Altera公司(现已被Intel公司所收购)研发的一款集成化电子设计自动化软件,其主要应用领域在于Field-Programmable Gate Array(现场可编程门阵列)以及Complex Programmable Logic Device(复杂可编程逻辑器件)的设计、仿真、综合、布局布线以及编程等任务。在本案例中,所提及的为Quartus Prime 17.1版本的安装程序,该程序内含器件库文件及其他相关组件,适用于Windows 10 64位操作系统环境,并且已有相关测试验证其可用性。 **1. Quartus Prime概述** Quartus Prime是Altera/Intel公司FPGA设计流程的核心工具,它提供了一个集成化的开发平台,支持从设计概念到硬件实现的完整过程。该软件不仅涵盖了逻辑综合、时序分析、仿真、物理设计等基础功能,还含了高速接口IP核、嵌入式处理器系统、内存资源管理等多种高级特性。 **2. Quartus Prime 17.1版本的新增功能** - QSYS系统构建工具的优化:17.1版本可能对QSYS系统行了升级,使得系统集成更为便捷,支持更多的外部设备和处理器模型。 - 性能提升:可能增强了综合和布局布线的效率,降低了设计的功耗和面积。 - 新器件支持:可能会增加对最新发布的Altera FPGA和CPLD产品的支持,如Arria 10、Cyclone 10等系列产品。 - 调试功能的改:可能强化了硬件调试工具,如JTAG调试和软件调试器的性能。 **3. 器件库文件** 器件库文件是Quartu...

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧