① 单片机(多字节数乘法和除法)
有现成的例成啊
对于多字节乘除法用汇编语言计算是很不方便的,特别是还要用bcd码计算,这里给你一个思路,先将A,B都转换成二进制数,然后用部分积右移算法计算乘法(参考我的文章http://wenku..com/view/e651f6c9a1c7aa00b52acb30.html?st=1),这种方法是目前比较好的汇编语言乘法算法,不管数据位数的多少都可以计算。最后将计算结果再转换为BCD码。
你可以按这个方法先练习做一下,有什么问题再追问吧。
③ 单片机乘法究竟怎么运算
51单片机乘法指令是 MUL AB
A*B结果高八位为B,低八位为A。
④ 单片机乘除指令计算的具体步骤
关于MUL的用法书上有应该,我就不说了。说几点:
一、单片机的乘法运算只是进制不同,跟我们常用的十进制是一样的。例如:12×10=120
不要简单想成在后边加个0,学了单片机应该学会用*移位*思考,因为单片机不会在后边加 0减0,应该想成12向左移一位,同样二进制的11B×10B =110B ,十六进制11H×10H=110H,八进制也一样。
二、想不通 ,还可换算成十进制去算,然后再转换成相应进制。因为他们数量是一样的只是进 制不同。十进制要满是个进一位,八进制要满8个进一位。十进制的10和八进制的12是一 样的。
啰嗦了半天希望能理解其中的意思。
⑤ 单片机乘法指令
乘法指令当结果大于0FFH时,A就装不下了,所以“溢出”了,大于部分装入到B里面。
⑥ 单片机怎么计算16位数的乘法
加个强制转换行不行 (float)(0x2ab/1024)*500;
⑦ 如何用单片机的汇编语言实现16位数据相乘
将(R2R3)和(R6R7)两个16位无符号数相乘,结果放在(R4R5R6R7)
MOV
A,R3
MOV
B,R7
MUL
AB
XCH
A,R7
MOV
R5,B
MOV
B,R2
MUL
AB
ADD
A,R5
MOV
R4,A
CLR
A
ADDC
A,B
MOV
R5,A
MOV
A,R6
MOV
B,R3
MUL
AB
ADD
A,R4
XCH
A,R6
XCH
A,B
ADDC
A,R5
MOV
R5,A
MOV
F0,C
MOV
A,R2
MUL
AB
ADD
A,R5
MOV
R5,A
CLR
A
MOV
ACC.0,C
MOV
C,F0
ADDC
A,B
MOV
R4,A
⑧ 一个单片机的乘法指令
单片机乘法指令是MUL AB,只能是累加器A和寄存器B相乘,结果低八位存入A,高八位存入B。
比如题中,A=4EH,B=5DH,A*B=1C56H,所以A=56H,B=1CH
⑨ 51单片机带小数的多字节乘除运算
对于多字节数,估计你不会直接保存成数值而是要保存成字符串了吧,当然如果你保存成数值的话通过连续乘10直到结果为整数的方法计算小数点后的位数,对于小数相乘来说,两个数的小数点位数相加就是结果的小数点位数。数值计算可以全当整数,按大数乘法计算。而除法可以通过同时向后移位小数位到全部都是整数,用大数除法的算法解决。如果存的是数值,直接连续乘10.
附,大数计算,这个是在电脑上编的,不过都是C语言,可以参考,有不懂可以问我。
#include <stdio.h>#include <string.h>
//-----------------------------------------------//将字符串转化为整形数组void str2int(char *a,char *b,int ia[1024],int ib[1024],int ir[1024]){ int i,len; //对数组初始化 for (i=0;i<1024;i++) { ia[i]=0; ib[i]=0; ir[i]=0; } //将a翻转后输入到数组 i=strlen(a); len=strlen(a); while(i) { i--; ia[len-i-1]=*(a+i)-48; } //将b翻转后输入到数组 i=strlen(b); len=strlen(b); while(i) { i--; ib[len-i-1]=*(b+i)-48; }}//-----------------------------------------------//比较大小int cmp(char *a,char *b){ int i,sg; if (strlen(a)>strlen(b)) { sg=0; } else if (strlen(a)<strlen(b)) { sg=1; } else { for (i=0;i<(int)strlen(a);i++) { if (*(a+i)>*(b+i)) { sg=0; break; } else if (*(a+i)<*(b+i)) { sg=1; break; } else sg=0; } } return sg;}//-----------------------------------------------//加法函数char *add(char *a,char *b){ int len,i,c; int ia[1024],ib[1024],ir[1024]; str2int(a,b,ia,ib,ir); if (strlen(a)>strlen(b)) len=strlen(a); else len=strlen(b); c=0; //加法运算 for (i=0;i<len;i++) { ir[i]=(ia[i]+ib[i]+c)%10; c=(ia[i]+ib[i]+c)/10; } if (c==1) { ir[len]=1; len++; } for (i=0;i<len;i++) { *(a+i)=ir[len-i-1]+48;//翻转输出 } *(a+len)='\0'; return a;}//-----------------------------------------------//减法函数char *sub(char *a,char *b){ int len,i,c,sg; int ia[1024],ib[1024],ir[1024]; char str[1024]; char *strrt; str2int(a,b,ia,ib,ir); //符号判断 sg=cmp(a,b); if (sg==0) len=strlen(a); else len=strlen(b); c=0; //减法运算 for (i=0;i<len;i++) { if (sg==0) { if ((ia[i]-ib[i]-c)>=0) { ir[i]=ia[i]-ib[i]-c; c=0; } else { ir[i]=10+ia[i]-ib[i]-c; c=1; } } else { if ((ib[i]-ia[i]-c)>=0) { ir[i]=ib[i]-ia[i]-c; c=0; } else { ir[i]=10+ib[i]-ia[i]-c; c=1; } } } if (sg==1) str[0]='-'; for (i=0;i<len;i++) { str[i+sg]=ir[len-i-1]+48;//翻转输出 } str[len+sg]='\0'; strrt=str; //去零处理 if (sg==0) { while(len>1&&*strrt=='0') { strrt++; len--; } } if (sg==1) { strrt++; while(len>1&&*strrt=='0') { *strrt='-'; strrt++; len--; } strrt--; } strcpy(a,strrt); return a;}
//-----------------------------------------------//乘法函数char *mul(char *a,char *b){ int len,lena,lenb,i,j,c,jin; int ma[1024],mb[1024],mr[1024]; char stra[1024],strb[1024]; char *strrta,*strrtb; stra[0]='0'; stra[1]='\0'; strrta=stra; str2int(a,b,ma,mb,mr); //乘法运算 lena=strlen(a); lenb=strlen(b); for (j=0;j<lena;j++) { c=0; jin=0; for (i=0;i<lenb;i++) { mr[i]=(ma[j]*mb[i]+c)%10; c=(ma[j]*mb[i]+c)/10; } len=lenb; if (c>0) { strb[0]=c+48; jin=1; } for (i=0;i<len;i++) { strb[i+jin]=mr[len-i-1]+48; } for (i=len;i<len+j;i++) strb[i+jin]='0'; strb[len+j+jin]='\0'; strrtb=strb; add(strrta,strrtb); } strcpy(a,strrta); return a;}//--------------------------------------------------//除法函数char *div(char *a,char *b){ int len,lena,i,j; char stra[1024],strb[1024],strc[1024],strd[1024]; char *strbp; strbp=strc; strcpy(stra,a); strcpy(strb,b); strcpy(strd,a); if (cmp(stra,strb)==1) { //被除数小于除数 *a='0'; *(a+1)='\0'; strcpy(b,stra); } else { //被除数大于除数 mul(strb,"10"); len=strlen(a)-strlen(b); if (len==0||(len==1&&cmp(stra,strb)==1)) { strcpy(stra,a); strcpy(strb,b); i=1; strc[0]='1'; strc[1]='\0'; while(cmp(stra,strc)==0) { strc[0]=i+48; strc[1]='\0'; mul(strc,strb); i++; } *a=i+46; *(a+1)='\0'; strcpy(strc,a); mul(strc,strb); sub(stra,strc); strcpy(b,stra); } else { len=strlen(a)-strlen(b); for (j=0;j<=len;j++) { for (i=0;i<=(int)strlen(b);i++) { if ((i+j-1)<0) stra[i]='0'; else stra[i]=*(a+i+j-1); } stra[strlen(b)+1]='\0'; strcpy(strb,b); strbp=stra; lena=strlen(strbp); while(lena>1&&*strbp=='0') { strbp++; lena--; } div(strbp,strb); strc[j]=*strbp; strbp=strb; for (i=0;i<(int)(strlen(b)-strlen(strb));i++) { strbp--; *strbp='0'; } for (i=strlen(b)-1;i>=0;i--) { *(a+i+j)=*(strbp+i); } } strc[len+1]='\0'; strbp=strc; lena=strlen(strbp); while(lena>1&&*strbp=='0') { strbp++; lena--; } strcpy(a,strbp); mul(strbp,b); sub(strd,strbp); strcpy(b,strd); } } return a;}
void main(){ char a[1024],b[1024],c; c='0'; while(c!='q') { printf(">>请输入命令\n>>+ 加\n>>- 减\n>>* 乘\n>>/ 除\n>>q 退出\n>>"); c=getchar(); getchar(); switch(c) { case 'q':break; case '+': printf(">>请输入第一个加数\n>>"); gets(a); printf(">>请输入第二个加数\n>>"); gets(b); printf(">>和为%s",add(a,b)); getchar(); break; case '-': printf(">>请输入被减数\n>>"); gets(a); printf(">>请输入减数\n>>"); gets(b); printf(">>差为%s",sub(a,b)); getchar(); break; case '*': printf(">>请输入第一个乘数\n>>"); gets(a); printf(">>请输入第二个乘数\n>>"); gets(b); printf(">>积为%s",mul(a,b)); getchar(); break; case '/': printf(">>请输入被除数\n>>"); gets(a); printf(">>请输入除数\n>>"); gets(b); div(a,b); printf(">>商为%s余数为%s",a,b); getchar(); break; default:break; } }}