如何在汇编语言 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"
检查二进制补码的工作原理,以及值 x
在 t0
和 t1
(-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
。如果你想一想 t0
、t1
和 t2
此时包含的内容,我不知道如何在不立即揭示解决方案的情况下帮助你解决这个问题,因为这绝对是微不足道的.
也许您无法以二进制形式查看这些值,所以 "jump at you" 这些东西是如何工作的?试试计算器,它也可以显示二进制形式,并检查 calculations/values 以查看特定位(在十进制、十六进制和二进制之间来回切换,尤其是 hex<->bin 很好理解,然后你可以"see" head 中的特定位只是通过读取 value 的十六进制格式),然后重新阅读基本位操作的描述(and, or, xor
),然后回到这个任务。
我在用 "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"
检查二进制补码的工作原理,以及值 x
在 t0
和 t1
(-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
。如果你想一想 t0
、t1
和 t2
此时包含的内容,我不知道如何在不立即揭示解决方案的情况下帮助你解决这个问题,因为这绝对是微不足道的.
也许您无法以二进制形式查看这些值,所以 "jump at you" 这些东西是如何工作的?试试计算器,它也可以显示二进制形式,并检查 calculations/values 以查看特定位(在十进制、十六进制和二进制之间来回切换,尤其是 hex<->bin 很好理解,然后你可以"see" head 中的特定位只是通过读取 value 的十六进制格式),然后重新阅读基本位操作的描述(and, or, xor
),然后回到这个任务。