汇编语言实现浮点相乘的程序.docx
《汇编语言实现浮点相乘的程序.docx》由会员分享,可在线阅读,更多相关《汇编语言实现浮点相乘的程序.docx(17页珍藏版)》请在冰豆网上搜索。
汇编语言实现浮点相乘的程序
汇编语言实现浮点相乘的程序
小数的乘法利用C语言非常简单,利用汇编则需要考虑很多问题,此程序的设计思路如下:
1、对运算的数据逐位的输入、判断、存储;包括:
符号、小数点,整数、小数小数位;
2、对于带符号的数,先对其绝对值进行运算;
3、对于小数的计算利用汇编比较繁琐,此程序将小数转换成整数进行相乘的运算。
4、由整数相乘的结果,正确的分离出原数据的整数部分和小数部分。
5、判断结果的符号、整数的位数,小数的位数,逐位的分离并输出显示。
程序设计思路:
(1)两个浮点小数的输入
将两个小数逐位的输入,同时逐位经过判断符号位、整数位、小数点位、小数位,并实现数字由ASCII码向数值的转换,最终完成两个小数的输入。
输入过程中,对符号个数(0、1、2)、整数位个数及小数位个数做出记录,输入后,符号的个数、整数、整数、小数点标志位、小数和小数的位数存放到不同的存储空间内。
(2)小数向整数的转换
根据对两个小数各自的小数位个数的记录,将小数的整数部分扩大相应的倍数后,与小数的小数部分相加,实现将小数调整为整数。
例:
浮点小数3.14的转换。
(3)整数的乘法
将两个小数转化为整数后,用乘法指令实现两数的相乘,得到乘积。
(4)整数向小数的转换
由两个浮点数的小数位数的记录,可以轻易的获得整数向小数转变时的相应倍数。
(5)计算结果的转换及其显示
同样根据浮点数的整数位个数和小数位个数,获得各自的位数,进而进行各位的分离以及由数值向ASCII码的逆向转换,并逐位的显示。
这里需要指出的是,显示时,符号根据符号位的值(0、1、2)进行判断。
另外,在整数和小数部分需要显示小数点“.”。
(6)补充
此算法在计算过程中不考虑数的符号,统一的在计算结束后根据符号标志位进行判断。
程序流程图
一、
数据a和b输入的程序流程图
数据ASCII码转换的程序流程图
数据的存储的程序流程图
代码:
stacksegmentstack
db1024dup(0)
stackends
datasegment
actdb0;
aintdw0;//数a的整数部分
afltdw0;//数a的小数部分
bintdw0;//数b的整数部分
bfltdw0;//数b的小数部分
dotadb0;//数a的小数点标志值位
cadb0;//数a的小数位个数位
dotbdb0;//数b的小数点标志值位
cbdb0;//数b的小数位个数位
signdb0;//数a、b的符号个之和
dataends;
codesegment'code';
assumecs:
code,ds:
data,ss:
stack
start:
movax,data;
movds,ax;
;////数字a的输入
errora:
movah,01h;//输入一个字符
int21h;
cmpal,32;///空格
jeinputb;
cmpal,13;///回车
jeinputb;
cmpal,'-';/判断正负符号
jnenexta1;
incsign;
callerrora;
nexta1:
cmpal,'.';/判断小数点
jnenexta2;
incdota;
callerrora;
nexta2:
cmpal,'0';/判断是否在0-9
jberrora;
cmpal,'9';
jaerrora;
andah,00h;
subax,48;
cmpdota,0;//以小数点为标志判断是整数部分还是小数部分
jeinta;
incca;//是小数部分,则输入一位,标志位加1,记录小数位数
movbx,aflt;小数的存储
movdx,bx;
movcl,3;
shldx,cl;
shlbx,1;
addbx,dx;
addbx,ax;
movaflt,bx;
callerrora;
inta:
movbx,aint;整数的存储
movdx,bx;
movcl,3;
shldx,cl;
shlbx,1;
addbx,dx;
addbx,ax;
movaint,bx;
callerrora;
;////数字b的输入
inputb:
errorb:
movah,01h;
int21h;
cmpal,32;///空格
jekout;
cmpal,13;///回车
jekout;
cmpal,'-';
jnenextb1;
incsign;
callerrorb;
nextb1:
cmpal,'.';
jnenextb2;
incdotb;
callerrorb;
nextb2:
cmpal,'0'
jberrorb;
cmpal,'9';
jaerrorb;
andah,00h;
subax,48;
cmpdotb,0;
jeintb;
inccb;
movbx,bflt;
movdx,bx;
movcl,3;
shldx,cl;
shlbx,1;
addbx,dx;
addbx,ax;
movbflt,bx;
callerrorb;
intb:
movbx,bint;
movdx,bx;
movcl,3;
shldx,cl;
shlbx,1;
addbx,dx;
addbx,ax;
movbint,bx;
callerrorb;
;///浮点数a调整为整数
kout:
movbl,ca;
cmpbl,0;
jea_over;
a_again:
movdx,aint;
movcl,3;
shldx,cl;
shlaint,1;
addaint,dx;//数a放大十倍
decbl;
jnza_again;
a_over:
movax,aint;
addax,aflt;
movaint,ax;
;////////浮点数b调整为整数
movbl,cb;
cmpbl,0;
jeb_over;
b_again:
movdx,bint;
movcl,3;
shldx,cl;
shlbint,1;
addbint,dx;
decbl;
jnzb_again;
b_over:
movax,bint;
addax,bflt;
movbint,ax;
;//////数a与数b的乘积
movax,aint;
movbx,bint;
mulbx;
pushax;
pushdx;
;//////由整数调整为小数
movbx,1;
movdl,0;
adddl,ca;
adddl,cb;
cmpdl,0;
jel_over;
l_again:
movax,bx;
movcl,3;
shlbx,cl;
shlax,1;
addbx,ax;
decdl;
jnzl_again;
l_over:
popdx;
popax;
divbx;
movaint,ax;//整数部分
movaflt,dx;//小数部分
;///ASCII码转换及显示部分
;///符号部分
cmpsign,1;
//符号三种可能:
0、1、2
jnesign_over
movdl,45;//‘-’
movah,02h;
int21h;
;//整数部分的显示
sign_over:
movbx,1;
cmpaint,1000;
jbd2;
movdl,4;
jmpint_num_over;
d2:
cmpaint,100;
jbd1:
movdl,3;
jmpint_num_over;
d1:
cmpaint,10;
jbd0
movdl,2;
jmpint_num_over;
d0:
movdl,1
int_num_over:
movact,dl;
//确定整数的位数
auto1:
movax,bx;
movcl,3;
shlax,cl;
shlbx,1;
addbx,ax
decdl
jnzauto1;
movcl,act;
shift1:
movdx,0;
movax,bx;
movbx,10;
divbx;
movbx,ax;
int_over:
addal,48;
movdl,al
movah,02h;
int21h;
popdx;
popax;
movax,dx;
movaint,ax;
deccl;
jnzshift1;
movax,aint;
divbx;
pushax;
pushdx;
;//小数点的显示
cmpaflt,0;
jeall_dis_over;
//小数部分为0,显示结束
movdl,46;
movah,02h;
int21h;
;//小数部分
movdl,0;
adddl,ca;
adddl,cb;
movca,dl;
movbx,1;
decdl;
auto2:
movax,bx;
movcl,3;
shlax,cl;
shlbx,1;
addbx,ax;
decdl;
jnzauto2;
movcl,ca;
shift2:
movdx,0;
movax,aflt;
divbx;
pushdx;
addal,48;
movdl,al
movah,02h;
int21h;
movdx,0;
movax,bx;
movbx,10;
divbx;
movbx,ax
popdx;
movaflt,dx;
deccl;
jnzshift2;
all_dis_over:
movax,4c00h;
int21h;
codeends;
endstart;