Mic*_*ael 18
这是一个无分支变体:
# input and output in $t0
sra $t1,$t0,31
xor $t0,$t0,$t1
sub $t0,$t0,$t1
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?
首先,$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.
swa*_*son 13
这是一个非常简单的方法.
#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
Run Code Online (Sandbox Code Playgroud)
小智 9
最简单的方法.有一个伪指令执行此操作:
abs $t1, $t1
Run Code Online (Sandbox Code Playgroud)
将获取寄存器$ t1中值的绝对值并将其放在$ t1中
| 归档时间: |
|
| 查看次数: |
32145 次 |
| 最近记录: |