汇编语言实现浮点相乘的程序.docx
- 文档编号:9671576
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:13
- 大小:110.14KB
汇编语言实现浮点相乘的程序.docx
《汇编语言实现浮点相乘的程序.docx》由会员分享,可在线阅读,更多相关《汇编语言实现浮点相乘的程序.docx(13页珍藏版)》请在冰豆网上搜索。
汇编语言实现浮点相乘的程序
汇编语言实现浮点相乘的程序
姓名:
学号:
专业:
通信工程
汇编语言实现浮点相乘的程序
摘要:
介绍用汇编语言实现浮点相乘的原理算法、硬件框图、软件流程图,以及调试过程、步骤和结果。
并对结果进行了分析。
引言:
在使用汇编语言的过程中,我们很容易对整数进行乘法操作,对于浮点乘法,却没有直接的方法,不能直接实现浮点相乘。
这就给我们使用汇编带来了很大的影响。
这个程序的作用就是用汇编语言实现简单的无符号浮点相乘的程序。
原理:
1.指令介绍
乘法指令
指令类型
指令
操作数组合及功能
举例
无符号数乘法
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:
cmpbyteptr[esi],'.'
jnzagain2
pushecx;堆栈ecx----------
incesi
decedx
again2:
incecx;read2循环字符为数字时
moval,[esi]
subal,30h
imulebx,10
movzxeax,al
addebx,eax
decedx
incesi
cmpedx,00H
jnzagain1
jmpdone1
again3:
;read1记录负号数num
incesi
incnum
decedx
jmpagain1
done1:
;done保护ebx,小数化成的整数,ecx小数位数-----------压入堆栈
pushebx
popebx
popecx
popedx
subedx,ecx
decedx
pushebx
pushedx
;------------------------------------------------------------------
xorecx,ecx
xorebx,ebx
moveax,offsetmsg2
calldispmsg
moveax,offsetreadbuf2;设置入口参数eax
callreadmsg;调用输入字符串子程序
movedx,eax;edx记录字符位数
pushedx;字符位数压入堆栈保护--------压入堆栈
movesi,offsetreadbuf2;esi指向readbuf1
cmpbyteptr[esi],'-'
jzagain6
again4:
cmpbyteptr[esi],'.'
jnzagain5
pushecx;堆栈ecx----------
incesi
decedx
again5:
incecx;read2循环字符为数字时
moval,[esi]
subal,30h
imulebx,10
movzxeax,al
addebx,eax
decedx
incesi
cmpedx,00H
jnzagain4
jmpdone2
again6:
;read1记录负号数num
incesi
incnum
decedx
jmpagain4
done2:
;done保护ebx,小数化成的整数,ecx小数位数-----------压入堆栈
pushebx
popebx;ebx存入换算后的数据二整数
popecx
popedx
subedx,ecx
decedx;edx存入数据二小数位数
popecx;数据一的小数位数
popeax;数据一的整数
addecx,edx
imuleax,ebx
movebx,1
done3:
imulebx,10
dececx
cmpecx,0
jnzdone3
movedx,0
divebx
calldispuid
moveax,'.'
calldispc
moveax,edx
calldispuid
;-------------------------------------------------------------------
exit0
endstart
2.调试过程:
1)在D:
\32位微机配套软件dos16\MASM目录下新建一个asm文档,名为float
2)打开并编写程序
3)打开D:
\32位微机配套软件dos16\MASM目录下该图标:
4)
5)
6}
实验结果:
Matlab计算结果:
结果分析:
用汇编语言编写的程序计算结果和MATLAB计算结果一致。
而且比MATLAB计算结果更精确。
结束语:
通过本作业,更加深了对乘法指令特别是除法指令的使用细节。
加深了对缓存区的理解以及堆栈“先进后出”的理解。
唯一的一个遗憾是没有实现带符号的浮点数相乘。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实现 浮点 相乘 程序