作业汇编课程设计.docx
《作业汇编课程设计.docx》由会员分享,可在线阅读,更多相关《作业汇编课程设计.docx(13页珍藏版)》请在冰豆网上搜索。
![作业汇编课程设计.docx](https://file1.bdocx.com/fileroot1/2022-12/1/e1936bad-38a8-4660-9077-17ef6e9b8fbc/e1936bad-38a8-4660-9077-17ef6e9b8fbc1.gif)
作业汇编课程设计
前言
汇编语言程序设计汇编大多是指汇编语言,汇编程序。
把汇编语言翻译成机器语言的过程称为汇编。
在汇编语言中,用助符(Memon)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。
这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。
于是汇编语言亦称为符号语言。
用汇言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理的系统软件。
汇编语言(AssemblyLanguage)是面向机器的程序设计语言。
汇编语言比机器语言易于读写、易于调试和修改,同时也具有器语言执行速度快,内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。
是能完成一定任务的机器指令的集合。
常说汇编语言过时,是低级语言,并不是说汇编语言要被弃之,相反,汇编语言仍然是程序员必须了解的语言,在某些行业与领域,汇编是必不可少的,非它不可适用。
只是,现在计算机最大的领域IT软件,也是我们常说的Windows编程,在熟练的程序员手里,使用汇编语言编写的程序,运行效率与性能比其它语言写的程序是成倍的优秀,但是代价是需要更长的时间来优化,如果对计算机原理及编程基础不扎实,实在是得不偿失,对比现在的软件开发,已经是市场化的软件行业,加上高级语言的优秀与跨平台,一个公司不可以让一个团队使用汇编语言来编写所有的东西,花上几倍甚至几十倍的时间,不如使用其它语言来完成,只要最终结果不比汇编语言编写的差太多,就能抢先一步完成,这是市场经济下的必然结果。
但是,至今为止,还没有程序员敢断定汇编语言是不需要学的,一个不懂汇编语言的程序员,只是三流的程序员,这是大部分人的共识,同时,技术汇编语言(AssemblyLanguage)是面向机器的程序设计语言精湛的汇编程序员,已经脱离软件开发,挤身于工业电子编程中,一个电子工程师,主要开发语言就是汇编,c语言使用只占极少部分,而电子开发工程师是千金难求,在一些工业公司,一个核心的电子工程师比其它任何职员待遇都高,对比起来,一般电子工程师待遇是程序员的十倍以上。
这种情况是因为现在学习汇编的人虽然也不少,但是真正能学到精通的却不多,它难学,难用,适用范围小,虽然简单,但是过于灵活,学习过高级语言的人去学习汇编比一开始学汇编的人难得多,但是学过汇编的人学习高级语言却很容易,简从繁易,繁从简难。
总之,汇编语言是程序员的必修语言。
CONTENTS
汇编语言处理数据
前言
一、提出需求......................................61.1汇编语言简介................................61.2设计开发平台........................................6
1.3需求分析.............................................7
二、详细设计......................................7
2.1分析............................................................................2
2.1.1数据输入模块..............................................................8
...............................................................9
102.2调试中的问题及解决方法.....................................................112.3执行过程...........................................................................12
总结......................................................14
附录:
程序代码.........................................15参考资料:
...................................................20
一.提出需求
1、提出设计要求
①课题名称:
用汇编语言处理数据
②课题功能:
随机从键盘输入经排序后,按照从升序的顺序显示出来。
(注:
输入数据个数范围可视具体情况更改)
2、需要用到的知识点
①掌握80X86汇编指令及中断的使用方法;
②掌握DOS系统功能调用;
③掌握基本的数据处理方法(输入、输出、排序)
1.1汇编语言简介
汇编语言(AssemblyLanguage)是面向机器的程序设计语言,采用助记符来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。
使用汇编语言能面向机器并较好地发挥机器的特性,比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,因而可以得到质量较高的程序。
1.2设计开发平台
汇编语言集成编译器(VisualAssembly1.2版)是运行在DOS环境下,提供了编辑、编译、运行、调试汇编语言程序的集成环境。
目前支持MASM、TASM、MCS51三种编译器。
第一次使用时,要在选项菜单中选择您所使用的编译器类型及其目录所在。
masm为MASM类型的编译器,其中:
masm.exe为编译器,link.exe为连接器;
tasm为TASM类型的编译器,其中:
tasm.exe为编译器,tlink.exe为连接器;
mcs51为MCS51类型的编译器,用于MCS51单片机汇编语言的编译,其中:
asm51.exe为编译器,OH.exe为目标文件转十六进制文件(连接器选项选择此文件)。
本次设计使用的是MASM类型的编译器。
1.3需求分析
本程序是通过汇编语言实现数据的排序及输入、输出的处理,适用于多数据排序的处理,程序结构包含三部分:
数据输入、数据排序、数据输出。
设计思路是先用一段程序实现成绩的录入,并暂存在数据表中,再将数据调出进行从大到小的比较,最后用DOS功能调用将完成排序的数据输出显示。
二.详细设计
2.1分析
程序结构分为三个功能模块:
数据输入、数据排序、数据输出。
数据输入模块:
用DOS调用的1号功能实现输入并显示。
因输入数据是以ASCII码形式存放,所以还要对输入数据进行处理,用AND指令将ASCII码转换为压缩BCD码。
并将所有输入数据连续放入存储单元中,为后面的数据处理做准备。
数据排序模块:
将存储单元的数据按照从大到小的顺序排序。
用冒泡法将数据表中的第一个数依次与后面的数两两相比,若小于则将两数的地址互换,直到无地址交换为止。
其中需设置一标志来判断比较是否结束,因N个数据排序理论上需进行(N-1)×(N-1)次比较,但实际上不用比较这么多次,所以当标志位的值没有发生变化时,即完成排序。
输出显示模块:
用DOS调用的2号功能实现输出显示,因该功能是显示字符,所以这部分也涉及数据转换,即将压缩BCD码转换成ASCII码,并判断数据是否输出完整,再显示。
完整流程图如图2-1所示。
2.1.1数据输入模块
用户在输入信息的提示下,从键盘随机输入后,按照从升序的顺序显示出来。
因输入数据是ASCII码,所以还要实现数据转换,即将ASCII码转换为压缩BCD码。
设一标志判断数据是否输入完成,一边输入一边将当前数据保存到指定存储区。
数据输入流程图如图2-2所示。
是
否
设置数据交换标志为0,依次从存储单元中取数据,比较后判断是否需要进行位置交换,直到完成对所有数据的比较,则比较结束。
数据排序流程图如图2-3所示。
是
否
小
大
是
否
在存储单元中的数据是以压缩BCD码形式存放的,要将其显示出来,需要把它们转换为ASCII码,再调用DOS的2号功能,所以在进行显示前要完成数据转换;因输入数据个数不固定,是随机的,故还需判断数据是否已完全输出,再显示。
数据输出流程图如图2-4所示。
N
Y
2.2调试中的问题及解决方法
如图2-5中文输入注释报错
1、在集成环境下运行程序,编译器出现了图2-5的提示:
系统提示未初始化寄存器,但检查程序无误。
进入DOS环境编译,我们可以图2-6中发现程序代码后的“;”根本不存在,这是因为我们在中文方式下输入了“;”,将“;”在英文环境下录入程序即可正常执行。
如图2-6中文输入注释报错
2、在集成环境下运行程序,编译器出现了图2-6的提示:
系统提示data:
块嵌套不匹配,一般是由于前后段名不相同、前后子程序不相同、需要配对出现的指令不一致等会出现该错误
2.3执行过程
1、打开汇编软件,输入该程序的源代码,进行编译,出现如图2-7.
图2-7
2、运行该源代码,出现如图2-8.
图2-8
3、在DOS状态下输入该程序生成的可执行文件名出现图2-9的提示信息:
图2-9
4、随机从键盘输入经排序后,按照从升序的顺序显示出现如图2-10.
图2-10
总结
经过大量的查找资料和老师的不断指点,我的课程设计成功完成,在这个过程中,我了解了汇编语言的功能,同时明白了其的工作原理并实现了其功能。
短短的四周毕业设计是我们对大学两年的计算机知识的整体总结,也是理论与实践的结合。
在我们现有的理论知识下结合校园的实验设备成功地完成了这次毕业设计。
期间让我收获颇多。
在知识技能方面我对面向机器的汇编语言的编写的再次认识与学习,加深专业基础。
俗话说:
“高楼基地起”,可见汇编语言的重要性。
这次课程设计对我来说,要想成功地完成任务不是一件容易的事。
我非常清楚我自己所学的8086汇编知识远远不足。
在这次设计中困难重重,翻阅相关资料,复习以往教科书,网上搜找相关的信息和老师的细心讲解是必不可少的。
在这次设计中,让我学到了新知识,也增长了见识,让我对我所学的知识有所巩固和提高,并且让我对汇编语言有了更深的了解。
在今后的日子里,我仍要不断地充实自己,希望在我所学的专业有所作为。
这次的课程设计在我与同学的共同努力下成功完成的。
这里少不了教授我们的老师,是他授我们以渔,在认真负责的周老师带领下,同学们的团结互助。
我看到了团结的力量,团结的成效,让我学到了重要的一堂社会课。
脚踏实地、认真严谨、实事求是是学习应该有的态度,不怕困难、坚持不懈、吃苦耐劳是我国优良传统美德,这一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。
在本次设计中,衷心的感谢我们的周老师,在我们设计过程中遇到的种种困难,全靠周老师的悉心指导和建议给了我们极大的帮助和支持,使我们受益匪浅,使得我们的动手能力和技能都有了很大的提高。
所以,衷心的感谢周老师。
附录:
程序代码
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;按ASCII编码由小到大排序从键盘上输入的字符串,然后输出
;(输入以回车键结束)
;解:
排序用冒泡法,按无符号数,从小到大
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
namestring_sort;{定义等价符}
unfinishedequ0FFFFh;标记排序任务没完成
FINISHEDequ0;标记排序任务完成了
;----------------------------------------------------------
stacksegmentparastack'STACK'
db16dup('MYSTACK');16*8字节
stackends
;----------------------------------------------------------
datassegment
bufferdb51;可以输入50个有效字符
countdb0
charsdb52dup(0)
crlfdb0dh,0ah,'huanyingshiyong',0dh,0ah,0dh,0ah,'$'
crlgdb0dh,0ah,0dh,0ah,'shengxushurujieguo',0dh,0ah,0dh,0ah,'$'
datasends
;----------------------------------------------------------
codessegment
assumecs:
codes,ds:
datas,es:
datas,ss:
stack
start:
movax,datas
movds,ax
leadx,crlf
movah,9
int21h
moves,ax;从键盘接收一个串(回车结束)
movdx,offsetbuffer;指定字符串存放的首地址
movah,0ah;bufferedkeyboardinputfunc
int21h;callDOS
;排序(冒泡法)
movbx,UNFINISHED;bx用来标记大循环
xorcx,cx;下面只使用cl,清高四位为0
movcl,count;取实际输入的字符数
cmpcl,1;检查输入的字符数
jbesort_finished;如果输入的字符数少于2个,就不需要排序
Next_Round:
cmpbx,FINISHED;排序任务完成了吗?
jesort_finished;完成了就跳出
movbx,FINISHED;先标记排序任务已完成
movcl,count;取实际输入的字符数
deccl;换算成比对的次数(比字符数要少1)
xorsi,si;着si为输出串的下标,初值为0
GetNext:
moval,chars[si];从chars[si]读一个数进al
cmpal,chars[si+1];al与下一个chars元素对比
jbeless;如果小于或等于就跳转(这里要使用无符号数判断)
xchgchars[si+1],al;否则,就交换
movchars[si],al;用al中的新值回填原地址
movbx,UNFINISHED;标记要从头进入下一轮扫描
less:
incsi;调整数组下标变元
loopGetNext;再取下一个字符
jmpNext_Round;进入下一个轮回
sort_finished:
;输出新行
movah,9
movdx,offsetcrlg
int21h
;显示排过序的串
xorsi,si;着si为输出串的下标,初值为0
showNext:
movdl,chars[si];从输出串中提取一个字符
cmpdl,0;检查是不是结束符
jefinish;是就结束
movah,02;否则输出到屏幕
int21h
incsi;指向下一个字符
jmpshowNext;进入显示下一个字符的轮回
finish:
;退出
movax,4c00h
int21h
codesends
endstart;《剧终》
总结
在本次课程设计让我充分了解了汇编语言在实际软件开发中的作用和地位。
在这次课程设计过程中让我把课堂学到的知识得到了充分运用,但这并不能完整的编写出程序,想要把程序做好,必须要通过各种途径掌握更多更好的知识,并且最重要的是要将获得的知识运用到实际编程中,要学以致用。
本次课程设计是自由选题,我可以充分根据我的兴趣和长处选择题目。
当我在编程中遇到很多问题和麻烦时,我就在网上和图书馆还有班上同学中寻求帮助,没有不可克服的困难,我都在最后将他们解决了。
本次课程设计提高了我对汇编的认识,加深了理解,弥补了不少学习理论知识时的不足,相信在以后的继续学习中,我会不断地提高我的编程能力。
参考资料:
【1】龚荣武,陈坚,蔡英微机原理与接口技术.
北京:
北京大学出版社,2005
【2】荆淑霞,王晓,何丽君微机原理与汇编语言程序设计
北京:
中国水利水电出版社,2005
【3】倪继烈,刘新民微机原理与接口技术.
北京,四川:
高等教育出版社,电子科技大学出版社,2004
【4】张伟,张杰单片机原理及应用.
北京:
机械工业出版社,2005
【5】钱晓捷,陈涛型计算机原理及接口技术.
北京:
械工业出版社,1999
【6】钱晓捷,陈涛16/32位微机原理、汇编语言及接口技术.
北京:
机械工业出版社2001
【7】钱晓捷汇编语言程序设计.
北京:
电子工业出版社,2000
【8】李文英,刘星,宋蕴新,李勤微机原理与接口技术.
北京:
电子工业出版社,2001
【9】雷丽文,朱晓华,蔡征宇,缪均达微机原理与接口技术.
北京:
电子工业出版社,1998
【10】邹广慧等汇编语言程序设计.
北京:
机械工业出版社,2001
【11】沈美明,温冬婵.80X86汇编语言程序设计
北京:
清华大学出版社,2001