《微机原理与汇编语言课程设计.doc》由会员分享,可在线阅读,更多相关《微机原理与汇编语言课程设计.doc(11页珍藏版)》请在三一办公上搜索。
1、微机原理与接口技术课程设计院 系:专 业:年级班级:学 号:姓 名:指导教师:设计日期: 计算机科学与技术学院 通信工程 0803 310809020311 陈玉文 李宝平 2011-03-20微机原理与汇编语言课程设计一. 课程设计目的每个同学在1-2周时间内,用汇编语言独立完成一个程序题,以达到熟练运用汇编语言编程实现有比较完整功能的程序的目的。三、课程设计题目四则运算:从键盘输入一个十进制两位数的四则运算表达式,如23*56(8*19)/6678,编程计算表达式的值,输出十进制结果(有可能是三位或四位十进制),*/位置任意。并要求程序能反复执行直道对“还要继续吗?(y/n)”之类的提示回
2、答“n”或“N”为止。四、课题分析该程序设计的关键是要根据四则运算中( )、*、/、+、-、= 的优先级设置符号的权值,其中(、*、/、+、-、)、= 的权值分别设置为5、4、4、3、3、1、0 ,然后根据权值的大小进行运算。程序使用数字标志SIGN1、括号标志SIGN2分别来判断数字是否输入完毕和括号是否配对,另外程序定义两个数据存储区域 NUMB和MARK,其中NUMB用来保存输入的或运算的数值,MARK用来保存输入的符号及其对应的权值。程序不断判断输入的符号是否是左括号( ,当遇到左括号是在存储区MARK保存其符号,紧跟着将( 的权值改为2并保存之,这是为了使程序运算括号内的表达式,当遇
3、到右括号)时括号内运算将结束。需要注意的是程序执行完括号内表达式的运算及乘除运算后将在存储区MARK中覆盖符号(、)、*、/ 及紧跟着的权值,使得程序在运算整个四则运算表达式时当括号内表达式的运算及乘除运算结束后存储区MARK中只有 +、- 运算符及紧跟着的权值,然后按照+、- 运算符的左右顺序从左到右进行 +、- 运算,当最后遇到等号 = 时输出表达式的数值,然后再根据提示判断是否继续执行下一个四则运算表达式。DATAS SEGMENT STR1 DB 0AH,0DH,*$ STR2 DB 0AH,0DH,* *$ STR3 DB 0AH,0DH,* Welcome you ! *$ STR
4、4 DB 0AH,0DH,* This is programe of sizeyunsuan *$ STR5 DB 0AH,0DH,* Rang(-32768 to 32767) *$ STR6 DB 0AH,0DH,* JikeB082 Hanyou 200807014225 *$ STR7 DB 0AH,0DH,* *$ STR8 DB 0AH,0DH,*$ MESG DB 0AH,0DH,Do you want to continue? (y/n) $ SIGN1 DW 0 ;判断数字是否输入完毕 SIGN2 DW 0 ;判断括号是否配对 NUMB DW 20 DUP(0) ;保存输入的
5、数值 MARK DB M ;保存输入的运算符 DB 10 DUP(0) ERROR DB YOUR INPUT IS WRONG$ DATAS ENDSDISP MACRO STR LEA DX,STR MOV AH,9 INT 21H ENDMCHOICE MACRO ASC,HAO,H ;宏定义,给运算符赋权值 CMP AL,ASC JNE OTH&HAO MOV CH,H JMP OTH7 ENDMCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART: CALL CLEAR MOV AX,DATAS MOV DS,AX LEA DI,NUMB LEA S
6、I,MARK DISP STR1 DISP STR2 DISP STR3 DISP STR4 DISP STR5 DISP STR6 DISP STR7 DISP STR8 CALL CR MOV AX,0 MOV BX,0 MOV CX,0 MOV DX,0 START1: CALL CRINPUT: MOV AH,1 INT 21H CMP AL,= JE PD ;是等号,进一步判断输入括号是否配对 CMP AL,28H JB INPUT CMP AL,39H JA INPUT CMP AL,2FH ;判断是数字还是符号 JBE JUD ;是符号转入响应操作 INC WORD PTR SI
7、GN1 ;将数字标志位加1 SUB AL,30H ;将ASCII码转16进制 MOV AH,0 XCHG AX,DI MUL BX MOV BX,10 XCHG AX,DI ADD DI,AX JMP INPUT PD: CMP WORD PTR SIGN2,0 ;判断配对标志位 JE JUD JMP BC JUD:CMP WORD PTR SIGN1,0 ;判断数值指针是否已经下移一位 JE FUH ADD DI,2 MOV WORD PTR SIGN1,0 ;将数字标志位复0FUH:CALL ADVANCE ;设定优先级 CMP CH,5 ;判断输入的符号是否是左括号 JNE PY ;不是
8、则判断输入的是否是右括号 INC WORD PTR SIGN2 ;是左括号,括号标志位加1PY: CMP CH,1 ;判断输入的是否是右括号 JNE AGAIN DEC WORD PTR SIGN2 ;是右括号,括号标志位减1 AGAIN: CMP BYTE PTRSI,M ;判断运算符存储区是否为空 如23*56(8*19)/66781322 JE SAVE CMP CH,SI ;SI的内容为前一个符号或其权值 JA SAVE CMP BYTE PTRSI,( JNE YIDO DEC SI JMP INPUTYIDO: DEC SI MOV CL,SI CALL MATCH ;判断是什么运
9、算符并进行相应的计算 JMP AGAIN SAVE: CMP CH,0 ;判断是否是等号 JE OUTPUT CMP CH,1 JE INPUT ;“)”不保存,输入下一个数 INC SI MOV SI,AL ;保存符号 INC SI CMP CH,5 ;判断是否是左括号 JNE GO_ON MOV CH,2 ;改变(的权值GO_ON: MOV SI,CH ;紧跟着保存符号的权值 JMP INPUT BC: LEA DX,ERROR MOV AH,9 INT 21H JMP J_SHU MATCH PROC NEAR ;子程序,进行相应的运算 PUSH AX XOR AX,AX XOR BX,
10、BX CMP CL,2AH ;乘法运算 JNE NEXT1 SUB DI,2 XCHG BX,DI SUB DI,2 XCHG AX,DI IMUL BX MOV DI,AX ADD DI,2 JMP FINISHNEXT1:CMP CL,2FH ;除法运算 JNE NEXT2 SUB DI,2 XCHG BX,DI SUB DI,2 XCHG AX,DI CWD IDIV BX MOV DI,AX ADD DI,2 JMP FINISHNEXT2:CMP CL,2BH ;加法运算 JNE NEXT3 SUB DI,2 XCHG BX,DI SUB DI,2 ADD DI,BX ADD DI,
11、2 JMP FINISHNEXT3:CMP CL,2DH ;减法运算 JNE FINISH SUB DI,2 XCHG BX,DI SUB DI,2 SUB DI,BX ADD DI,2FINISH: POP AX RETMATCH ENDPADVANCE PROC CHOICE 28H,1,5 ;(OTH1:CHOICE 29H,2,1 ;)OTH2:CHOICE 2AH,3,4 ;*OTH3:CHOICE 2FH,4,4 ;/OTH4:CHOICE 2BH,5,3 ;+OTH5:CHOICE 2DH,6,3 ;-OTH6:CHOICE 3DH,7,0 ;=OTH7:RETADVANCE E
12、NDPCLEAR PROC NEAR ;清屏 PUSH AX PUSH BX PUSH CX PUSH DX MOV AX,0600H MOV BH,0FH MOV CX,0 MOV DX,184FH INT 10H POP AX POP BX POP CX POP DX RETCLEAR ENDPCR PROC NEAR ;回车换行 PUSH AX PUSH DX MOV AH,2 MOV DL,0DH INT 21H MOV AH,2 MOV DL,0AH INT 21H POP DX POP AX RETCR ENDPOUTPUT: ;输出运算结果 SUB DI,2 CMP WORD P
13、TRDI,0 JGE W1 NEG WORD PTRDI MOV DL,- MOV AH,2 INT 21HW1: MOV BX,10000 MOV CX,5 MOV SI,0W2: MOV AX,DI CWD DIV BX MOV DI,DX CMP AL,0 JNE W3 CMP SI,0 JNE W3 CMP CX,1 JE W3 JMP W4W3: MOV DL,AL ADD DL,30H MOV AH,2 INT 21H MOV SI,1W4: MOV AX,BX MOV DX,0 MOV BX,10 DIV BX MOV BX,AX LOOP W2 CALL CR DISP MES
14、G MOV AH,1 INT 21H CMP AL,n JE J_SHU CMP AL,N JE J_SHU MOV WORD PTRDI+2,0 CALL CR LEA DI,NUMB LEA SI,MARK JMP START1J_SHU: MOV AH,4CH INT 21HCODES ENDS END STAR七、结果显示八、感想、收获及体会 学习汇编语言:大一学习的是C语言,因此,在学汇编语言之初,面对格式之类的感觉很不适应。C语言用的是一个又一个变量,而汇编语言则是利用一个又一个寄存器来实现。而写代码的时候,经常会因为一些符号,或者字长的失误,完全是无心之失而导致程序无法执行。而回
15、过来找错误的时候,又往往忽略了这些细节而找不到错误的根源。学习汇编是个艰辛的过程,从C语言到汇编的不适,到牢记大量的指令,并熟练应用,都要花费很多时间适应。对有些指令的源操作数和目的操作数,以及操作结果的存放位置都要熟记于心。否则,你将很难应用这些指令,学习汇编的一个重要能力就是能够熟练调试所写程序,当某个程序不能执行时,而又发现不了错误,这就要对程序进行逐步调试了。这样更容易发现错误点并牢记。 用汇编语言编写四则运算体会:编写计算简单的不带括号的没有优先级的+、- 或 *、/、运算程序还是不太难的,因为没有优先级程序只要根据表达式运算符的顺序从左到右进行运算,最后输出结果。而该课程设计要求设计能进行带括号的 +、- 或 *、/、混合运算的四则运算程序,难度明显加大了,这样程序设计时要用设定权值的办法来设置符号的优先级,使得程序运行时可根据权值大小进行运算,因此程序编写的难点也就在对优先级的判断上。九文献及参考资料新编16/32位微型计算机原理及应用李继灿等清华大学出版社2001微型计算机技术及应用郑学坚清华大学出版社2002微型计算机技术及应用戴梅萼编著清华大学出版社2003微型计算机原理与接口技术李朝纯主编武汉理工大学出版社2003微机原理与接口技术刘星编著电子工业出版社2002