《微机原理与接口技术》课程设计电气与自动化工程系 通信工程2010-12-28院 系: 专 业: 年级班级: 学 号: 姓 名: 指导教师: 设计日期:一、课程设计目的每个同学在1-2周时间内,用汇编语言独立完成一个程序题,以达到熟练运用汇编语言编程实现有比较完整功能的程序的目的。
二、课程设计要求从键盘上输入数字参与运算,并在屏幕上显示结果,至少实现加法减法运算。
三、课题分析该程序设计的关键是要根据四则运算中()、*、/、+、-、= 的优先级设置符号的权值,其中(、*、/、+、-、)、= 的权值分别设置为5、4、4、3、3、1、0 ,然后根据权值的大小进行运算。
程序使用数字标志SIGN1、括号标志SIGN2分别来判断数字是否输入完毕和括号是否配对,另外程序定义两个数据存储区域NUMB和MARK,其中NUMB用来保存输入的或运算的数值,MARK用来保存输入的符号及其对应的权值。
程序不断判断输入的符号是否是左括号‘(’,当遇到左括号是在存储区MARK保存其符号,紧跟着将‘(’的权值改为2并保存之,这是为了使程序运算括号内的表达式,当遇到右括号‘)’时括号内运算将结束。
需要注意的是程序执行完括号内表达式的运算及乘除运算后将在存储区MARK中覆盖符号(、)、*、/ 及紧跟着的权值,使得程序在运算整个四则运算表达式时当括号内表达式的运算及乘除运算结束后存储区MARK中只有‘ +、-’运算符及紧跟着的权值,然后按照+、- 运算符的左右顺序从左到右进行‘ +、- ’运算,当最后遇到等号‘ = ’时输出表达式的数值,然后再根据提示判断是否继续执行下一个四则运算表达式。
四、流程图五、程序源代码DATAS SEGMENT STR1 DB 0AH,0DH,'@******************************************@$' STR2 DB 0AH,0DH,'@* *@$' STR3 DB 0AH,0DH,'@* Welcome you ! *@$' STR4 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) ;保存输入的数值 MARK DB 'M' ;保存输入的运算符 DB 10 DUP (0) ERROR DB 'YOUR INPUT IS WRONG$' DATAS ENDS DISP MACRO STR LEA DX,STR MOV AH,9 INT 21H ENDM CHOICE MACRO ASC,HAO,H ;宏定义,给运算符赋权值 CMP AL,ASC JNE OTH &HAO MOV CH,H JMP OTH7 ENDM CODES SEGMENT ASSUME CS:CODES,DS:DATAS START :CALL CLEAR MOV AX,DATAS MOV DS,AX LEA DI,NUMB LEA SI,MARK DISP STR1 DISP STR2 DISP STR3 DISP STR4 DISP STR5DISP STR6 DISP STR7 DISP STR8 CALL CR MOV AX,0 MOV BX,0 MOV CX,0 MOV DX,0 START1: CALL CR INPUT: 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 SIGN1 ;将数字标志位加1 SUB AL,30H ;将ASCII 码转16进制 MOV AH,0XCHG AX,[DI]MUL BXMOV BX,10XCHG AX,[DI]ADD [DI],AXJMP INPUTPD: CMP WORD PTR SIGN2,0 ;判断配对标志位JE JUDJMP BCJUD:CMP WORD PTR SIGN1,0 ;判断数值指针是否已经下移一位JE FUHADD DI,2MOV WORD PTR SIGN1,0 ;将数字标志位复0FUH:CALL ADVANCE ;设定优先级CMP CH,5 ;判断输入的符号是否是左括号JNE PY ;不是则判断输入的是否是右括号INC WORD PTR SIGN2 ;是左括号,括号标志位加1PY:CMP CH,1 ;判断输入的是否是右括号JNE AGAINDEC WORD PTR SIGN2 ;是右括号,括号标志位减1AGAIN:CMP BYTE PTR[SI],'M';判断运算符存储区是否为空如23*56-(8*19)/6+67-8=1322JE SAVECMP CH,[SI] ;[SI]的内容为前一个符号或其权值JA SAVECMP BYTE PTR[SI],'('JNE YIDODEC SIJMP INPUTYIDO:DEC SIMOV CL,[SI]CALL MATCH ;判断是什么运算符并进行相应的计算JMP AGAINSAVE:CMP CH,0 ;判断是否是等号JE OUTPUTCMP CH,1JE INPUT ;“)”不保存,输入下一个数INC SIMOV [SI],AL ;保存符号INC SICMP CH,5 ;判断是否是左括号JNE GO_ONMOV CH,2 ;改变(的权值GO_ON:MOV [SI],CH ;紧跟着保存符号的权值JMP INPUTBC: LEA DX,ERRORMOV AH,9INT 21HJMP J_SHUMATCH PROC NEAR ;子程序,进行相应的运算PUSH AXXOR AX,AXXOR BX,BXCMP CL,2AH ;乘法运算 JNE NEXT1SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]IMUL BXMOV [DI],AXADD DI,2JMP FINISHNEXT1:CMP CL,2FH ;除法运算 JNE NEXT2SUB DI,2XCHG BX,[DI]SUB DI,2XCHG AX,[DI]CWDIDIV BXMOV [DI],AXADD DI,2JMP FINISHNEXT2:CMP CL,2BH ;加法运算 JNE NEXT3SUB DI,2XCHG BX,[DI]SUB DI,2ADD [DI],BXADD DI,2JMP FINISHNEXT3:CMP CL,2DH ;减法运算 JNE FINISHSUB DI,2XCHG BX,[DI]SUB DI,2SUB [DI],BXADD DI,2FINISH:POP AXRETMATCH ENDPADVANCE PROCCHOICE 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 ENDP CLEAR PROC NEAR ;清屏PUSH AXPUSH BXPUSH CXPUSH DXMOV AX,0600HMOV BH,0FHMOV CX,0MOV DX,184FHINT 10HPOP AXPOP BXPOP CXPOP DXRETCLEAR ENDPCR PROC NEAR ;回车换行PUSH AXPUSH DXMOV AH,2MOV DL,0DHINT 21HMOV AH,2MOV DL,0AHINT 21HPOP DXPOP AXRETCR ENDPOUTPUT: ;输出运算结果SUB DI,2CMP WORD PTR[DI],0JGE W1NEG WORD PTR[DI]MOV DL,'-'MOV AH,2INT 21HW1: MOV BX,10000MOV CX,5MOV SI,0W2: MOV AX,[DI]CWDDIV BXMOV [DI],DXCMP AL,0JNE W3CMP SI,0JNE W3CMP CX,1JE W3JMP W4W3: MOV DL,ALADD DL,30HMOV AH,2INT 21HMOV SI,1W4: MOV AX,BXMOV DX,0MOV BX,10DIV BXMOV BX,AX LOOP W2CALL CR DISP MESGMOV AH,1INT 21HCMP AL,'n'JE J_SHUCMP AL,'N'JE J_SHUMOV WORD PTR[DI+2],0 CALL CRLEA DI,NUMBLEA SI,MARKJMP START1J_SHU:MOV AH,4CHINT 21HCODES ENDSEND START六、结果显示七、感想、收获及体会学习汇编语言:大一学习的是C语言,因此,在学汇编语言之初,面对格式之类的感觉很不适应。
C语言用的是一个又一个变量,而汇编语言则是利用一个又一个寄存器来实现。
而写代码的时候,经常会因为一些符号,或者字长的失误,完全是无心之失而导致程序无法执行。
而回过来找错误的时候,又往往忽略了这些细节而找不到错误的根源。
学习汇编是个艰辛的过程,从C语言到汇编的不适,到牢记大量的指令,并熟练应用,都要花费很多时间适应。
对有些指令的源操作数和目的操作数,以及操作结果的存放位置都要熟记于心。
否则,你将很难应用这些指令,学习汇编的一个重要能力就是能够熟练调试所写程序,当某个程序不能执行时,而又发现不了错误,这就要对程序进行逐步调试了。