汇编课程设计汇编语言程序设计.doc

上传人:仙人指路1688 文档编号:2393013 上传时间:2023-02-17 格式:DOC 页数:13 大小:60.50KB
返回 下载 相关 举报
汇编课程设计汇编语言程序设计.doc_第1页
第1页 / 共13页
汇编课程设计汇编语言程序设计.doc_第2页
第2页 / 共13页
汇编课程设计汇编语言程序设计.doc_第3页
第3页 / 共13页
汇编课程设计汇编语言程序设计.doc_第4页
第4页 / 共13页
汇编课程设计汇编语言程序设计.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《汇编课程设计汇编语言程序设计.doc》由会员分享,可在线阅读,更多相关《汇编课程设计汇编语言程序设计.doc(13页珍藏版)》请在三一办公上搜索。

1、 汇编语言程序设计课程设计一. 系统主要功能说明 日份牌窗口 1. 显示当天的日期:年、月、日和星期。 2. 显示变化的时间:时、分、秒。 3. 输入闹钟的定时时间,到时响铃(DOS的7号调用)。 二. 设计要求 1. 将清窗口,设置窗口颜色和日期显示颜色,设置光标位置,回车换行,DOS的2号和9号功能调用,保护和恢复现场等编制成宏,存入宏库中供调用。 2. 将二进制转换成十进制,获取变化的时间等编成子程序。3.日期的获取采用DOS功能调用2AH号;时间则采用读取CMOS时钟方法获得。三. 系统调用说明 主要的系统调用: 1.DOS日期,时间的功能调用 读取系统日期: 格式: (AH)=2AH

2、 INT 21H 返回值: (CX)=年,(DH)=月,(DL)=日,(AL)=星期.均为16进制。读取系统时间: 格式: (AH)=2CH INT 21H 返回值: (CH)=小时(023), (CL)=分(059) (DH)=秒(059), (DL)=百分秒(099).2.时钟中断 INT 1AH的调用 读取时钟计数器的当前值 格式: (AH)=0 INT 1AH 返回值: (CX)=计值高字 (DX)=计值低字说明:8086系统中的8253定时器/计数器每秒产生18.2次中断,即每隔1/18.2秒(约55ms)产生一次中断。每产生一次中断计数器加1.利用这种特性, 不断测试两次调用该功能

3、得到的低值的差值,是否为18可获得1秒的计时。用来控制秒的计时。 3. 读取CMOS时钟 利用IN和OUT指令读取CMOS芯片提供的端口中系统时钟。其端口地址:70H为地址端口,71H为数据端口。在CMOS的RAM中 ,前14个字节(000DH)保存时钟的时间信息(如下),以BCD码存放,一个字节存放两位十进制的数,转换比较方便。 地址: 单元信息 地址 单元信息 00 秒 06 星期 02 分 07 日 04 时 08 月 09 年四:设计思路流程图:开始 清屏,设置光标显示时间窗口 Dos调用显示日期 显示时间子程序读dos时间Time=?alarmY响铃,提示N Cmos读时间 再次读时

4、间 时差?=1秒 N Y大致想法:首先在数据段开辟一显示缓冲区,用来存储系统时间。调用BIOS中断,返回系统时间,并将来返回的二进制时间转换成ASCII码,方便时间显示时的调用。分别将来小时数、分钟数、秒数存入显示缓冲区。通过写显存将时间显示出来。由于获取了的系统时间不会自动刷新,所以我们要设计成刷新的方式来不断获取系统的时间,这样就形成了会跳动的电子钟了。定时功能主要指定一个报警时间作为比较,到了需要响铃时间调用一个音乐程序表示时间到。具体实现步骤:1 将清窗口,设置窗口颜色和日期显示颜色,设置光标位置,回车换行,DOS的2号和9号功能调用,保护和恢复现场等编制成宏,存入宏库中供调用。 2.

5、 将二进制转换成十进制,获取变化的时间等编成子程序。3.日期的获取采用DOS功能调用2AH号;时间则采用读取CMOS时钟方法获得。主要的系统调用:1. DOS日期,时间的功能调用读取系统日期: 格式: (AH)=2AH INT 21H 返回值: (CX)=年,(DH)=月,(DL)=日,(AL)=星期.均为16进制。读取系统时间: 格式: (AH)=2CH INT 21H 返回值: (CH)=小时(023), (CL)=分(059) (DH)=秒(059), (DL)=百分秒(099).均为16进制。2.时钟中断 INT 1AH的调用读取时钟计数器的当前值 格式: (AH)=0 INT 1AH

