assembly - 如何在 mips 程序集中注册 "NOT"

标签 assembly bit-manipulation mips bitwise-operators boolean-logic

既然 mips 汇编中没有 NOT 逻辑运算符,怎么能“非”寄存器的内容呢?

最佳答案

您可以使用 norzero 寄存器将所有内容放入一条指令中。

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/

相关文章:

linux - 显示寄存器内容

python - 如果通过 strcpy() 获取用户输入,用户输入是否会被复制到超出空格或空字符的堆栈上

assembly - REX.B 覆盖是否与 MOVSS 指令一起使用?

java - 如何确定 64 位值中第 n 个最高有效位组的位置?

c - 为什么 ~b=-6 如果 b=5?

memory - GCC 中的后链接器汇编代码

assembly - MIPS跳转指令编码: why left shifted,为什么保留PC的高4位?

c++ - 如何汇编、链接和编译 C++、NASM 文件和 .o 驱动程序的组合

python - 理解Python中的按位NOT

arrays - 使用 MIPS 查找数组中的最小值