汇编计算器程序实验报告Word下载.docx
《汇编计算器程序实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《汇编计算器程序实验报告Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
使变元a与标号s对应,接着给对应的符号赋予权值,将其权值存入ch中。
(3)加减乘除运算子程序模块
运算模块实现了将ax入栈保存,然后将ax,bx赋值为0,判断cl中的符号是否为乘号,若为乘号,则将number中的数字与其下一位的数字相乘,并把结果存入该位置。
类似的若不为乘号则接着判断。
(4)调用赋权宏子程序模块
该模块实现了赋权宏fq为(,),*,、,+,-,=等符号分别赋权值为5,1,4,4,3,3,0.从而可以通过设定的权值来判断优先级
(5)清屏子程序模块
本模块先将即将用到的ax,bx,cx,dx寄存器入栈保存,通过ah=06h屏幕上卷功能,用bh=07h将屏幕设置为黑底白字,给dh,dl赋值将其清屏位置设定在30行80列范围,从而实现了清屏功能,然后再讲ax,bx,cx,dx寄存器出栈
(6)回车换行宏模块
通过2号功能的输出功能,将0dh赋予dl输出,再调用2号功能,将0ah赋予dl输出,从而实现回车换行功能。
(7)9号功能显示字符串宏模块
通过定义宏show,用9号显示功能,通过变元str将字符串显示出来
程序设计流程图:
=
数字
符号
y
yn
yn
四、代码及分析
程序代码:
datassegment
spacedb1000dup('
'
)
partten1db5dup('
),23dup(),'
$'
str1db0ah,0dh,'
179,'
*********************'
str2db0ah,0dh,'
****'
str3db0ah,0dh,'
**Weclome!
**'
str4db0ah,0dh,'
str5db0ah,0dh,'
str6db0ah,0dh,'
Pressanykeytocontinueorqtoexit?
sign1dw0;
判断是否有数字输入存储区,值为0代表输入的不是数字,为1代表输入的是数字
sign2dw0;
判断括号是否配对,值为0代表输入的是符号是匹配的,为1代表不匹配
numberdw20dup(0);
保存输入的数值
operatordb'
;
判断输入的运算符是否为空
db10dup(0);
保存该运算符对应的权值
errordb'
Wrong!
datasends
showmacrostr;
宏定义,显示字符串
leadx,str
movah,09h
int21h
endm
fqmacroascii,a,b;
宏定义,给运算符赋权值
cmpal,ascii
jnes&
a
movch,b
jmps7
huichemacro;
宏定义,回车换行
movah,02h
movdl,0dh
movdl,0ah
codessegment
assumecs:
codes,ds:
datas
start:
callclear
movax,0600h
callscren
;
movax,0001h
int10h
movax,datas
movds,ax
leadi,number
leasi,operator
showpartten1
showstr1
showstr2
showstr3
showstr4
showstr5
huiche
movax,0
movbx,0
movcx,0
movdx,0
start1:
input:
movah,01h
cmpal,'
='
第一种情况,第一次输入的是=,则直接=0.第一次输入的数分为2大种情况:
1.=2.数字或字符:
28h-39h
jelet0;
是等号,进一步判断输入括号是否配对第1大种情况排除后就剩下数字和字符了,再判断是数字还是字符
cmpal,28h;
第二种情况,第一次输入的与28h也就是'
('
比较
jbinput;
小于28h时重新输入
cmpal,39h;
大于39h是重新输入
jainput
cmpal,2fh;
判断是数字还是符号
jbelet1;
是符号转入响应操作
incwordptrsign1;
是数字将数字标志位加一
subal,30h;
将ascii码转为16进制
movah,0
xchgax,[di]
mulbx
movbx,10
add[di],ax
jmpinput
let0:
cmpwordptrsign2,0;
判断配对标志位
jelet1;
经过左括号和右括号抵消为0则跳转
jmplet8;
否则显示输入错误
let1:
cmpwordptrsign1,0;
判断数值指针是否已经下移一位
jelet2
adddi,2;
证明之前操作已输入了数字,则下移一字单元位置将其赋0
movwordptrsign1,0;
将数字标志位复0
let2:
calldyfq;
设定优先级
cmpch,5;
判断输入的符号是否是左括号
jnelet3;
不是则判断输入的是否是右括号
incwordptrsign2;
是左括号,括号标志位加1
let3:
cmpch,1;
判断输入的符号是否是右括号
jnelet4
decwordptrsign2;
是右括号,括号标志位减1
let4:
cmpbyteptr[si],'
判断运算符存储区是否为空
jelet6
cmpch,[si];
【si】的内容为前一个符号或其权值
jalet6
jnelet5
decsi
let5:
movcl,[si]
callmatch;
判断是什么运算符并进行相应的运算
jmplet4
let6:
cmpch,0;
判断是否是等号
jeoutput
cmpch,1
jeinput;
‘)’不保存,输入下一个数
incsi
mov[si],al;
保存符号
cmpch,5;
判断是否是左括号
jnelet7
movch,2;
改变(的权值
let7:
mov[si],ch;
紧跟着保存符号的权值
let8:
leadx,error
movah,9
jmpexit
matchprocnear;
子程序,进行相应的运算
pushax
cmpcl,2ah;
乘法运算
jnechu
subdi,2
xchgbx,[di]
imulbx
mov[di],ax
adddi,2
jmpfinish
chu:
除法运算
cmpcl,2fh
jnejia
cwd
idivbx
jia:
加法运算
cmpcl,2bh
jnejian
add[di],bx
jian:
减法运算
cmpcl,2dh
jnefinish
sub[di],bx
finish:
popax
ret
matchendp
dyfqproc;
子程序dyfq调用宏fq
fq28h,1,5;
调用宏fq为(赋权值
s1:
fq29h,2,1;
s2:
fq2ah,3,4;
*
s3:
fq2fh,4,4;
/
s4:
fq2bh,5,3;
+
s5:
fq2dh,6,3;
-
s6:
fq3dh,7,0;
=
s7:
dyfqendp
clearprocnear;
清屏
pushbx
pushcx
pushdx
movah,06h
movbh,07h
movdh,30
movdl,80
int10h
popbx
popcx
popdx
clearendp
output:
输出结果
cmpwordptr[di],0
jgek1
negwordptr[di];
求负数的绝对值
movdl,'
-'
movah,2
k1:
movbx,10000
mov