带符号的四则运算器汇编语言.docx
- 文档编号:30019854
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:16
- 大小:17.71KB
带符号的四则运算器汇编语言.docx
《带符号的四则运算器汇编语言.docx》由会员分享,可在线阅读,更多相关《带符号的四则运算器汇编语言.docx(16页珍藏版)》请在冰豆网上搜索。
带符号的四则运算器汇编语言
编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示:
-278+32=
-132――12=
11*-32=
-1234/-18=
要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形式显示结果,然后允许用户继续键入算式。
如果键入算式后再键入‘.’,则显示结果并结束整个程序。
(‘/’为整除)
datasegment
inputstringdb0dh,0ah,'Pleaseinputtheequaltion(s):
$'
errorstringdb0dh,0ah,'Theinputstringiswrong!
$'
endstringdb0dh,0ah,'ThePragrammhasended.$'
bufferstringdb80dup(?
);保存输入的字符串
number1dw0;保存第一个操作数
number2dw0;保存第二个操作数
number1signdb'+';第一个数的符号此初始化是为了判断此数字没有符号
number2signdb'+';第二个数的符号
computesigndb'#';运算符号
totaldw0;记录字符总个数
test1dw1;判断有符号的数据的符号位之后第一个数据是否为运算符
yanzhengdb0dh,0ah,'Pleaseenterstringagain$';此字符串仅仅是用来验证输出结果做调试用可以删除
test2dw0;此数据是判断第一个字符是否有符号
dataends
codesegment
mainprocfar
assumecs:
code,ds:
data
begin:
pushds
xorax,ax
pushax
movax,data
movds,ax
start1:
movnumber1sign,'+'
movnumber2sign,'+'
movcomputesign,'#';对所有的数据进行初始化必须的
movax,0
movbx,0
movdi,0
movsi,0
movcx,0
movdx,0
movtest1,1
movtest2,0
movtotal,0
movnumber1,0
movnumber2,0
movdx,offsetinputstring;显示输入提示信息
movah,09h;输出提示信息
int21h
newchar:
movah,01h;输入字符
int21h
cmpal,'.';程序完全结束情况*******注意'='以及'.'并没有存入字符数组之中*******
jzshow1
cmpal,'=';允许用户继续输入等式
jzshow2
subal,30h
jlinput
cmpal,9d
jginput
movbufferstring[si],al
incsi
inctotal;存储字符的总个数
jmpnewchar
input:
addal,30h
movbufferstring[si],al
incsi
inctotal
jmpnewchar
show1:
movcx,total;判断用户是否只输入一个'.'字符如果是则直接退出
cmpcx,0
jzxianshi
callcheck
xianshi:
movdx,offsetendstring;显示输入错误
movah,09h
int21h
jmpexit
show2:
callcheck;以'='结束的字符串处理
jmpstart1
exit:
movah,4ch;退出返回DOS系统
int21h
mainendp
checkprocnear;第一个数的识别过程
movsi,0
newchar1:
moval,bufferstring[si];这里只取第一个字符进行判断
cmpal,'-';查看字符串的第一个字符是'+'或者'-'或者整数是整数的话直接进行操作
jzZFshu
cmpal,'+'
jzZFshu
cmpal,0d
jlerror;此处error是用来处理第一个不是此三种情况的错误现在暂时未添加
cmpal,9d
jgerror
jmpnonfuhao;如果能执行到此则说明第一个数是无符号数已经将'+'赋值给第一个数的符号
ZFshu:
callcheck1;转入后续操作数运算符第二个操作数的识别操作
jmpexit1
nonfuhao:
movtest2,1;用来提供下面判断的依据如果test2为1则说明是无符号数不需要赋值符号位
callcheck1
jmpexit1
error:
movdx,offseterrorstring;结束信息输出
movah,09h
int21h
exit1:
ret
checkendp
check1procnear
cmptest2,1
jzcount1
movnumber1sign,al;记录第一个数据的符号
incsi
subtotal,1;因为此处是从字符数组的第二个数据开始识别所以total-1
jmpcount
count1:
subtotal,1;此处也要记得总数-1
movsi,0
count:
;读取第一个操作数
moval,bufferstring[si]
cmpal,'+'
jzcompute1;如果是这些运算符则开始识别第二个数据
cmpal,'-'
jzcompute1
cmpal,'*'
jzcompute1
cmpal,'/'
jzcompute1
cmpal,0d
jlerror1
cmpal,9d
jgerror1
cbw;如果能够执行到此说明此字符一定为0-9的数字而不是运算符则进行转换
xchgax,bx
movcx,10d
mulcx
xchgax,bx
addbx,ax
movnumber1,bx;保存数据于number1
movtest1,0;如果已经输入数据了则将test1赋值1
incsi;记录指针
cmptotal,si
jgecount
compute1:
cmptest1,1;如果之前已经取数据则test1的值已经被修改为0
jzerror1;如果此处为1则说明第一个操作数之后紧接着是另一个运算符则出错
movbx,0
movcomputesign,al;记录为运算符号
incsi;记录第二个操作数的符号判断
count2:
moval,bufferstring[si]
cmpal,'+';此处既是第二个操作数的符号然后直接进行读数操作即可
jzcompute2
cmpal,'-'
jzcompute2
cmpal,0d
jlerror1
cmpal,9d
jgerror1
cbw;如果能够执行到此说明此字符一定为0-9的数字则进行转换
xchgax,bx;此表明第二个操作数也是没有符号的
movcx,10d
mulcx
xchgax,bx
addbx,ax;十进制数据最终存放在bx中
movnumber2,bx;保存数据于number2
incsi;记录指针
cmptotal,si
jgecount2
callcompution
jmpexit2
compute2:
movnumber2sign,al;保存第二个操作数的符号
incsi;第二个操作数符号的下一位
count3:
moval,bufferstring[si]
cmpal,0d
jlerror1
cmpal,9d
jgerror1
cbw;如果能够执行到此说明此字符一定为0-9的数字则进行转换
xchgax,bx
movcx,10d
mulcx
xchgax,bx
addbx,ax;十进制数据最终存放在bx中
movnumber2,bx;保存数据于number2
incsi;记录指针
cmptotal,si;判断是否越界
jgecount3
callcompution;第二个数据识别完毕则进行运算
jmpexit2
error1:
;错误处理***当输入表达式错误的时候这边能够识别***
movdx,offseterrorstring
movah,09h
int21h
movdx,offsetyanzheng
movah,09h
int21h
exit2:
ret
check1endp
computionprocnear;上面过程已经将运算符和操作数的运算符取出下面进行相应的操作
cmpcomputesign,'*'
jzmultiply1
cmpcomputesign,'/'
jzdevide11
cmpcomputesign,'+'
jzplus1
cmpcomputesign,'-'
jzminus1
jmpexit3
multiply1:
callmultiply
jmpexit3
devide11:
calldivide
jmpexit3
plus1:
callplus
jmpexit3
minus1:
callminus
exit3:
ret
computionendp
multiplyprocnear;两个数的乘法运算
movax,number1
movcx,number2;先行计算两个数的乘积然后判断符号
mulcx
movbx,ax
movdl,number1sign
cmpdl,number2sign;相同则输出'+'
jzmult
movdl,'-';不同则输出'-'
movah,02h
int21h
mult:
callshow
ret
multiplyendp
divideprocnear;除法运算
movax,number1
movcx,number2;做法与乘法相同
divcx
movbx,ax
movdl,number1sign
cmpdl,number2sign
jzdivid
movdl,'-'
movah,02h
int21h
divid:
callshow
ret
divideendp
plusprocnear
movdl,number1sign;判断符号是否相等
cmpdl,number2sign
jzfirst3
movbx,number1;整体思想就是如果符号相同则进行相加然后先输出符号再输出结果
cmpbx,number2;如果不相同则用较大数据减去小数据然后判断大数的符号进行输出
jgfirst333
movbx,number2
subbx,number1
cmpnumber2sign,'-'
jzoutputfuhao
outputzheng:
movdl,'+';输出'+'
movah,02h
int21h
callshow
jmpexit4
first333:
subbx,number2
cmpnumber1sign,'+'
jzoutputzheng
outputfuhao:
movdl,'-'
movah,02h
int21h
callshow
jmpexit4
first3:
movbx,number1;两者符号相同一定为'+'操作
addbx,number2
cmpnumber1sign,'-'
jzfirst33
movdl,'+'
movah,02h
int21h
callshow
jmpexit4
first33:
movdl,'-'
movah,02h
int21h
callshow
exit4:
ret
plusendp
minusprocnear
movdl,number1sign;如果符号相同则用较大数减去小数判断大数的符号然后输出符号
cmpdl,number2sign;如果符号不同则相加然后输出number1sign
jzfirst4
movbx,number1
addbx,number2
cmpnumber1sign,'-'
jzfirst444
first56:
movdl,'+'
movah,02h
int21h
first44:
callshow
jmpexit5
first444:
movdl,'-'
movah,02h
int21h
jmpfirst44
first4:
movbx,number1
cmpbx,number2
jgefirst5
movbx,number2
subbx,number1
cmpnumber1sign,'+'
jzfirst444
jmpfirst56
first5:
subbx,number2
movdl,number1sign
movah,02h
int21h
callshow
exit5:
ret
minusendp
showprocNEAR;将存放在bx中的数据进行输出
movcx,10000d
calldec_div
movcx,1000d
calldec_div
movcx,100d
calldec_div
movcx,10d
calldec_div
movcx,1d
calldec_div
ret
dec_divprocnear
movax,bx
movdx,0
divcx
movbx,dx
movdl,al
cmpdl,0
jzexit6
adddl,30h
movah,02h
int21h
exit6:
ret
dec_divendp
showendp
codeends
endbegin;搞定嘎嘎……………………
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 符号 四则 运算器 汇编语言
![提示](https://static.bdocx.com/images/bang_tan.gif)