位移指令實現乘法 除法計算

2021-10-02 02:54:16 字數 2586 閱讀 5306

大家都知道51微控制器是有乘法、除法指令的,不管是用c語言還是組合語言,都是可以直接計算乘法、除法的,我以為+,-,*,/ 這些算術運算是微控制器的標配,而我公司使用的應廣微控制器居然沒有乘法、除法指令,應廣微控制器使用的是mini-c語言,和c語言有點像,可以在c**中穿插彙編指令。但mini-c不支援for迴圈,也不支援函式傳參,所以一下**都沒有傳參,也沒有for迴圈。

思路0我們都知道左移1位(<<1)相當於乘2,左移2位(<<2)相當於乘4,但想乘3、乘5、乘6、乘7怎麼辦?

在已知要乘多少時,我們可以考慮這種方法

int a=13;

b=a<<1;

//b=a*2

b=(a<<1)

+a;//b=a*3

b=a<<2;

//b=a*4

b=(a<<2)

+a;//b=a*5

b=(a<<2)

+a+a;

//b=a*6

b=(a<<3)

-a;//b=a*7

b=a<<3;

//b=a*8

//.....

思路1

前面的方法顯然不是我想找的,也不是你想找的,我需要乙個實現乘法的功能:a×b,a是變數,b也是變數。

再想想,例如做9×4時,我們是如何計算除法的?相信大家首先想到的是乘法口訣「四九三十六」 那是中國人太聰明了有乘法口訣,若是老外計算,可能就是「nine plus nine equals eighteen, eighteen plus nine equals twenty seven …」,乘法的本質就是把n個數相加,所以寫程式的時候做迴圈相加即可以實現乘法計算。

byte ma;

//第乙個因式,這裡byte等價於unsigned char

byte mb;

//第二個因式

word mc;

//計算結果,這裡word等價於unsigned int

void

mult

(void

)}

很好理解,mb是幾,mc就迴圈加幾次ma,但這個方法在比較耗時,例如2×100時,2+2+2+2+…+2,這裡有100次加法運算。

思路2小學乘法的豎式計算也同樣適用於二進位制

因為二進位制只有0或1,ma×1=ma,ma×0=0;程式中只需要:

①判斷被乘數mb的最低位,若為1則mc累加ma,為0則不累加(或累加0)

②讓ma左移1位,mb右移1位

③再次回到①,直到mb變為0,運算結束

word ma;

//第乙個因式,計算結果也存放在ma

byte mb;

//第二個因式

void

mult

(void

) ma<<=1;

mb>>=1;

} ma=t;

}

對於上面是程式,大大減少了計算時間,最壞情況ma*11111111b需要迴圈8次,一共8次累加、8次左移、8次右移。

這個程式也可以做一點優化,先比較ma、mb的大小,用大的數乘以小的數。

這樣可以讓0000 0001b×1111 1111b這樣的乘法更快計算完成。

if

(mb>ma)t=0

;

思路0

通過右移指令實現÷2、÷4、÷8等,但對於除以其他數卻不行了。

思路1和乘法一樣,除法也可以理解為減法。

例如:16個蘋果分給5個孩子

每個孩子拿1個,還剩16-5=11個

每個孩子再拿1個,還剩11-5=6個

每個孩子再拿1個,還剩6-5=1個

這時不夠每個孩子拿1個了,所以餘數是1,每個人都有3個,所以商是3。

byte ma;

//被除數、商

byte mb;

//除數、餘數

void

div(

void

) mb=ma;

ma=n;

}

這個方法對於被除數大、除數小的情況會耗時比較久。

大家可以考慮一下除數為0會發生什麼,該怎麼解決。

思路2同樣使用除法豎式來幫助理解

被除數高位需要對齊除數低位,再比較被除數與除數的大小決定要不要商1,但程式似乎不好寫。再來看另一張

先將除數左移字長-1bit,就可以低位對齊並且可以相減了。

對照中的思路應該很好理解下面的程式。

byte ma;

//被除數、商

word mb;

//除數、餘數

void

div(

void

) mb>>=1;

} mb=ma;

//餘數

ma=t;

//商}

乘法 除法彙編指令總結

乘法指令的反彙編 a 5 imul eax,dword ptr a 5 當變數與不是 2的冪的數相乘時,三變數 a b mov eax,dword ptr a imul eax,dword ptr b 當兩個都是變數相乘時,兩變數 a 8 mov eax,dword ptr a 當變數與 2的冪相乘...

組合語言乘法和除法指令

乘法和除法指令 ia 32 處理器的乘法和除法指令需要區別無符號數和有符號數,並隱含便用丁 eax 和edx 暫存器。基本的乘法指令指出源運算元 reg mem 暫存器或儲存單元 隱含使用目的運算元,表3。若源運算元是8位數8 m8,al與其相乘得到16位積,存入ax中,若源運算元是 16 位數 r...

只使用 實現減法 乘法 除法操作

a 乘法 int multi int op1,int op2 b 減法 int sub int op1,int op2 c 除法 int div int op1,int op2 分析 乘法 a b就等於b個a相加。題目也說了不考慮效能。減法 a b就等於a 1 b 就等於a加上b的相反數,得到b的相...