汇编语言实现浮点相乘的程序.docx

上传人:b****7 文档编号:23752367 上传时间:2023-05-20 格式:DOCX 页数:17 大小:118.06KB
下载 相关 举报
汇编语言实现浮点相乘的程序.docx_第1页
第1页 / 共17页
汇编语言实现浮点相乘的程序.docx_第2页
第2页 / 共17页
汇编语言实现浮点相乘的程序.docx_第3页
第3页 / 共17页
汇编语言实现浮点相乘的程序.docx_第4页
第4页 / 共17页
汇编语言实现浮点相乘的程序.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

汇编语言实现浮点相乘的程序.docx

《汇编语言实现浮点相乘的程序.docx》由会员分享,可在线阅读,更多相关《汇编语言实现浮点相乘的程序.docx(17页珍藏版)》请在冰豆网上搜索。

汇编语言实现浮点相乘的程序.docx

汇编语言实现浮点相乘的程序

汇编语言实现浮点相乘的程序

小数的乘法利用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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 思想汇报心得体会

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1