我在使用" 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
答案 0 :(得分:0)
xxxxxxxxxxxxx #$a0 gets "all bits of x cleared except the rightmost 1"
检查两个补码的工作原理,以及x
和t0
( - 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
。如果您考虑一下t0
,t1
和{{1}的内容,我不知道如何在不立即透露解决方案的情况下帮助您解决此问题,因为它非常简单。此时包含。
也许你有问题以二进制形式看到这些值,所以它并没有“跳过你”#34;这些东西怎么样?尝试一些计算器,它也可以显示二进制形式,并检查计算/值以查看特定位(在十进制,十六进制和二进制之间来回切换,特别是十六进制< - > bin很好理解,然后你可以& #34;通过读取值的十六进制格式来查看"头部中的特定位),然后重新读取基本按位运算(t2
)的描述,并返回此任务。