1、汇编语言实现浮点小数的乘法,程序设计总体思路:,小数的乘法利用C语言非常简单,利用汇编则需要考虑很多问题,此程序的设计思路如下: 1、对运算的数据逐位的输入、判断、存储;包括:符号、小数点,整数、小数小数位; 2、对于带符号的数,先对其绝对值进行运算; 3、对于小数的计算利用汇编比较繁琐,此程序将小数转换成整数进行相乘的运算 4、由整数相乘的结果,正确的分离出原数据的整数部分和小数部分 5、判断结果的符号、整数的位数,小数的位数,逐位的分离并输出显示,程序设计思路:(1)两个浮点小数的输入将两个小数逐位的输入,同时逐位经过判断符号位、整数位、小数点位、小数位,并实现数字由ASCII码向数值的转
2、换,最终完成两个小数的输入。输入过程中,对符号个数(0、1、2)、整数位个数及小数位个数做出记录,输入后,符号的个数、整数、整数、小数点标志位、小数和小数的位数存放到不同的存储空间内。例:-3.28的输入,(2)小数向整数的转换 根据对两个小数各自的小数位个数的记录,将小数的整数部分扩大相应的倍数后,与小数的小数部分相加,实现将小数调整为整数。例:浮点小数3.14的转换。(3)整数的乘法 将两个小数转化为整数后,用乘法指令实现两数的相乘,得到乘积。例:,(4)整数向小数的转换 由两个浮点数的小数位数的记录,可以轻易的获得整数向小数转变时的相应倍数。例:,(5)计算结果的转换及其显示 同样根据浮
3、点数的整数位个数和小数位个数,获得各自的位数,进而进行各位的分离以及由数值向ASCII码的逆向转换,并逐位的显示。这里需要指出的是,显示时,符号根据符号位的值(0、1、2)进行判断。另外,在整数和小数部分需要显示小数点“.”。(6)补充 此算法在计算过程中不考虑数的符号,统一的在计算结束后根据符号标志位进行判断。,总程序流程图,程序流程图,一、数据a和b输入的程序流程图,需要指出:数据是逐位输入的,所以每输入一位,立即进行相应的ASCII码的转换,其转换的流程图见下一页!,数据ASCII码转换的程序流程图,程序流程图,程序流程图,数据的存储的程序流程图,程序流程图,数据的转换及计算的程序流程图
4、,数据的计算:当数据a和数据b都完成上述转换后,就完成了由小数到整数的转换,再用MUL汇编指令即可实现两数的相乘。注意数据的保存,及标志位的保护。,是,否,程序流程图,数据逆转换的程序流程图,程序流程图,数据逆ASCII码转换及显示的程序流程图,程序代码,stack segment stack db 1024 dup(0)stack endsdata segmentact db 0; aint dw 0;/数a的整数部分aflt dw 0;/数a的小数部分bint dw 0;/数b的整数部分bflt dw 0;/数b的小数部分dota db 0;/数a的小数点标志值位 ca db 0; /数a
5、的小数位个数位dotb db 0; /数b的小数点标志值位cb db 0; /数b的小数位个数位sign db 0; /数a、b的符号个之和data ends ;code segment code; assume cs:code,ds:data,ss:stack,程序的初始化,start: mov ax,data;mov ds,ax; ;/数字a的输入errora: mov ah,01h; /输入一个字符int 21h; cmp al,32; / 空格je inputb; cmp al,13; /回车je inputb;cmp al,-; /判断正负符号jne nexta1;inc sign;
6、 call errora;nexta1:cmp al,.; /判断小数点jne nexta2;inc dota; call errora;,nexta2: cmp al,0; /判断是否在0-9jb errora;cmp al,9;ja errora;and ah,00h;sub ax,48;cmp dota,0; /以小数点为标志判断是整数部分还是小数部分je inta;inc ca;/是小数部分,则输入一位,标志位加1,记录小数位数mov bx,aflt; 小数的存储mov dx,bx;mov cl,3;shl dx,cl;shl bx,1;add bx,dx;add bx,ax;mov
7、aflt,bx; call errora;,inta: mov bx,aint; 整数的存储mov dx,bx; mov cl,3;shl dx,cl;shl bx,1;add bx,dx;add bx,ax;mov aint,bx; call errora;,;/数字b的输入 inputb: errorb: mov ah,01h;int 21h;cmp al,32; / 空格je kout; cmp al,13; /回车je kout; cmp al,-;jne nextb1;inc sign;call errorb;nextb1:cmp al,.;jne nextb2;inc dotb;
8、call errorb;,nextb2: cmp al,0jb errorb;cmp al,9; ja errorb;and ah,00h;sub ax,48;cmp dotb,0;je intb; inc cb;mov bx,bflt;mov dx,bx;mov cl,3;shl dx,cl;shl bx,1;add bx,dx;add bx,ax;mov bflt,bx; call errorb;,intb:mov bx,bint;mov dx,bx;mov cl,3;shl dx,cl;shl bx,1;add bx,dx;add bx,ax;mov bint,bx; call erro
9、rb;,;/浮点数a调整为整数kout: mov bl,ca; cmp bl,0;je a_over; a_again:mov dx,aint; mov cl,3;shl dx,cl;shl aint,1;add aint,dx; /数a放大十倍 dec bl;jnz a_again; a_over: mov ax,aint;add ax,aflt;mov aint,ax;,;/ 浮点数b调整为整数mov bl,cb; cmp bl,0;je b_over; b_again:mov dx,bint; mov cl,3;shl dx,cl;shl bint,1;add bint,dx;dec b
10、l;jnz b_again;b_over:mov ax,bint;add ax,bflt; mov bint,ax;,;/数a与数b的乘积 mov ax,aint;mov bx,bint;mul bx; push ax;push dx;,;/由整数调整为小数 mov bx,1;mov dl,0;add dl,ca;add dl,cb;cmp dl,0;je l_over; l_again:mov ax,bx; mov cl,3;shl bx,cl;shl ax,1;add bx,ax;dec dl;jnz l_again; l_over: pop dx;pop ax; div bx; mov
11、aint,ax; /整数部分mov aflt,dx; /小数部分,;/ASCII码转换及显示部分;/符号部分 cmp sign,1; /符号三种可能:0、1、2jne sign_overmov dl,45; /-mov ah,02h;int 21h;,;/整数部分的显示sign_over: mov bx,1;cmp aint,1000;jb d2;mov dl,4; jmp int_num_over;d2:cmp aint,100;jb d1:mov dl,3; jmp int_num_over;d1:cmp aint,10;jb d0 mov dl,2; jmp int_num_over;d
12、0: mov dl,1,int_num_over:mov act,dl; /确定整数的位数auto1: mov ax,bx;mov cl,3;shl ax,cl;shl bx,1;add bx,axdec dljnz auto1; mov cl,act;shift1:mov dx,0;mov ax,bx;mov bx,10;div bx;mov bx,ax;mov ax,aint; div bx;push ax;push dx;,int_over:add al,48;mov dl,almov ah,02h;int 21h;pop dx;pop ax;mov ax,dx; mov aint,ax
13、;dec cl;jnz shift1;,;/小数部分mov dl,0; add dl,ca;add dl,cb;mov ca,dl;mov bx,1; dec dl;auto2: mov ax,bx;mov cl,3;shl ax,cl;shl bx,1;add bx,ax;dec dl ;jnz auto2; mov cl,ca;,all_dis_over:mov ax,4c00h;int 21h;code ends ;end start;,;/小数点的显示 cmp aflt,0; je all_dis_over; /小数部分为0,显示结束mov dl,46;mov ah,02h;int 21h;,shift2: mov dx,0;mov ax,aflt;div bx;push dx; add al,48;mov dl,almov ah,02h;int 21h; mov dx,0;mov ax,bx;mov bx,10; div bx;mov bx,axpop dx; mov aflt,dx;dec cl;jnz shift2;,