既然 mips 汇编中没有 NOT 逻辑运算符,怎么能“非”寄存器的内容呢?
最佳答案
您可以使用 nor
和 zero
寄存器将所有内容放入一条指令中。
nor $<dest_reg>, $<in_reg>, $zero
nor $t1, $a0, $zero # for example
等效的逻辑表达式是:
a nor 0 = not (a or 0) = not a
许多汇编器,例如 MARS 和 clang,甚至支持 not $dst, $src
作为 nor
with $zero
的伪指令>.
它也等同于与自身的或而不是零,例如nor $t2, $t1, $t1
另一种较慢的方法是使用 xor
和 -1
,因为它在 2s-component 中被编码为 1111...1111
。但是像 xori
这样的 MIPS 按位 bool 指令零扩展它们的直接操作数,而不是符号扩展,所以你需要一个单独的指令来在另一个中创建一个完整的 32 位 0xffffffff
注册(例如 addi $at, $zero, -1
)。
li $<help_reg>, -1 # load -1 into help-register
xor $<dest_reg>, $<in_reg>, $<help_reg> # actual not-operation
与 0 异或是空操作; XOR 与 1 产生另一个输入位的倒数。等效的逻辑表达式(分别针对每个位)将是:
a xor 1 = not a
如果您想翻转寄存器的低 16 位中的某些位但不修改其他位,xori
可以在一条指令中完成。例如只翻转一个 bool 值 0/1,例如
slt $t0, $t1, $t2 # produce a boolean 0 / 1
xori $t0, $t0, 1 # *logical* NOT the boolean, producing 1 / 0
关于assembly - 如何在 mips 程序集中注册 "NOT",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43990704/