当前位置:文档之家› 汇编语言程序设计————计算器

汇编语言程序设计————计算器


CODES ENDS
END START
五.运行结果
六.设计总结
本次设计让我学到了很多关于汇编的知识,首先,本次设计是以四 则运算为主题,通过在课堂上学习的基本知识和基本方法以及平时积累 的知识和方法来实现对带符号数的加减乘除运算,在设计过程中,对我 已有的知识进行了巩固,对我之前不太了解的知识有了一定的了解,通 过亲身去编写程序,使得自己的实际动手能力得以增强。其次,通过本 次设计,使我对模块化,结构化的程序设计方法掌握的更加透彻,再 者,就是对于宏的定义,调用以及子程序的定义,调用的方法掌握的更
目录
一.设计内容 2 二.设计方案 2
1.主程序模块. 2 2.赋权值模块. 2 3.加减乘除运算子程序模块. 2 4.调用赋权宏子程序模块. 2 5.回车换行宏模块. 2 6.9号功能显示字符串宏模块. 2 三.设计框图 3 四.程序代码 4 五.运行结果 9 六.设计总结 9
计算器汇编语言程序设计
SUB AL,30H
MOV AH,0
XCHG AX,[DI]
MUL BX
MOV BX,10
XCHG AX,[DI]
ADD [DI],AX
JMP INPUT
CALL FUN
RET
MAIN ENDP
FUN
PROC
NEAR;***********************************************************
2.赋权宏模块.
通过定义宏fq,定义了变元a,b进行参数传递,并使用替换运算符&使 变元a与标号s对应.接着给对应的符号赋予权值,将其权值存入ch中.
3.加减乘除运算子程序模块.
运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的 符号是否为乘号*,若为乘号*则将number中的数字与其下一位的数字相 乘,并把结果存入该位置,类似的若不为乘号*则接着判断是否为除号/, 若为除号/则进行除法运算,然后判断是否为加法,为加法则进行加法 运算,接着判断是否为减法,为减法则进行减法运算并将结果存入当前
12345
*$'
STR3 DB 13,10, '*
67890
*$'
STR4 DB 13,10, '*
+-*/=
*$'
STR5 DB
0AH,0DH,'*******************************************$'
STR6 DB 13,10, 'PLEASE INPUT A FORMULA: $'
LET0:
CMP WORD PTR SIGN2,0;判断配对标志位
JE LET1
;经过左括号和右括号抵消为0则
跳转 LET1:
LET2:
LET3: LET4: 权值
LET5: 计算
LET6:
JMP LET8
;否则跳转到BC显示输入错误
CMP WORD PTR SIGN1,0
JE LET2
ADD DI,2
DB 10 DUP(0) ;保存该运算符对应的权值
ERROR DB 'WRONG!$'
DATAS ENDS
SHOW MACRO STR
;宏定义,显示字符串
LEA DX,STR
MOV AH,9
INT 21H
ENDM
FQ MACRO ASCII,A,B ;宏定义,给运算符赋权值
CMP AL,ASCII
JNE S&A
通过这次设计,我在汇编语言方面收获了很多东西,具体而言,在 宏定义,宏调用和子程序定义,调用方面我学到了比以前更多的知识, 尤其是通过子程序调用宏这种嵌套模式可以简化许多复杂的程序,让程 序更加简洁易懂,此外,这次设计让我认识到了上课认真听讲的必要 性,老师在课堂上讲解的许多知识都很重要,在本次设计中就充分体现 了这一点,所以学好课堂老师讲解的知识是很有必要的。
(1) 主程序模块. (2) 赋权宏模块.
(3) 加减乘除运算子程序模块.
(4) 调用赋权宏子程序模块.
(5) 回车换行宏模块.
(6) 9号功能显示字符串宏模块.
二.设计方案
1.主程序模块.
主程序初始化数据段,调用显示宏show显示界面,输入字符或数字 并判断,调用子程序dyfq调用赋权宏fq为符号赋权,从而判断优先级, 调用加减乘除运算子程序ys对判断出的相应运算符进行运算,输出运算 结果,判断是否继续,继续则返回输入,不继续则退出程序.
DYFQ PROC
;子程序DYFQ调用宏FQ,判断优先级
FQ 28H,1,5
;调用宏FQ为(赋权值
S1:FQ 29H,2,1
;调用宏FQ为)赋权值
S2:FQ 2AH,3,4
;调用宏FQ为*赋权值
S3:FQ 2FH,4,4
;调用宏FQ为/赋权值
S4:FQ 2BH,5,3
;调用宏FQ为+赋权值
S5:FQ 2DH,6,3
加熟练。 本次设计是要实现对有符号数的加减乘除等四则运算,程序开始先
定义了显示界面的诸多字符串,经过显示界面,接下来,定义了判断数 字和判断运算符的存储区,通过这两个存储区来判断当前位置输入的是 数字还是运算符,然后,定义了保存数字和保存运算符的存储区,提示 错误的字符串,显示宏,赋权宏,回车换行宏等,通过主程序对各个宏 及子程序的调用,判断出输入的是数字还是运算符,若是运算符又是运 算符中的哪类运算符,然后,进行加减乘除运算,最后将运算结果存入 保存数字的存储区中,运用到显示输出模块将最后的运算结果显示出 来,从而实现了对带符号数的四则运算功能。
INT 21H
CMP AL,'='
JE LET0
CMP AL,28H
;第二种情况,第一次输入的与28H
也就是‘(’比较
JB INPUT
;小于28H=(则重新输入
CMP AL,39H
JA INPUT
;大于39H=9则重新输入
CMP AL,2FH
;判断是数字还是符号
JBE LET1
;是符号转入响应操作
INC WORD PTR SIGN1 ;是数字的话将数字标志位加1
MOV CH,B
JMP S7
ENDM
HCHH MACRO
;宏义,回车换行
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
ENDM
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
PUSH AX
MOV AX,0
MOV BX,0
CMP CL,2AH
;乘法运算
JNE CHU
SUB DI,2
XCHG BX,[DI]
SUB DI,2
XCHG AX,[DI]
IMUL BX
MOV [DI],AX
ADD DI,2
JMP FINISH
CHU:
CMP CL,2FH
;除法运算
JNE JIA
SUB DI,2
STR7 DB 'CONTINUE(Y/N)?$'
SIGN1 DW 0
;值为0代表输入的不是数字,为1代
表输入的是数字
SIGN2 DW 0
;值为0代表输入的符号是匹配的,
为1输入的符号不匹配
NUMBER DW 20 DUP(0) ;保存输入的数值
OPERATOR DB '$'
;判断输入的运算符是否为空
XCHG BX,[DI]
SUB DI,2
XCHG AX,[DI]
CWD
IDIV BX
MOV [DI],AX
ADD DI,2
JMP FINISH
JIA:
CMP CL,2BH
;加法运算
JNE JIAN
SUB DI,2
XCHG BX,[DI]
SUB DI,2
ADD [DI],BX
ADD DI,2
JMP FINISH
6.9号功能显示字符串宏模块.
通过定义宏show,用9号显示功能,通过变元str将字符串显示出 来。
三.设计框图
开始
加载数据段附加段 显示界面
input输入数字或字符
输入的是=,数字,符号? SIGN1=0?
保存数字 显示错误 = 数字 符号 SIGN2=0? n y 下移2位将SIGN1赋0 设优先级,并判断是何符号 n y 根据符号决定运算,将值存入numb
的计算的第二个数的位置.
4.调用赋权宏子程序模块.
该模块实现了调用赋权宏fq为(,),*,/,+,-,=等符号分别赋权值为 5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级.
5.回车换行宏模块.
通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将 0ah赋予dl输出,从而实现回车换行功能.
JNE LET7
MOV CH,2
;改变(的权值
LET7:
MOV [SI],CH
;紧跟着保存符号的权值
JMP INPUT
LET8:
LEA DX,ERROR
MOV AH,9
INT 21H
JMP EXIT
RET
FUN
ENDP;********************************************************************
;调用宏FQ为-赋权值
S6:FQ 3DH,7,0
;调用宏FQ为=赋权值
相关主题