汇编语言实现浮点相乘的程序Word文档格式.docx
《汇编语言实现浮点相乘的程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言实现浮点相乘的程序Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
操作数组合及功能
举例
无符号数乘法
MULsrc
AX=AL*r8、m8
DX.AX=AX*r16/m16
EDX.EAX=EAX*r32/m32
mulbl
imulbx
muldvar
有符号数乘法
IMULsrc
双操作数乘法
IMULdest,src
r16=r16*r16/m16/i8/i16
r32=r32*r32/m32/i16/i32
imuleax,10
imulebx,ecx
三操作数乘法
IMULdest,src,imm
r16=r16/m16*/i8/i16
r32=r32*m32/i8/i32
imulax,bx,-2
Imuleax,ebx,5
除法指令
无符号数除法
DIVsrc
AL=AX÷
r8/m8的商,AH=AX÷
r8/m8余数
AX=DX.AX÷
r16/m16的商,DX=DX.AX÷
r16/m16余数
EAX=EDX.EAX÷
r132/m32的商,EDX=EDX.EAX÷
r32/m32余数
Divbl
Idivbx
Dibebx
有符号数除法
IDIVsrc
2.缓存区的定义
readbuf1byte256dup(0)
3.算法
1)数据存储:
汇编语言只能进行整数相乘的计算,所以我们可以通过键盘将输入的浮点数通过字符记录到缓冲区中,每输入一个字符,内部程序对该字符进行判断是数字还是小数。
2)将小数转化成整数并记录:
如果是数字,则储存在缓冲区的是ASCII码,所以应该减去30H,然后通过乘10累加的形式得到整数。
3)如果是小数点:
记录小数点所在位置,同时指向下一位字符
4)例如4.32这个数字。
将它以字符的形式存入缓冲区中,并记录字符数:
4。
通过指针指向缓冲区地址,读取字符’4’,他的ASCII码是34H。
34H-30H=4H,4*10=40,保存40这个值。
指针加一,读取’.’。
软件流程图:
浮点字符串转换成整数流程图:
调试过程和步骤:
1.程序代码:
includeio32.inc
.data
msg1byte'
请输入第一个数字'
13,10,0
msg2byte'
请输入第二个数字'
13,10,0
readbuf1byte256dup(0)
readbuf2byte256dup(0)
numbyte00h;
记录负号个数
.code
start:
xorecx,ecx
xorebx,ebx
moveax,offsetmsg1
calldispmsg
moveax,offsetreadbuf1;
设置入口参数eax
callreadmsg;
调用输入字符串子程序
movedx,eax;
edx记录字符位数
pushedx;
字符位数压入堆栈保护--------压入堆栈
movesi,offsetreadbuf1;
esi指向readbuf1
cmpbyteptr[esi],'
-'
jzagain3
again1:
.'
jnzagain2
pushecx;
堆栈ecx----------
incesi
decedx
again2:
incecx;
read2循环字符为数字时
moval,[esi]
subal,30h
imulebx,10
movzxeax,al
addebx,eax
cmpedx,00H
jnzagain1
jmpdone1
again3:
;
read1记录负号数num
incnum
jmpagain1
done1:
done保护ebx,小数化成的整数,ecx小数位数-----------压入堆栈
pushebx
popebx
popecx
popedx
subedx,ecx
pushedx
;
------------------------------------------------------------------
moveax,offsetmsg2
moveax,offsetreadbuf2;
movesi,offsetreadbuf2;
jzagain6
again4:
jnzagain5
again5:
jnzagain4
jmpdone2
again6:
jmpagain4
done2:
popebx;
ebx存入换算后的数据二整数
popedx
decedx;
edx存入数据二小数位数
popecx;
数据一的小数位数
popeax;
数据一的整数
addecx,edx
imuleax,ebx
movebx,1
done3:
dececx
cmpecx,0
jnzdone3
movedx,0
divebx
calldispuid
moveax,'
calldispc
moveax,edx
-------------------------------------------------------------------
exit0
endstart
2.调试过程:
1)在D:
\32位微机配套软件dos16\MASM目录下新建一个asm文档,名为float
2)打开并编写程序
3)打开D:
\32位微机配套软件dos16\MASM目录下该图标:
4)
5)
6}
实验结果:
Matlab计算结果:
结果分析:
用汇编语言编写的程序计算结果和MATLAB计算结果一致。
而且比MATLAB计算结果更精确。
结束语:
通过本作业,更加深了对乘法指令特别是除法指令的使用细节。
加深了对缓存区的理解以及堆栈“先进后出”的理解。
唯一的一个遗憾是没有实现带符号的浮点数相乘。