assembly - 如何为 Risc-V(汇编语言)编写 NOT 操作?

标签 assembly bitwise-operators riscv bitwise-not

如何为 Risc-V(汇编语言)编写 NOT 操作?如果没有 NOT 指令,你如何实现同样的事情?

最佳答案

与 MIPS 和其他一些架构一样,RISC V 不为许多事情提供专用指令,包括二元运算,因为这些运算可以使用它们的三运算数格式,通常使用 x0 作为第三个操作数,但有时常量 1-1 作为第三个操作数。

为方便起见,汇编器将接受这些一元运算(及其他)的伪指令。以下是常见 RISC V 伪指令及其替代指令的列表。

要完成更复杂或未列出的事情,请使用数学和逻辑,并根据需要使用尽可能多的指令。

li rd, immediate     | Myriad sequences               | Load immediate
mv rd, rs            | addi rd, rs, 0                 | Copy register
not rd, rs           | xori rd, rs, -1                | One’s complement
neg rd, rs           | sub rd, x0, rs                 | Two’s complement
negw rd, rs          | subw rd, x0, rs                | Two’s complement word
sext.w rd, rs        | addiw rd, rs, 0                | Sign extend word
seqz rd, rs          | sltiu rd, rs, 1                | Set if = zero
snez rd, rs          | sltu rd, x0, rs                | Set if ̸= zero
sltz rd, rs          | slt rd, rs, x0                 | Set if < zero
sgtz rd, rs          | slt rd, x0, rs                 | Set if > zero
beqz rs, offset      | beq rs, x0, offset             | Branch if = zero
bnez rs, offset      | bne rs, x0, offset             | Branch if ̸= zero
blez rs, offset      | bge x0, rs, offset             | Branch if ≤ zero
bgez rs, offset      | bge rs, x0, offset             | Branch if ≥ zero
bltz rs, offset      | blt rs, x0, offset             | Branch if < zero
bgtz rs, offset      | blt x0, rs, offset             | Branch if > zero
bgt rs, rt, offset   | blt rt, rs, offset             | Branch if >
ble rs, rt, offset   | bge rt, rs, offset             | Branch if ≤
bgtu rs, rt, offset  | bltu rt, rs, offset            | Branch if >, unsigned
bleu rs, rt, offset  | bgeu rt, rs, offset            | Branch if ≤, unsigned
j offset             | jal x0, offset                 | Jump
jal offset           | jal x1, offset                 | Jump and link
jr rs                | jalr x0, 0(rs)                 | Jump register
jalr rs              | jalr x1, 0(rs)                 | Jump and link register
ret                  | jalr x0, 0(x1)                 | Return from subroutine
call aa              | auipc x1, aa[31 : 12] + aa[11] | Call far-away subroutine
                     | jalr x1, aa[11:0](x1)          | (two instructions)
tail aa              | auipc x6, aa[31 : 12] + aa[11] | Tail call far-away subroutine
                     | jalr x0, aa[11:0](x6)          | (also two instructions)

顺便说一句,有一款名为 LC-3 的教育处理器。它只有三种算术/逻辑运算:ADDANDNOT。然而,学生应该编写执行乘法、除法、模数、XOROR 等的代码。!乘法和除法/模数是通过循环完成的; XOROR 是使用逻辑序列完成的——我们知道所有的 bool 运算都可以只使用 NAND 门,所以(只有)AND & NOT 很原始但足够了。

我最喜欢的处理器上的 XOR 序列来自这个公式:

(A AND NOT B) + (NOT A AND B)

此处 + 的字面意思是 ADD,它可以替代 OR,因为两个操作数永远不会同时为 1同时,所以不会发生从一位位置到另一位位置的进位,在这种情况下,ADDOR 是等价的。

关于assembly - 如何为 Risc-V(汇编语言)编写 NOT 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65006052/

相关文章:

datetime - 程序集 A86 - 获取并显示时间

c - intel x86汇编到C

c++ - 加载前修改汇编指令

objective-c - 程序集 Objective-C 类分配错误

javascript - 算法题 Decode Hex to set output

c - 通过修改元素的最低有效位来隐藏大指针数组中的数字

performance - 两个 Byte[Array] 的高效按位或

assembly - RISC-V 立即编码符号到底是如何工作的?

c - 在 PetaLinux 上为 Zynq FPGA 上的 Rocket Chip 部署 C 可执行文件

linux - 在 QEMU 中记录动态指令轨迹或直方图?