无符号有符号乘法_刘帅嵌入式系统-乘法指令
生活随笔
收集整理的這篇文章主要介紹了
无符号有符号乘法_刘帅嵌入式系统-乘法指令
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ARM有兩類乘法指令:一類為32位的乘法指令,即乘法操作的結果為32位;另一類為64位的乘法指令,即乘法操作的結果為64位。兩類指令共有以下6條。
- MUL:32位乘法指令
- MLA:32位帶加數(shù)的乘法指令
- SMULL:64位有符號數(shù)乘法指令
- SMLAL:64位帶加數(shù)的有符號數(shù)乘法指令
- UMULL:64位無符號數(shù)乘法指令
- UMLAL:64位帶加數(shù)的無符號數(shù)乘法指令
MUL
MUL指令實現(xiàn)兩個32位的數(shù)(可以為無符號,也可以為有符號)的乘積,并將結果存放到一個32位的寄存器中,同時可以根據(jù)運算結果設置CPSR寄存器中相應的條件標志位。考慮指令執(zhí)行的效率,指令中所有操作數(shù)都存放在寄存器中。
指令的編碼格式
指令的語法格式
MUL{< cond >} {S} < Rd >, < Rm >, < Rs >
其中:
- < cond >為指令執(zhí)行的條件碼。當忽略< cond >時,指令為無條件執(zhí)行。
- S決定指令的操作是否影響CPSR中的條件標志位N位和Z位的值。當有S時,指令更新CPSR中的條件標志位的值;當沒有S時,指令不更新CPSR中的條件標志位的值。
- < Rd >寄存器為目標寄存器。
- < Rm >寄存器為第1個乘數(shù)所在的寄存器。
- < Rs >為第2個乘數(shù)所在的寄存器。
指令操作的偽代碼
if ConditionPass(cond) then Rd=(Rm * Rs)[31:0] if S==1 then N Flag=Rd[31] Z Flag=if Rd == 0 then 1 else 0 C Flag=unaffected /*See "C flag" note*/ V Flag=unaffected指令的使用
由于兩個32位的數(shù)相乘的結果位64位,而MUL指令僅僅保存了64位結果的低32位,所以對于帶符號的和無符號的操作數(shù)來說,MUL指令執(zhí)行的結果相同。
對于ARMv5及以上的版本,MULS指令不影響CPSR寄存器中的C條件標志位。對于以前的版本,MULS指令執(zhí)行后,CPSR寄存器中的C條件標志位數(shù)值是不確定的。
寄存器< Rm >、< Rn >及< Rd >為 R15時,指令執(zhí)行的結果不可預期。
示例
MUL R0, R1, R2 ;R0 = R1 * R2MULS R0, R1, R2 ;R0 = R1 * R2 同時設置CPSR中N位和Z位總結
以上是生活随笔為你收集整理的无符号有符号乘法_刘帅嵌入式系统-乘法指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql索引过多为什么会慢_mysql
- 下一篇: 手机 java服务器ip地址_java获