如何操作汇编语言MIPS32中的位

时间:2017-07-26 00:16:22

标签: assembly bit-manipulation mips32

我在使用" xxxxxxx"来解决前两个部分时遇到了一些麻烦。我有

add $t0, $v0, $0        # $t0 gets copy of input x
sub $t1, $0, $t0        # $t1 gets mask1 that is "-x"

但其余的我很困惑。我不想要一个确切的答案,但解释会有很大的帮助!

更新

我能够让它发挥作用。这是解决方案。谢谢!

**move $t0, $v0**           # $t0 gets copy of input x
**sub $t1, $zero, $t0**     # $t1 gets mask1 that is "-x"

li $v0, 1
move $a0, $t0
syscall

li $v0, 4
la $a0, outLab1        
syscall                # print output label 1
li $v0, 1
**and $a0, $t0, $t1**      # $a0 gets "all bits of x cleared except the 
                         rightmost 1"
syscall

not $t2, $a0           # $t2 gets mask2 that is "$a0 with all its bits 
                         toggled"

li $v0, 4
la $a0, outLab2        
syscall                # print output label 2
li $v0, 1
**and $a0, $t0, $t2**      # $a0 gets "all bits of x with the rightmost 1 
                           cleared"
syscall

li $v0, 10               # exit
syscall

1 个答案:

答案 0 :(得分:0)

    xxxxxxxxxxxxx   #$a0 gets "all bits of x cleared except the rightmost 1"

检查两个补码的工作原理,以及xt0( - x)中值t1的外观(按位)。有一个非常基本的按位操作,当应用于x-x时,将只产生1位设置(特殊情况是0x80000000(-2147483648)输入,否定值超出32位有符号整数范围,+ 2147483648再次为0x80000000(32位无符号整数),即与21b有符号整数的-2147483648表示冲突。这就是32b int的原因只有-2147483648 to +2147483647范围。

    xxxxxxxxxxxxx   # $t2 gets mask2 that is "$a0 with all its bits toggled"

那么,只需切换每一位? (由于我没有进行MIPS编程,我不确定MIPS上可以使用哪条指令,在x86上NOT会这样做。因此,请检查MIPS指令集,可能是按位操作。在没有某种内置NOT的CPU上,您可以使用xor(有时称为eor)和设置了所有位的常量(-1~0来执行此操作C,在汇编程序中通常-1也可以工作)。我认为在某些RISC CPU上,零寄存器可以在单个指令中翻转+使用,也可以作为-1的源。我添加这个sh * t只是为了向您展示,您需要在汇编中有点创意,了解寄存器中的所有指令和值,以获取某些特定算术结果的快捷方式。

    xxxxxxxxxxxx    # $a0 gets "all bits of x with the rightmost 1 cleared"

现在他们要求你清除最右边的1并保持所有其他位完整,原始值x。如果您考虑一下t0t1和{{1}的内容,我不知道如何在不立即透露解决方案的情况下帮助您解决此问题,因为它非常简单。此时包含。

也许你有问题以二进制形式看到这些值,所以它并没有“跳过你”#34;这些东西怎么样?尝试一些计算器,它也可以显示二进制形式,并检查计算/值以查看特定位(在十进制,十六进制和二进制之间来回切换,特别是十六进制< - > bin很好理解,然后你可以& #34;通过读取值的十六进制格式来查看"头部中的特定位),然后重新读取基本按位运算(t2)的描述,并返回此任务。