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

How do I manipulate bits in Assembly language MIPS32

我在用 "xxxxxxx" 解决第一两部分时遇到了一些麻烦,我有

add $t0, $v0, [=10=]        # $t0 gets copy of input x
sub $t1, [=10=], $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
    xxxxxxxxxxxxx   #$a0 gets "all bits of x cleared except the rightmost 1"

检查二进制补码的工作原理,以及值 xt0t1 (-x) 中的外观(按位)。有一个非常基本的按位运算,当应用于 x-x 时将只产生 1 位集(特殊情况是 0x80000000 (-2147483648) 输入,其取反值超出 32 位有符号整数范围,+2147483648 再次为 0x80000000(32 位无符号整数),即与 32b 有符号整数的 -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。如果你想一想 t0t1t2 此时包含的内容,我不知道如何在不立即揭示解决方案的情况下帮助你解决这个问题,因为这绝对是微不足道的.

也许您无法以二进制形式查看这些值,所以 "jump at you" 这些东西是如何工作的?试试计算器,它也可以显示二进制形式,并检查 calculations/values 以查看特定位(在十进制、十六进制和二进制之间来回切换,尤其是 hex<->bin 很好理解,然后你可以"see" head 中的特定位只是通过读取 value 的十六进制格式),然后重新阅读基本位操作的描述(and, or, xor),然后回到这个任务。