你有什麼簡單的方法在MIPS寄存器中的值作爲絕對值?絕對值在MIPS
絕對值在MIPS
回答
這是一個非常簡單的方法來做到這一點。
#assume you want the absolute value of r1
ori $2, $zero, $1 #copy r1 into r2
slt $3, $1, $zero #is value < 0 ?
beq $3, $zero, foobar #if r1 is positive, skip next inst
sub $2, $zero, $1 #r2 = 0 - r1
foobar:
#r2 now contains the absolute value of r1
最簡單的方法只是對這些值做一些二進制數學運算。
http://en.wikipedia.org/wiki/Signed_number_representations描述了各種系統如何存儲其負數。我相信MIPS使用二進制補碼方案來存儲有符號數字。這使得它比標誌位更難一點,它可以通過將數字與0b01111111進行與運算來關閉,但它仍然可行。
這裏有一個分支少的變體:
# input and output in $t0
sra $t1,$t0,31
xor $t0,$t0,$t1
sub $t0,$t0,$t1
這是如何工作的?
首先,$t1
填寫的符號位$t0
。所以如果$t0
是正數$t1
將被設置爲0,並且如果$t0
是負數$t1
將被設置爲0xFFFFFFFF。
接下來,$t0
每一位被反轉,如果$t1
是爲0xFFFFFFFF,或保持不變,如果$t1
爲0。碰巧的是,反轉數的所有位是一樣的,因爲它設置爲(-number)-1
(以二進制補碼)。
最後,從中間結果中減去0xFFFFFFFF(其等於-1)或0。
所以,如果$t0
原本是陰性,你會得到:
$t0 = ($t0^0xFFFFFFFF) - 0xFFFFFFFF
== == (-$t0 - 1) - -1
== (-$t0 - 1) + 1
-$t0
。
如果它最初是正面的,你會得到:
$t0 = ($t0^0) - 0
== $t0
。
警告:該方法由美國專利#6073150涵蓋。雖然可能無效,但因爲它的知名度超過了1997年。 – Myria 2015-08-08 00:47:51
最簡單的方法。 有一個僞指令,可以做這個:
abs $t1, $t1
將採取值的絕對值在寄存器$ T1,並將其放置在$ T1
這個僞指令是另一個答案中顯示的sra/xor/sub序列。 – Myria 2015-08-08 00:52:23
下面是它的尺寸優化版本。它比SRA/XOR /蘇布答案較慢,由於分支預測的問題,但它是一個指令較小:
bgtz $t0, label
label:
subu $t0, $zero, $t0
這工作,因爲MIPS延遲槽的:如果$t0
是正的,subu
指令否定$t0
執行兩次。您可能需要在彙編器中啓用.set noreorder
。
- 1. 絕對值
- 2. 絕對差值EmguCv
- 3. NSInteger的絕對值
- 4. 絕對值計算
- 5. double的絕對值
- 6. Google Trends:獲取絕對值
- 7. GORM標準由絕對值
- 8. Matlab - 按絕對值排序
- 9. MATLAB:絕對值的倒數
- 10. 二進制絕對值
- 11. 計算絕對值組合
- 12. 絕對值不工作
- 13. 絕對值限制R中
- 14. 在MVC中設置絕對值Uri 3
- 15. 避免在序言絕對值謂詞
- 16. 如何在Mozart中使用絕對值?
- 17. 在MIPS
- 18. 在MIPS
- 19. 絕對位置在絕對位置
- 20. 絕對在Java
- 21. groupby object pandas的絕對值的均值
- 22. 在MIPS中聲明整數值
- 23. 位置絕對內絕對
- 24. 在絕對和相對URL上下文中使所有URL絕對絕對
- 25. 在REST API中返回絕對值和相對URI
- 26. 如何使用內在函數對double執行絕對值?
- 27. 如何在絕對div中將絕對div放置在底部
- 28. 拒絕用戶對reg值的權限?
- 29. C#絕對值爲動態類型
- 30. Python中絕對差異的均值
整數或浮點數? – Gabe 2010-02-22 17:14:17