MIPS中的绝对值

ahe*_*ang 9 assembly mips

您是否有任何简单的方法可以将MIPS中的寄存器中的值作为绝对值?

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.

  • 警告:此方法受美国专利#6073150的保护.然而,可能因地狱而无效,因为它的知名时间超过了1997年. (3认同)

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中

  • 此伪指令是另一个答案中显示的“sra/xor/sub”序列。 (2认同)