"not" 在 Assembly-RiscV 中是什么意思?

What does "not" mean in Assembly-RiscV?

not 在 RiscV 中是什么意思?我从 C 中翻译了一些代码后得到了它:

not     a0, t1

not 不是指令集的一部分,但某些汇编器可能将其用作 shorthand。它编译为 xori a0, t1, -1,这意味着它将反转寄存器中的每一位并将结果存储在目标中。

有时您会看到 neg 而不是指令,但您可以使用 sub 和 xor 使用额外的操作数(/寄存器)来实现它们,所以有时您看不到。

not 类似于 xor、and、or 等,都是按位操作数,因此位 0 与另一个操作数的位 0 进行运算,得到结果的位 0。不是一条指令,如果实现的逻辑将用一个操作数完成(对唯一操作数的位 0 进行操作以获得结果的位 0)。

事实table不是只是倒置

a  q
0  1
1  0

neg是否定的,和not不一样。它不是按位运算,因为负数 0 = -(或仅按位 0)0 和负数 1 = -1(或仅按位)如果按位考虑,它对结果没有影响。你也可以看到这个用两个补码来做否定。反转并添加一个。按位负数 0 = 1+1 = 0,按位负数 1 = 0+1 = 1。您可以简单地用结果 = 0 - 操作数进行减法,以执行(非按位)负数。所以你不会总是看到否定指令。

xor 的真值 table 本质上是一个奇偶校验,如果一个而不是两个都为真则为真

a b  q
0 0  0
0 1  1
1 0  1
1 1  0

现在任何与 0 异或的东西都是它自己:

a b  q
0 0  0
1 0  1

任何与 1 异或的东西都会被反转

a b  q
0 1  1
1 1  0

从操作数 a 和结果的角度来看,这与 not 操作相同,因此您经常会看到 xor with all ones 而不是 not 指令。在这种情况下,如果工具支持它(汇编由工具定义(gnu 汇编器,或 jimmy 的汇编器或 sue 的汇编器),而不是目标 (risc-v)),它似乎是一个伪指令。

例如 ARM 有 real neg(取反)和 mvn(不移动)指令。

不是按位取反,每个输出位都从输入取反。

xor 是一种按位运算,如果操作数的两个位中恰好有一个为 1,则匹配的输出位为 1,否则为 0。对于多输入 xor,它相当于将操作数相加并取lsbit,它给你奇偶校验奇数位设置你得到 1 个偶数(零是偶数)然后为零。 (对于两个输入也是如此)