用汇编语言实现程序的输入输出Word下载.docx
《用汇编语言实现程序的输入输出Word下载.docx》由会员分享,可在线阅读,更多相关《用汇编语言实现程序的输入输出Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
2.3调试及如何解决其中的问题17
2.3.1输入成绩时无法结束输入17
2.3.2输入成绩后无法在显示屏上显示输入的结果17
2.3.3输入成绩后,不能成功的输出成绩,TAB表地址出现问题18
2.3.4完成成绩的输入输出后接收任意键继续新的成绩输入输出18
2.3.5判断数据大小交换的结束标志18
2.3.6美化程序的显示窗口18
2.4编译、连接、调试的过程19
2.4.1设置编译文件的路径:
进入MASM611下19
2.4.2运用MASM进行编译:
MASMCHENGJI.ASM19
2.4.3编译无误后进入LINK连接部分:
LINKCHENGJI.OBJ20
2.4.4进入DEBUG调试生成.EXE可执行文件:
DEBUGCHENGJI.EXE,并用-U参数进行观察代码地址是否有误。
20
2.4.5调试无误后运用-G参数进行运行。
2.5具体操作过程及执行结果21
2.5.1出现提示信息:
21
2.5.2提示请输入成绩并以回车结束输入:
2.5.3完成从大到小的顺序输出成绩:
22
2.5.4提示接收任意键重新开始输入成绩:
第三章总结23
致谢24
参考文献25
引言
由于汇编语言与机器语言几乎一一对应,因此,用汇编语言编写的程序比高级语言编写的程序质量高,占用内存的字节数较少,运行速度也较快。
因此,计算机中凡涉及到与硬件有关的输入输出和控制方面的程序,以及在单机控制、仪器、仪表及家用电器中用于控制方面的程序,大部分都是用汇编语言编写的。
学习汇编语言,可以更好地了解计算机的工作过程,另外,在微型计算机及其接口技术、操作系统及微型机控制技术等课程中,都会大量接触到用汇编语言编写的程序。
而现在汇编编程运用于实现数据的传输及处理等方面,也是非常实用的。
为用户处理中等数量的数据提供更多的方便,尤其是对于学生成绩的处理等问题,现在学生成绩的处理问题很多,需求量也很大,使用也很频繁,学生成绩管理看起来是一个很好解决的问题,实质它是一个非常复杂的处理过程,它包括成绩的录入、成绩的比较排序、成绩的输出等过程,纯粹的人力处理它是一个繁琐的过程。
我们用汇编编写一个对于学生成绩的管理程序,它可以很快捷的得到想要的结果,既快捷又方便,只需要用户输入要处理的数据程序就自动按从大到小的顺序输出来,省时又省力,既简单又方便,是一个好用的处理方法!
第一章概述
1.1概要设计
1.1.1汇编语言简介
汇编语言(AssemblyLanguage)是面向机器的程序设计语言,汇编语言采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。
汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。
使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。
汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点。
在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。
这样用符号代替机器语言的二进制码,就把机器语音变成了汇编语言。
用汇编语言编制的程序输入计算机,计算机不能像用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的“汇编程序”的加工和翻译,才能变成能够被计算机识别和处理的二进制代码程序。
用汇编语言等非机器语言书写好的符号程序称为源程序,运行时汇编程序要将源程序翻译成目标程序。
目标程序是机器语言程序,它一经被安置在内存的预定位置上,就能被计算机的CPU处理和执行。
汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。
汇编语言编程是实现对微型机硬件操作的优选,也是最流行编程技术、新技术的发展方向,掌握汇编编程的核心技术和思想也是很好的发展趋势,也是人们使用的一门成功语言!
1.1.2设计开发平台
汇编语言集成编译器,该软件运行于DOS环境,提供了编辑、编译、运行、调试汇编语言程序的集成环境。
目前支持MASM、TASM、MCS51三种编译器。
第一次使用时,要现在选项菜单中选择您所使用的编译器类型及其目录所在。
bin目录里为本软件
files目录为汇编语言写的用于测试的程序
masm为MASM类型的编译器,其中:
masm.exe为编译器,link.exe为连接器
tasm为TASM类型的编译器,其中:
tasm.exe为编译器,tlink.exe为连接器
mcs51为MCS51类型的编译器,用于MCS51单片机汇编语言的编译,其中:
asm51.exe为编译器,OH.exe为目标文件转十六进制文件(连接器选项选择此文件)。
本次实验所使用的是MASM类型的编译器。
1.2需求分析
1.2.1程序需求分析
学生成绩管理是一个学校不可缺少的重要部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理应该为用户提供充足的信息和快捷的处理手段。
当前成教学院没有一个完善的成绩信息管理平台,计算机使用主要基于MicrosoftOffice,不能发挥有效的作用。
用汇编语言实现学生成绩管理更是少之又少,而趋向于嵌入式技术的发展也越来越快了,而且随着我国教育改革的不断深入以及自学教育的不断扩招,参加考试的人越来越多,考试科目的多样化,使得成教学院对自学考试成绩的管理越趋繁琐、复杂,工作业务繁杂,工作量大,这种传统的学生管理模式已经暴露出种种弊端:
难以统一调配和处理,效率极低,缺乏科学性以及合理性。
随着计算机应用的普及与深入,大大减少教学秘书的工作量,提高工作效率,为教学办公带来了极大的方便。
因此为了充分利用成教学院现有的计算机硬件资源,做好学生成绩管理工作,提高办事效率,实现全面的、相对集中的办公自动化,我们利用能对硬件直接操作的汇编语言来编写一个学生成绩处理的程序,其目的主要为了彻底改变这种繁杂的管理模式,实现全面的、相对集中的、智能化的信息综合管理,为学院的教学管理工作带来方便。
1.2.2程序设计思想
本程序采用汇编语言实现数据的排序及输入、输出的处理,可用于众多数据排序的处理。
此程序包含三个模块:
在此我们以学生成绩排序为例来设计,先用一段代码实现成绩的循环输入,暂存在数据表中,再用一段比较排序代码完成成绩大小排列,暂存,最后再用一段输出代码按照顺序输出成绩。
使用此程序时,用户需要先输入要排序的学生成绩数,然后程序会自动将数据按从大到小的顺序排列出来,然后输出,从而得到相应结果。
1.2.3程序结构设计及功能
我们将程序用模块化的形式进行设计,按照输入——排序——输出的顺序依次设计;
同时每个模块中采用循环的设计结构。
本程序首先实现第一个模块——数据输入(输入功能流程图如图1所示),输入的数据存于预先设定好的存储单元中;
完成输入后进行数据的比较与交换,按照从大到小的顺序依次排列出来实现了第二个模块——数据排序的设计(排序流程示意图如图2所示);
最后实现的是第三个模块——数据输出(输出功能流程示意图如图3所示)。
第二章详细设计
2.1设计分析
本程序的设计,用汇编语言实现不超过100个数据的排序及输入/输出的处理。
实现程序的第一个模块——数据输入并显示,因输入数据是ASCII码存放,所以还要实现数据转换,即将ASCII转换为压缩BCD码。
第二个模块——数据排序的设计,完成输入后进行数据的比较与交换,按照从大到小的顺序依次排列出来。
第三个模块——实现经比较后的数据输出到显示屏上,其中也涉及数据转换即将压缩BCD码转换成ASCII码,并判断输出数据是否输出完整,再显示。
程序设计总流程图如下:
在整个程序中,程序功能被分为了数据输入、比较排序、输出这几个主要模块,以下是几个模块流程的详细设计及核心代码:
2.1.1数据输入
用户在输入信息的提示下,从键盘随机输入不超过100个数据并显示,因输入数据是ASCII码存放,所以还要实现数据转换,即将ASCII转换为压缩BCD码。
判断数据是否输入完成,完成则退出,未完成则返回继续输入,直到输入完成。
数据输入流程图如下:
是
否
图1成绩输入流程图
数据输入核心代码:
START:
MOVAX,DSEG;
数据的初始化
MOVDS,AX
MOVDX,OFFSETDISP2;
显示一排*
MOVAH,09H;
调用9号DOS功能输出字符
INT21H
MOVDX,OFFSETDISP;
显示输入提示信息
MOVAH,9
MOVAH,09H
MOVDX,OFFSETDISP3;
显示一排空格
MOVSI,OFFSETTAB;
定义SI为表TAB的首地址
XORAX,AX
XORCX,CX
XORDI,DI;
计数器清零
MOVBH,01H
;
输入数据
INPUT:
;
判断输入的是否是回车键
MOVAH,1
CMPAL,0DH
JZCMP_NUM
输入十位数
ANDAL,0FH
MOVCL,4
SHLAL,CL
MOVBL,AL
输入个位数
ADDAL,BL
MOV[SI],AL
每个成绩用空格间隔
MOVDL,20H
MOVAH,2
INCSI;
地址+1
INCDI;
计数器+1
CMPDI,99;
最大输入99个数
JZCMP_NUM
JMPINPUT;
无条件跳转
2.1.2数据比较排序
以压缩BCD码的形式读取数据首地址到寄存器中,设置数据交换标志为0,
地址加1,将当前地址中数据放入寄存器,比较判断然后交换数据,若数据比较排序完后结束,若数据还没比较排序完成返回继续循环判断,直到排序完成。
数据比较排序流程图如下:
为0
图2数据排序
数据排序核心代码:
CMP_NUM:
MOV[SI],BH;
为数据表外加一个结束标志
取数据表首地址
MOVAL,[SI];
将第一个数取出放入AL中
MOVCH,0;
CH中存放数据交换标志
CMP_NUM1:
INCSI
MOVBL,[SI];
将当前地址内容放入BL中
CMPBL,BH;
比较BL与结束标志
JZDIP_NUM
CMPAL,BL
JBSWAP_NUM
MOVAL,BL
JMPCMP_NUM1
SWAP_NUM:
数据交换部分
MOVCH,BH
DECSI
MOV[SI],BL
DIP_NUM:
CMPCH,BH
MOVSI,OFFSETTAB
MOVDX,OFFSETDISP1;
显示输出信息
INT21H
2.1.3数据输出
经比较后实现数据从高到低输出到显示屏上,其中也涉及数据转换即将压缩BCD码转换成ASCII码,并判断输出数据是否输出完整,再显示,循环输出直到数据全部输出,然后程序结束。
数据输出流程图如下:
:
N
Y
图3数据输出流程图
成绩输出核心代码:
PUT_OUT:
XORSI,SI;
地址清零
MOVSI,OFFSETTAB;
地址读入TAB表中
PUT_NUM:
MOVAL,[SI];
取数据
MOVBL,AL;
输出十位数
ANDAL,0F0H
SHRAL,CL
ADDAL,30H
MOVDL,AL
ANDBL,0FH;
输出个位数
ADDBL,30H
MOVDL,BL
MOVDL,20H;
输出数据间用空格间隔
INCSI;
DECDI;
计数器-1
JNZPUT_NUM
WAN_LE:
MOVDX,OFFSETDISP3;
MOVDX,OFFSETDISP2;
MOVDX,OFFSETDISP4;
提示输入任意键信息
MOVAH,1;
接受任意键
JMPSTART;
无条件跳转START
MOVAH,4CH
2.2总程序源代码
NAMECHENGJI
DSEGSEGMENT
TABDB100DUP(0);
定义数据表大小
DISPDB0AH,0DH,'
Pleaseentertheendresultandenteracarriagereturn:
'
0AH,0DH,'
$'
请输入成绩并以回车结束输入
DISP1DB0AH,0DH,'
Insequencetotheoutputresults:
以从大到小的顺序输出成绩
DISP2DB0AH,0DH,'
****************************'
DISP3DB0AH,0DH,'
'
DISP4DB0AH,0DH,'
Pleaseinputanykeytocontinue:
接收任意键
DSEGENDS
SSEGSEGMENTSTACK
DB100DUP(0);
输入堆栈段代码
SSEGENDS
CSEGSEGMENT
ASSUMEDS:
DSEG,SS:
SSEG,CS:
CSEG
MOVDX,OFFSETDISP2;
MOVDX,OFFSETDISP;
MOVDX,OFFSETDISP3;
INCSI;
INCDI;
CMPDI,99;
JMPINPUT;
MOV[SI],BH;
将当前地址内容放入BL中
比较BL与结束标志
MOVDX,OFFSETDISP1;
XORSI,SI;
ANDBL,0FH
MOVDL,20H;
DECDI;
MOVDX,OFFSETDISP4;
MOVAH,1;
JMPSTART;
CSEGENDS
ENDSTART
2.3调试及如何解决其中的问题
2.3.1输入成绩时无法结束输入
方法:
以回车键为结束数据输入的标志。
代码:
MOVAH,1
INT21H
CMPAL,0DH;
回车符的ASCII码为0DH
JZCMP_NUM;
跳转至比较成绩大小
2.3.2输入成绩后无法在显示屏上显示输入的结果
在输入提示信息前加一个回车换行符(0AH,0DH,)
代码:
DISPDB0AH,0DH,'
请输入成绩并以回车结束输入,$符号为字符串结束标志
2.3.3输入成绩后,不能成功的输出成绩,TAB表地址出现问题
错误代码:
ANDAL,0FH
MOVCL,4
SHLAL,CL
MOVBL,AL
MOVAH,1
ANDAL,0FH
ADDAL,BL
MOV[SI],AL
MOVSI,OFFSETTAB
正确代码:
把MOVSI,OFFSETTAB删除,其它