汇编--计算器
![汇编--计算器](https://img.360docs.net/img66/032n3xfz1m9z35vctsln-61.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、计算器的具体功能.......................................... 错误!未定义书签。
二、软件设计流程极其描述.................................. 错误!未定义书签。
三、源程序代码 (12)
四、课程设计体会 (23)
五、参考文献 (23)
附录 (23)
一、计算器的具体功能
1、输入一个正数后按回车可以直接输出该正数;
2、输入一个负数后按回车可以直接输出该负数;
3、可以进行有符号数的加运算;
4、可以进行有符号数的减运算;
5、可以进行有符号数的加、减运算;
6、可以进行有符号数的乘运算;
7、可以进行有符号数的除运算;
8、可以进行有符号数的乘、除运算;
9、可以进行有符号数的加、减、乘、除四则运算;
10、支持使用括号改变运算顺序;
11、输入一个数值不是很大的合法的算术表达式并按回车,可以得到
正确的结果。
二、软件设计流程极其描述
《一》、软件设计简要流程
下页所示:
以上为主流程图
以上为中缀表达式转化为后缀表达式的流程图。
其每次向S2中输入一个字符,DI就会加1。当压入‘(’后,再压入0作为运算符优先级的判断;当压入‘+’或‘-’后,再压入01作为运算符优先级的判断;当压入‘*’或‘/’后,再压入02作为运算符优先级的判断。
以上为计算后缀表达式数值的流程图
以上为输出运算结果程序的流程图
《二》、简要流程中五大步骤的具体描述
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)、执行部件中的指示器变址寄存器:SI;(3)、寄存器寻址方式;
(4)、变址寻址方式;
(5)、即寻址方式;
(6)、变量的使用;
(7)、标号的使用;
(8)、数据传送指令MOV ;
(9)、加1指令INC;
(10)、比较指令CMP;
(11)、键盘输入(1号调用);
(12)、顺序程序设计;
(13)、简单条件转移指令JNE;
(14)、无条件转移指令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)、子程序调用指令CALL;
(24)、子程序返回指令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 SEGMENT
S1 DB 60 DUP(?),'$';存储输入的中缀表达式子
S2 DB 60 DUP(?),'$';存储后缀表达式子
N DB 10 DUP(?),'$';存储要输出的数字字符串STORAGE DW ?,'$';存储运算结果
BUF DB 'PLEASE INPUT EXPRESSION:',0AH,0DH,'$' BUF1 DB 0AH,0DH,'EXPRESSION ERROR!$'
DATA ENDS
STACK SEGMENT STACK
DB 40 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
LEA DX,BUF;输出字符串
MOV AH,9;BUF,提示输入表达式
INT 21H
MOV SI,0 ;输入的第一个数为负数的处理方法
MOV AH,1
INT 21H
CMP AL,'-'
JNE LL
MOV S1[SI],'0'
INC SI
LL: MOV S1[SI],AL
INC SI
LLL: MOV AH,1;循环输入表达式
INT 21H
MOV S1[SI],AL
INC SI
CMP AL,0DH
JNE LLL
MOV DL,0AH
MOV AH,2
INT 21H
CALL CHANGE;调用中缀转后缀子程序
CALL CALCULATE;调用计算后缀表达式子程序NEXT :
POP AX
CMP AX,'@'
JE NEXT1
MOV STORAGE,AX
CALL OUTPUT;调用输出运算结果子程序
NEXT1:
MOV AH,4CH
INT 21H
ERROR:LEA DX,BUF1;输出字符串
MOV AH,9;BUF1,提示输入表达错误
INT 21H
JMP NEXT1
CHANGE PROC NEAR;中缀表达式转换为
MOV AH,0;后缀表达式的子程序
MOV DH,0
MOV SI,0
MOV DI,0
PUSH DI
CHA:
MOV AL,S1[SI]
INC SI
CMP AL,0DH
JE L8
CMP AL,'('
JE L1
CMP AL,'+'
JE L2
CMP AL,'-'
JE L3
CMP AL,'*'
JE L4
CMP AL,'/'
JE L5
CMP AL,')'
JE L6
CMP AL,'0'
JGE L7
JMP ERROR
L1:
PUSH AX;对左括号的处理
MOV AX,0
PUSH AX
CMP S1[SI],'-'
JNE CHA
MOV S2[DI],'0'
INC DI
MOV S2[DI],' '
INC DI
L2:
MOV BP,SP;对加法的处理
MOV DL,[BP]
CMP DL,01H
JGE L21
PUSH AX
MOV DX,0101H
PUSH DX
JMP CHA
L21:
POP DX
POP BX
MOV S2[DI],BL
INC DI
JMP L2
L3:
MOV BP,SP;对减法的处理
MOV DX,[BP]
CMP DL,01H
JGE L31
PUSH AX
MOV DX,0201H
PUSH DX
JMP CHA
L31:
POP DX
POP BX
MOV S2[DI],BL
INC DI
JMP L3
L4:
MOV BP,SP;对乘法的处理
MOV DX,[BP]