资源描述
目录一、计算器的具体功能错误!未定义书签。二、软件设计流程极其描述错误!未定义书签。三、源程序代码 12四、课程设计体会 23五、参考文献 23附录 . 23一、计算器的具体功能1、输入一个正数后按回车可以直接输出该正数;2、输入一个负数后按回车可以直接输出该负数;3、可以进行有符号数的加运算;4、可以进行有符号数的减运算;5、可以进行有符号数的加、减运算;6、可以进行有符号数的乘运算;7、可以进行有符号数的除运算;8、可以进行有符号数的乘、除运算;9、可以进行有符号数的加、减、乘、除四则运算;10、支持使用括号改变运算顺序;11、输入一个数值不是很大的合法的算术表达式并按回车,可以得到 正确的结果。二、软件设计流程极其描述一、软件设计简要流程下页所示:以上为主流程图开始NAL=ODHNAL=NNAL=NN结束AL=)AL= /AL= OAL=(用02与栈顶数值比较大 于则入栈,否则栈中算符 出栈到S2DI冲,直到大于 时再入栈,最后将02压入栈 中用01与栈顶数值比较大 于则入栈,否则栈中算符 出栈至到S2DI 中,直到大 于时再入栈“最后将01压入 栈中用01与栈顶数值比较大于 则入栈,否则栈中算符出栈 至到 S2DII中,直到大于时再 入栈“最后将01压入栈中用02与栈顶数值比较大 于则入栈,否则栈中算符 出栈到S2DI冲,直到大 于时再入栈,最后将02压入 栈中PUSH AX再将0放入栈中,如果之后的 第一个字符为-,则将0放 入S2D I冲直接将其存入S2DI 中,遇至OASCCI小于0时则将空格放 入S2DI中S1SI-AL将栈中运算符逐一出栈至0S2DI中,遇到左括号停止 并将其弹出0-SI;0-DI;0-AHPUSH DI如果第一个字符为-,则要先将0存入S2DI中在进行 其他处理以上为中缀表达式转化为后缀表达式的流程图。其每次向S2中输入一个字符,DI就会加1。当压入(后,再压入0 作为运算符优先级的判断;当压入+或-后,再压入01 作为运算符优 先级的判断;当压入*或/后,再压入 02作为运算符优先级的判断。栈中弹出两个数据进行加运算,并将最终结果压入栈中将前面的一连 串数字字符转 化为相应的数 值并将最终结 果压入栈中当遇到数字字符时,将其转为相应的数值,若其后字符的ASCI I值不小于0,则前面数值乘10再加上这个字符对应的数值,直到遇到空格为止吗开始栈中弹出两个数据进行减运算,并将最终结果压入栈中以上为计算后缀表达式数值的流程图AX-NSIAX-NSIDX、AX除以 100; AX-NSI;DX-AXDX、AX除以 1000;AX-NSI;DX-AXx开始0-SI;STORAGE-AX;0-DXNZ0AX1000AX=1000OAX=100YAX=10AXNSIAX10000+rftNNYAX-NSIDX、AX除以 10000;AX-NSI;DX-AXJNAX=0AX-NSI;DX、AX除以 100; AX-NSI;DX-AX结束以上为输出运算结果程序的流程图二、简要流程中五大步骤的具体描述1、步骤(一):从键盘输入合法中缀算术表达式,并将其存储到S1中此处用系统功能 1 号调用,每次从键盘输入一个字符,就将其存入到数组 S1 中,然后在判断此字符是否为回车,如果不是,则循环,继续输入字符, 否则,程序往下执行。2、步骤(二):调用子程序CHANGE将中缀式转化为后缀式此处最核心的就是中缀表达式转化为后缀表达式的算法。具体思路为: 用一个栈来存储与运算符号.先将字符压入栈中,并假设其优先级为 0.然 后遍历S1中的字符,遇到数字直接存入S2中并且输完数字后向S2中输入一 空格以备计算结果时用。遇到运算符则先判断其与栈顶运算符的优先级谁大。 如果 S1 中运算符号优先级大,则此运算符号直接入栈;否则栈顶符号先出栈 到S2,待栈顶符号优先级小于S1中符号时,S1中元素入栈。3、步骤(三)调用子程序CALCULATE对后缀表达式进行有符号数的运算,并将最终结果存放在栈中遍历 S2 中的字符,遇到空格,则将前面数字字符串转换成的数据压入栈 中。遇到加号,从栈中弹出两个数据进行加法运算,并将运算结果压入栈中 遇到减号,从栈中弹出两个数据进行减法运算,并将运算结果压入栈中。遇 到乘号,从栈中弹出两个数据进行乘法运算,并将运算结果压入栈中。遇到 除号,从栈中弹出两个数据进行除法运算,并将运算结果压入栈中。整个字 符串遍历完后,最终计算结果就保存在栈中。(软件设计简要流程图)4、步骤(四)POP AX, AX-STORAGE,即用STORAGE存放最终运算结 果将栈中保存的最后运算结果弹出,并保存到STORAGE中。5、(五)调用子程序OUTPUT将运算结果输出先判断运算结果是否为负数,如果是,将-存入数组N中,并对运算 结果求补。然后判断数据所在范围,小于32767大于一万则将运算结果除以一 万,并将商赋给数组N;然后将余数除以一千将商赋给数组N;再将余数除以 一百并将商赋给数组N;再将余数除以十并将商赋给数组N;最终将余数赋给 数组N。如果数据更小,也是如此实现,只是步骤更少些。三、程序设计中用到的汇编知识点第一章 预备知识1、执行部件中的数据寄存器: AX, BX, CX, DX;2、执行部件中的指示器变址寄存器:SI,DI,SP,BP;3、总线接口部件的三个代码段:CS, SS, DS;4、数据段的有效地址 EA;5、进栈指令 PUSH;6、出栈指令 POP;第二章 寻址方式1、寄存器寻址方式;2、寄存器间接寻址方式;3、变址寻址方式;4、立即寻址方式;5、直接寻址方式;第三章 宏汇编语言1、变量的使用;2、重复子句n DUP(表达式)的使用;3、标号的使用;4、地址表达式的使用;5、类型运算符 PTR;6、数据传送指令 MOV ;7、加1 指令 INC;8、加指令 ADD;9、减1指令DEC;10、求补指令 NEG;11、比较指令 CMP;12、有符号乘指令 IMUL;13、有符号除指令 IDIV;14、逻辑乘指令 AND;15、段定义伪指令 SEGMENT, ENDS;16、假定伪指令 ASSUME;17、汇编地址计数器符号$;18、源程序结束伪指令 END;19、常用的输入输出系统功能调用(1)、键盘输入(1 号调用);(2)、显示输出(2 号调用):(3)、显示字符串(9 号调用);第四章 程序设计的基本方法1、顺序程序设计;2、简单条件转移指令 JE,JNE;3、有符号条件转移指令 JG,JGE,JLE;4、无条件转移指令 JMP;5、分支程序设计;6、循环程序设计;7、子程序调用指令 CALL;8、子程序返回指令 RET;四程序设计各过程用到的汇编语言知识点1、过程(一)用到的知识点:(1)、执行部件中的数据寄存器:AH, AL;2)、执行部件中的指示器变址寄存器: SI3)、寄存器寻址方式;4)、变址寻址方式;5)、即寻址方式;6)、变量的使用;7)、标号的使用;8)、数据传送指令 MOV ;9)、加1指令 INC;10)、比较指令 CMP; 11)、键盘输入(1 号调用);12) 、顺序程序设计;13) 、简单条件转移指令 JNE14) 、无条件转移指令 JMP;15) 、 循环程序设计;2、过程(二)用到的知识点:(1) 、执行部件中的数据寄存器: AX,BX,DX;(2) 、执行部件中的指示器变址寄存器:SI, DI, SP, BP;(3) 、数据段的有效地址EA;( 4)、进栈指令 PUSH;(5) 、出栈指令 POP;(6) 、寄存器寻址方式;( 7)、寄存器间接寻址方式;( 8)、变址寻址方式;( 9)、立即寻址方式; (10)、变量的使用;( 11)、标号的使用;(12) 、地址表达式的使用;(13) 、类型运算符 PTR;(14) 、数据传送指令 MOV ;(15) 、加1 指令 INC;(16) 、比较指令 CMP;( 17 )、顺序程序设计;(18) 、简单条件转移指令 JE;(19) 、有符号条件转移指令 JG, JGE, JLE;(20) 、无条件转移指令 JMP;21) 、分支程序设计;22) 、 循环程序设计;23) 、子程序调用指令 CALL24) 、子程序返回指令 RET;3、过程(三)用到的知识点:(1) 、执行部件中的数据寄存器: AX,BX,DX(2) 、执行部件中的指示器变址寄存器:SI, DI;(3) 、数据段的有效地址EA;( 4)、进栈指令 PUSH;(5) 、出栈指令 POP;(6) 、寄存器寻址方式;( 7)、变址寻址方式;( 8)、立即寻址方式;(9)、变量的使用;( 10 )、标号的使用;(11)、地址表达式的使用;( 12)、类型运算符 PTR;(13) 、数据传送指令 MOV ;(14) 、加1 指令 INC;(15) 、比较指令 CMP;(16) 、有符号乘指令 IMUL;(17) 、有符号除指令 IDIV;(18) 、逻辑乘指令 AND;( 19 )、顺序程序设计;( 20)、简单条件转移指令 JE, JNE;(21) 、有符号条件转移指令 JG, JGE, JLE;(22) 、无条件转移指令 JMP;( 23)、分支程序设计;(24)、 循环程序设计;(25)、子程序调用指令 CALL;(26)、子程序返回指令 RET;4、过程(四)用到的知识点:(1)、执行部件中的数据寄存器: AX;(2)、出栈指令 POP;(3)、寄存器寻址方式;(4)、直接寻址方式;(5)、变量的使用;(6)、标号的使用;(7)、数据传送指令 MOV ;(8)、比较指令 CMP;(9)、顺序程序设计;(10)、简单条件转移指令 JE;5、过程(五)用到的知识点:(1)、执行部件中的数据寄存器: AX,BX,DX(2)、执行部件中的指示器变址寄存器:SI;(3)、数据段的有效地址EA;(4)、寄存器寻址方式; ( 5)、变址寻址方式;( 6)、立即寻址方式;( 7)、直接寻址方式; (8)、变量的使用;( 9 )、标号的使用;(10)、数据传送指令 MOV ;(11)、加1 指令 INC;(12)、加指令 ADD;13)、求补指令 NEG;14)、比较指令 CMP;15)、有符号除指令 IDIV;16)、显示字符串(9 号调用);17)、顺序程序设计;18)、有符号条件转移指令 JGE;19)、无条件转移指令 JMP;20)、分支程序设计;21)、循环程序设计;22)、子程序调用指令 CALL;23)、子程序返回指令 RET; 五、计算结果举例(1)以下是输入一个正数后按回车直接输出该正数2)以下是输入一个负数后按回车直接输出该负数:3)以下是加法运算结果:4)以下是减法运算结果:5)以下是乘法运算结果:6)以下是除法运算结果:7)以下几个是加、减、乘、除的混合运算结果:三、源程序代码DATA SEGMENT51 DB 60 DUP,$;存储输入的中缀表达式子52 DB 60 DUP(?),$;存储后缀表达式子N DB 10 DUP(?),$;存储要输出的数字字符串STORAGE DW ?,$;存储运算结果BUF DB PLEASE INPUT EXPRESSION:,0AH,0DH,$BUF1 DB 0AH,0DH,EXPRESSION ERROR!$DATA ENDSSTACK SEGMENT STACKDB 40 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXLEA DX,BUF输出字符串MOV AH,9;BUF提示输入表达式INT 21HMOV SI,0 ;输入的第一个数为负数的处理方法MOV AH,1INT 21HCMP AL,-JNE LLMOV S1SI,0INC SILL: MOV S1SI,ALINC SILLL: MOV AH,1;循环输入表达式INT 21HMOV S1SI,ALINC SICMP AL,0DHJNE LLLMOV DL,0AHMOV AH,2INT 21HCALL CHANGE;调用中缀转后缀子程序CALL CALCULATE调用计算后缀表达式子程序 NEXT :POP AXCMP AX,JE NEXT1MOV STORAGE,AXCALL OUTPUT调用输出运算结果子程序NEXT1:MOV AH,4CHINT 21HERROR:LEA DX,BUF1;输出字符串MOV AH,9;BUF1,提示输入表达错误INT 21HJMP NEXT1CHANGE PROC NEAR;中缀表达式转换为MOV AH,0;后缀表达式的子程序MOV DH,0MOV SI,0MOV DI,0PUSH DICHA:MOV AL,S1SIINC SICMP AL,0DHJE L8CMP AL,(JE L1CMP AL,+JE L2CMP AL,-JE L3CMP AL,*JE L4CMP AL,/JE L5CMP AL,)JE L6CMP AL,0JGE L7JMP ERRORL1:PUSH AX;对左括号的处理MOV AX,0PUSH AXCMP S1SI,-JNE CHAMOV S2DI,0INC DIMOV S2DI, INC DICMP DL,01HJGE L21PUSH AXMOV DX,0101HPUSH DXJMP CHAL21:POP DXPOP BXMOV S2DI,BLINC DIJMP L2L3:MOV BP,SP对减法的处理MOV DX,BPCMP DL,01HJGE L31PUSH AXMOV DX,0201HPUSH DXJMP CHAL31:POP DXPOP BXMOV S2DI,BLINC DIJMP L3CMP DL,02HJGE L41PUSH AXMOV DX,0302HPUSH DXJMP CHAL41:POP DXPOP BXMOV S2DI,BLINC DIJMP L4L5:MOV BP,SP对除法的处理MOV DX,BPCMP DL,02HJGE L51PUSH AXMOV DX,0402HPUSH DXJMP CHAL51:POP DXPOP BXMOV DS:S2DI,BLINC DIJMP L5JNE L61POP DXPOP AXJMP CHAL61:POP DXPOP BXMOV S2DI,BLINC DIJMP L6L7:CMP AL,9对数字的处理JLE L71L71:MOV S2DI,ALINC DICMP BYTE PTR S1SI,0JGE L72MOV AL, MOV S2DI,ALINC DIJMP CHAL72:CMP BYTE PTR S1SI,9JLE L73L73: MOV AL,SIINC SIJMP L71L8: MOV BP,SPCMP BYTE PTR BP,0JG L81POP AXJMP L9L81:POP DXPOP BXMOV S2DI,BLINC DIJMP L8L9: MOV S2DI,0DHRETCHANGE ENDPCALCULATE PROC NEAR ;计算后缀表达式子程序MOV SI,0MOV DI,0MOV AH,0MOV BX,PUSH BXCAL: MOV AL,S2DIINC DICMP AL,0DHJE NEXTCMP AL, JE CALCMP AL,+JE F1CMP AL,-JE F2CMP AL,*JE F3CMP AL,/JE F4CMP AL,0JGE F5JMP ERRORF5: CMP AL,9JLE F51F51: MOV DL,ALAND DL,0FHMOV BL,10MOV AL,0F52:IMUL BLADD AL,DLCMP BYTE PTR S2DI, JNE F53PUSH AXJMP CALF53:MOV DL,S2DIINC DIAND DL,0FHJMP F52F4: POP DXPOP AXIDIV DLAND AX,000FHPUSH AXJMP CALF3: POP DXPOP AXIMUL DLPUSH AXJMP CALF2: POP DXPOP AXSUB AX,DXPUSH AXJMP CALF1: POP AXPOP DXADD AX,DXPUSH AXJMP CALRETCALCULATE ENDPOUTPUT PROC NEAR;输出运算结果子程序MOV SI,0MOV AX,STORAGECMP AX,0JGE C1NEG AXMOV NSI,-INC SIC1:CMP AX,10000JGE C11CMP AX,1000JGE C12CMP AX,100JGE C2CMP AX,10JGE C3 CMP AX,0 JGE C4C11: MOV DX,0MOV BX,10000 IDIV BX ADD AL,30H MOV DS:NSI,AL INC SIMOV AX,DX JMP C1C12:MOV DX,0 MOV BX,1000 IDIV BX ADD AL,30H MOV DS:NSI,AL INC SI MOV AX,DXJMP C1C2: MOV CL,100 IDIV CL ADD AL,30H MOV DS:NSI,AL INC SI MOV AL,AH MOV AH,0 JMP C1C3: MOV CL,10IDIV CL ADD AL,30HMOV DS:NSI,ALINC SIMOV AL,AHMOV AH,0JMP C1C4: ADD AL,30HMOV NSI,ALINC SIJMP C0C0:LEA DX,NMOV AH,9INT 21HRETOUTPUT ENDPCODE ENDSEND START四、课程设计体会作此课程设计前我用数据结构将中缀表达式转换为后缀表达式,并用后 缀表达式计算出表达式结果,那容易,但要转化为汇编语言确实遇到些困难: 首先遇到的问题是如何判断运算符号的优先级;其次遇到的问题是如何输出 一个负数;再一个就是该如何输入一个负数;还有就是如何输出两位及两位 以上的数据。但一切困难在经过努力思考后都解决了。只是每解决一个大问题耗去了 我巨大的时间与精力。在中缀表达式转为后缀表达式及对后缀表达式子进行 计算时用了很多标号,之前我想都不敢想。虽然当时总体思路有,但想到要 用这么多标号,又有些怀疑自己。现在看来,编程时有想法就要大胆的尝试 不要怕麻烦,尤其是对于汇编语言。我这次编程是先搞需求分析,将程序分成几个功能模块,然后将功能一 个一个地实现,这是一种比较好也比较快的编程方法,我感受到了分模块编 程的的好处。编程时也要能够坚持,有时候一个功能在很短的时间内就能实现,但有 的一天也弄不出来。在编程不顺意的时候,坚持、平常心将让我们的付出得 到最好的回报。五、参考文献1、徐孝凯,数据结构辅导与提高,2003。2、王元珍,韩宗芬,IBM-PC宏汇编语言程序设计(第二版),2006年12 月第 32 次印刷。
展开阅读全文