2011-09-26 82 views
1

是否有任何方法可以在MIPS中找到32位整数的MSB,然后将其替换为另一个整数的LSB?在MIPS中获取32位整数的MSB

为了阐述,假设A = 1000,B = 1001

我需要得到乙即1的MSB和LSB的A的交换这个现在应该成为1001

+0

1001的最高有效位是1?!你对“MSB”的定义是什么?这些数字是二元的吗?即便如此,1001的MSB仅在4位架构上为1。 –

+0

您应该在MIPS教科书中查找“条件分支”,并使用一个或多个条件分支来选择要执行的代码。 – markgz

回答

2
# Integer 1 -> $a0 
# Integer 2 -> $a1 
# Result -> $a3 
# Setting up retreiving mask 
xor  $t0, $t0, $t0 
lui  $t0, 0x8000 

# Extracting MSB 
and  $t1, $a0, $t0 

# Moving MSB to LSB 
srl  $t1, $t1, 31 

# Setting up setting mask 
xor  $t0, $t0, $t0 
li  $t0, 0x0001 

# Applying r = a^((a^b) & mask) 
# a = $a1 
# b = $t1 
# mask = $t0 
xor  $t2, $a1, $t1 
and  $t2, $t2, $t0 
xor  $a3, $a1, $t2 

大会很有趣!

+1

一个很好的无分支解决方案。 (您不需要在LI之前执行异或操作,LI是一个合成指令,可以使汇编器根据需要发出清除目标寄存器的代码,并且不需要SRL之前的代码 - 无需清零位那将会被移开。) – markgz

+0

根据我的经验,你确实需要XOR。 AFAIK LI没有清除寄存器。例如,如果我做LUI然后LI,寄存器不会被清除,并且上半字保持该值(谢谢MIPS God ...)。是的,你是对的,AND掩码没有用,我没有注意到,但无论如何,它显示了如何设置和使用AND掩码。此外,编程组装相当多,我宁愿确保注册表被清除,因为追逐这样的错误是一个该死的头痛;) – m0skit0

+0

你是正确的关于LI指令 – m0skit0