6、 返回值: (CX)=计值高字 (DX)=计值低字五:源代码宏:CLEARSC MACRO ;清屏 mov AH,06H mov AL,0 mov BH,0F0H mov CH,0 mov CL,0 mov DL,79 int 10H mov DX mov DH,23 mov AH,0 int 10H ENDM CLEARSW MACRO row1,rank1,row2,rank2,color ;开窗口 mov AH,06H mov AL,0 mov CH,row1 mov CL,rank1 mov DH,row2 mov DL,rank2 mov BH,color int 10H ENDM

7、WINDOWS MACRO row1,rank1,row2,rank2,color ;刷屏,向上 mov AH,6 mov AL,1 mov CH,row1 mov CL,rank1 mov DH,row2 mov DL,rank2 mov BH,color int 10H ENDM CURSOR MACRO row,rank ;置光标 mov AH,2 mov DH,row mov DL,rank mov BH,0 int 10H ENDM DISPL MACRO OPR ;2号功能显示 mov AH,2 mov DL,opr int 21H ENDM ENTER MACRO ;换行 mov

8、 AH,2 mov Dl,0DH int 21h mov DL,0AH int 21h ENDM STORE MACRO ;现场保护宏 push AX push BX push CX push DX ENDM RESTORE MACRO ;恢复现场宏 pop DX pop CX pop BX pop AX ENDM主程序:STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSDATA SEGMENT A DB 10 DUP(0) LOW1 DW 0 LOW2 DW 0 G DB PRESS THE ALARM TIME:$ H DB 0AH,0DH,$ I DB

9、 30 DB ? DB 30 DUP($) J DB 0 K DB WELCOME TO THE TIME AND ALARM SYSTEM!$ L DB 10 DUP(?) B DW ? C DB ? D DB ?,?,? E DB ?,?,? F DB ?,?,?DATA ENDSCODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA CMOS_CLOCK_ALARM PROC ;获取变化的时间和响铃 P_C MOV SI,0 ;给偏移指针SI赋初值 S_A_T: LEA DX,G ;把读取时间相应的ASCII码显示于屏幕 MOV AH,9 INT 21H

10、 LEA DX,I MOV AH,10 INT 21H BE: MOV BL,4 ;/*BL为时分秒在CMOS的RAMs地址值,此时赋初值4,为时的地址值*/ R_T: MOV AL,BL ;读时 OUT 70H,AL;/*传送时分秒地址值于地址端口同时从数据端口获取时的BCD码*/ IN AL,71H PUSH AX ;保护现场 MOV CL,4;开始分离时的BCD码的值 /*使用逻辑右移指令,右移四位以分离时的BCD码的十位*/ SHR AL,CL ADD AL,30H MOV ASI,AL INC SI POP AX ;恢复现场 AND AL,00001111B;/*使用逻辑乘指令,分离

11、时的BCD码的个位*/ ADD AL,30H MOV ASI,AL INC SI MOV ASI,: INC SI SUB BL,2 ;/*BL依次自减2,以在接下来的循环依次变为分、秒的地址值*/ CMP BL,0 JGE R_T DEC SI;读取时间和转换为相应的ASCII码结束 MOV ASI,$ LEA DX,A ;把读取时间相应的ASCII码显示于屏幕 MOV AH,9 INT 21H PUSH CX;保护现场 PUSH BX MOV DI,0 MOV CX,7 A1: MOV BL,IDI+2 CMP ADI,BL JNZ A2 INC DI LOOP A1 MOV AH,2;响

12、铃一声 MOV DL,7 INT 21H A2: POP BX;恢复现场 POP CX MOV DL,0DH;显示回车符 MOV AH,2 INT 21H MOV AH,0;第一次时钟中断 INT 1AH MOV LOW1,DX R: MOV AH,0;第二次时钟中断 INT 1AH MOV LOW2,DX MOV AX,LOW2;/*不断测试时钟中断得到的低值的差值,以测试1秒时长*/ SUB AX,LOW1;(LOW2)-(LOW1) CMP AX,18 MOV SI,0 JZ BE JMP R R_C RET ENDP START: MOV AX,DATA MOV DS,AX MOV A

13、H,0;设置显示方式为80*25的彩色文本方式 MOV AL,3 INT 10H CLSC_SSC_SWC 0,0,25,80,74H ;清窗口设置窗口 S_CUR 2,0,0,0 CALL_DOS9 K SSC_SWC 3,20,19,60,43H ;/*设置日期和时间窗口和字体颜色*/ LEA SI,L MOV AH,2AH;取当前时间 INT 21H PUSH CX ;保护现场 PUSH DX PUSH AX MOV AX,CX;把二进制年转换为十进制(如2010) MOV DX,0 MOV B,1000 DIV B ADD AL,30H MOV SI,AL INC SI MOV AX,

