汇编--计算器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]

相关文档
最新文档