導航:首頁 > 操作系統 > 單片機多位乘法

單片機多位乘法

發布時間:2022-06-20 20:21:27

單片機(多位元組數乘法和除法)

有現成的例成啊

② 51單片機非壓縮BCD碼多位數乘法的匯編程序求助

對於多位元組乘除法用匯編語言計算是很不方便的,特別是還要用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; } }}

閱讀全文

與單片機多位乘法相關的資料

熱點內容
蘋果藍牙怎麼發應用給安卓 瀏覽:453
江蘇網路雲伺服器虛擬主機 瀏覽:168
wps幻燈片圖片壓縮 瀏覽:730
保證數據不被編譯器優化 瀏覽:293
net轉pdf 瀏覽:416
畢業當程序員大學學什麼專業 瀏覽:710
農業銀行app怎麼買保險 瀏覽:291
錦州一塊錢麻將演算法 瀏覽:800
ecg單片機 瀏覽:424
榮耀手機怎麼把app不見了 瀏覽:769
安卓車載模式如何關閉 瀏覽:656
路由器怎麼才能橋接列印伺服器 瀏覽:704
phpexcel中文亂碼 瀏覽:835
bat批處理命令大全 瀏覽:601
php隨機數組值 瀏覽:904
雲伺服器如何查看文件 瀏覽:532
伺服器都可以干什麼 瀏覽:793
計算字元串長度php 瀏覽:82
天府電腦編程培訓 瀏覽:38
android游戲程序員 瀏覽:992