14、DX MOV C,100 DIV C ADD AL,30H MOV SI,AL INC SI MOV AL,AH MOV AH,0 MOV C,10 DIV C ADD AL,30H MOV SI,AL INC SI MOV AH,30H MOV SI,AH INC SI MOV AH,$ MOV SI,AH;(CX)=年,(DH)=月,(DL)=日,(AL)=星期. MOV AH,2;设置光标位置7行0列 MOV BH,0 MOV DH,7 MOV DL,0 INT 10H MOV AH,9 ;9号调用显示年 LEA DX,L INT 21H MOV AH,2;打印/ MOV DL,47 I

15、NT 21H POP AX ;恢复现场 POP DX POP CX PUSH CX ;保护现场 PUSH DX PUSH AX MOV AL,DH ;把二进制月转换为十进制 MOV AH,0 MOV C,10 DIV C ADD AL,30H MOV D,AL ADD AH,30H MOV D+1,AH MOV D+2,$ MOV AH,9 ;9号调用显示月 LEA DX,D INT 21H MOV AH,2;打印/ MOV DL,47 INT 21H POP AX ;恢复现场 POP DX POP CX PUSH CX ;保护现场 PUSH DX PUSH AX MOV AL,DL ;把二进

16、制日转换为十进制 MOV AH,0 MOV C,10 DIV C ADD AL,30H MOV E,AL ADD AH,30H MOV E+1,AH MOV E+2,$ MOV AH,9 ;9号调用显示日 LEA DX,E INT 21H MOV AH,2;打印/ MOV DL,47 INT 21H POP AX ;恢复现场 POP DX POP CX PUSH CX ;保护现场 PUSH DX PUSH AX ADD AL,30H ;把二进制日转换为十进制 MOV F,AL MOV F+1,$ MOV AH,9 ;9号调用显示星期 LEA DX,F INT 21H S_CUR 2,0,8,2

17、0 CRLF CALL CMOS_CLOCK_ALARM ;获取变化的时间和响铃 EXIT: MOV AH,4CH INT 21HCODE ENDS END START六:运行结果截图图1图2:七:心得体会心得体会一:遇到困难要多查资料、多问老师、多下功夫尽量自己搞懂遇到困难要多查资料、多问老师、多下功夫尽量自己搞懂,才有收获。我遇到的主要困难:一、 系统功能不会调用二、 宏不会定义三、 代码块分配不合理,程序组织不起来四、 经常出现小错误,编译通不过五、 出现语义错误,很难解决解决办法主要是通过,看书查资料,问同学,问老师。基本问题都得以解决。心得体会二:汇编语言是一种机器语言,有着它无与伦

18、比的优势在没有学习汇编语言以前,我可能会对汇编这门强大而又难学的程序设计语言产生怀疑,因为现在我们有那么多的高级编程语言可以学习,尤其是现在日益强大的面向对象语言。而且每种语言都要比汇编语言学起来容易,而且开发效率更高。那么我们为什么还要学习汇编,汇编这门程序设计语言的存在意义在哪。 学习了汇编语言之后,我发现我不再怀疑汇编语言的强大之处了,汇编语言是一种很强的语言,这是我以前不愿意承认的事实,它的强大在于效率。因为汇编语言要实现的是执行的效率,而不是开发上的效率,这一点可能与现阶段的那些所谓的面向对象以及其它的一些开发语言的目标不同。用汇编语言写的程序,无论是在程序的大小上还是在执行时间上都

19、远远优于高级语言。 汇编语言与其它的程序设计语言相比,操作的是更加底层的东西,它可以直接与硬件打交道,而别的语言基本不可能实现这样的功能。既然是与硬件打交道,那么我们在写程序的时候就要更加小心了,可能一不小心就会把程序跑丢了。如果我们不能够控制程序的正常逻辑,那么程序运行超出我们的控制范围以后,到底会运行到哪里,我们也无从知晓。比如说我们本来是要操作一个用户内存地址空间的数据,但是有时我们会不注意,程序运行到了内核内存地址空间去了,那么这样的程序肯定要面临崩溃了。幸好我们现在使用的是虚拟模式下的汇编语言编程,不用去考虑那么多的问题,大不了重新启动一下资源管理器,要不然电脑还不知道会崩溃多少次。

20、 与汇编语言相比,高级语言在这方面做的就很不错了,毕竟我们在写高级语言代码的时候,没有直接对底层的硬件进行操作,而先与操作系统打交道。至于操作硬件,那是操作系统的事情了,这样我们可以在一定程度上少犯错误,而且与此同时可以减少花在调试程序上的时间,提高了开发效率。但是这并不代表不会出现问题,用高级语言写程序,有时也会出现这样或者那样的问题。而且出了问题,我们可能更加无所适从,因为我们有时不知道语言内部是如何实现交互的,我们也不可能了解每种解决方案的实现细节。汇编语言的另一个优势就是我们必须很清楚我们写的代码是干什么的。这是因为这样,我们写出来的代码没有太多的无用代码,几乎每一句代码都为我们实现了

