[英]How do I manipulate bits in Assembly language 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
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位无符号整数),即与-32147带符号的32b有符号整数表示冲突。这就是为什么32b int
范围为-2147483648 to +2147483647
。
xxxxxxxxxxxxx # $t2 gets mask2 that is "$a0 with all its bits toggled"
好吧,只是切换每一位? (由于我不进行MIPS编程,所以我不确定可以在MIPS上使用哪条指令,在x86上, NOT
)。 因此,检查一下MIPS指令集,可能是按位运算。 在没有某种内置不是你可以用做CPU的xor
(有时被称为eor
),并与所有位恒置( -1
或~0
通常是C,在装配-1工作太)。 我认为在某些RISC CPU上,零寄存器可以被翻转+用于单个指令中,也可以作为-1
源。 我添加此代码只是为了向您展示,您需要在汇编方面有点创新,知道寄存器中的所有指令和值,以便为某些特定的算术结果提供一些捷径。
xxxxxxxxxxxx # $a0 gets "all bits of x with the rightmost 1 cleared"
现在他们要求您清除最右边的1并保持其他所有原始值x
不变。 如果您考虑一下此时的t0
, t1
和t2
包含的内容,那是非常琐碎的,我看不到如何在不立即揭示解决方案的情况下为您提供帮助。
也许您很难以二进制形式查看这些值,所以它不会“跳到您身上”这些东西是如何工作的? 尝试一些也可以显示二进制形式的计算器,并检查计算/值以查看特定的位(在十进制,十六进制和二进制之间来回切换,特别是hex <-> bin很容易理解,那么您可以“查看只需先读取值的十六进制格式即可,然后重新读取基本按位运算的描述( and, or, xor
),然后返回此任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.