21、某些实质性的操作。同时由于汇编语言直接操作底层硬件,所以不会像高级语言那样,需要一大堆的代码先和操作系统交互,然后操作系统再操作硬件逻辑。高级语言产生的程序之所以非常大且臃肿还有一个原因是它要包含一些程序集之类的东西,可能一个程序集里面我们只需要某一点,但是在编译、连接产生应用程序的时候,高级语言却将一个很大的程序集包含进来(比如说 #include ),这使得我们的程序与汇编语言相比变得很臃肿,而且真正有用的东西并不是很多。学习汇编语言我认为还有一个好处就是使我们对于一些底层的东西更加了解和熟悉,知道在程序运行的过程中,操作系统和内存里面到底在发生着些什么事情,这样更加有助于我们加深对于程序

22、设计的理解。通过汇编语言的学习,我认为自己学到了很多东西,可能有的时候对于一些内存里发生的事情还不是很清楚。但是即使这样,现阶段学到的这些东西已经很有助于我对于操作系统和组成原理方面的一些内容的理解了。其实学习一门语言,有时感觉一是在学习他的语法上的内容,另一方面可能也是在学习它的一些思想。汇编语言对于语法的严谨性让我们在思考问题的时候变得思维变得更加严谨、缜密,而不再是仅仅的想象一下就罢了心得体会三:汇编语言有着它特有规律,我们因该还好掌握首先,学习这门语言时如果能联系上以前学过的其他高级语言的知识,则会起到良好的效果。例如C语言程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(IF.T

23、HEN.ELSE.),循环结构(FOR.NEXT)三种结构,也通过C语言了解并掌握了什么是子程序,什么是调用。事实上,汇编语言中有关程序结构,子程序等等的知识都是跟C语言十分相似的,只是在编程时用到的语言不同:汇编语言完全面向机器,需要指明数据在寄存器、内存中的流向。第二,学习汇编语言,首要问题是学习80X86指令系统。如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。如果不熟悉汇编指令的功能及其有关规定,那肯定不能灵活使用汇编语言。指令的种类十分繁杂,但其格式却是统一的。指令格式如下

24、:指令助记符 操作数1 ,操作数2 ;注释其中方括号中的内容为可选项。指令助记符决定了指令的功能,对应一条二进制编码的机器指令。指令的操作数个数由该指令确定,可以没有操作数,也可以有一个或多个操作数,大多数指令要显示写出来,还有些操作数是隐含的。当指令包含操作数的时候,书写时必须遵守:1、指令助记符和操作数之间有分隔符,比如几个空格;2、如果含有多个操作数,操作数之间用逗号分隔。现在简单总结汇编语言指令的分类:1、数据传送指令;2、标志位操作指令;3 、算术运算指令;4、逻辑运算指令;5、移位运算指令;6、位操作指令;7、比较运算指令;8、循环指令;9、转移指令;10、条件设置字节指令;11、

25、字符串操作指令;12、BCD码运算调整指令;13、处理器指令。在编写汇编程序时,应该注意特别容易出现的错误,例如在编写数据传送指令时,目的操作数和源操作数的类型一定要匹配,CS不能作为目的操作数,offset后只能跟简单地址符号,等等。汇编语言的寻址方式有直接寻址,寄存器寻址,基址变址寻址,相对基址变址寻址等等,掌握这些都是编写汇编程序很重要的环节。汇编语言中的程序结构,子程序等知识也会帮助我们编写出一个更加完善的汇编程序。另外,我们还应该掌握DOS系统功能调用,宏汇编等知识。这里要对子程序和宏汇编加以区分,我的理解是:子程序是调用,而宏是替换,比如一个MAX宏,所有出现MAX的地方,都用宏代

26、码代替。在学习汇编语言时,指令的功能是学习和掌握的重点,要准确有效并合理的使用这些指令,必须了解一些使用的规则。现对汇编语言编程时的规则进行总结,归纳起来有三点:1、要求指令操作数的寻址方式;2、指令对标志位的影响和标志位对指令的影响;3、指令的执行时间,对可完成同样功能的指令,要选用执行时间短的指令。还有一点十分重要。和所有的程序设计语言一样,要学好汇编语言,实验是必不可少的环节。我们深有体会:书上的程序都能看懂,基本原理也都明白,但是在自己亲手编写程序时,却无从下手,甚至连第一句该怎么写都不知道。通过实验,可以在很大程度上加深印象。在书上看程序,一切都是理所当然,十分顺利,而自己动手,才会真正发现自己的不足之处。程序的编写在记事本中进行即可,掌握debug的使用对实验是有很大帮助的。现在汇编语言的学课程已经告一段落了,学习过程中遇到的所有困难以及遗留的难点都需要我们在其余时间里逐步攻克,在打好基础的前提下,学习更加专业的汇编知识。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号