SUB 和 ADD 的编码差异是什么?
二者 opcode=0110011、funct3=000;SUB 的 funct7=0100000,ADD 为 0000000。
SUB 使用 32 位 R-type 编码(opcode=0110011、funct3=000、funct7=0100000),计算 rs1-rs2,将低 XLEN 位写入 rd;算术溢出不触发异常。RV32I 使用 32 位,RV64I 使用 64 位。写入 x0 被丢弃。基础整数 ISA 无 SUBI;要减一个可编码常量,可用 ADDI 加其相反数,但相反数必须落在 -2048 到 2047。
RV32I/RV64I; XLEN-bit subtraction
sub rd, rs1, rs2假设取指成功、无异步中断及额外扩展检查;同名寄存器共用一份初值。
0x40C58533解析当前指令字段并读取写回前源值;还没有提交结果。
这是架构效果的教学步骤,不代表处理器流水线或周期。
从rs1减去rs2,结果写入rd
RV32I/RV64I,x6=20、x7=7:sub x5, x6, x7 得到 x5=13;只保留低 XLEN 位。
RV32I/RV64I,x7=7:sub x5, x0, x7 将 XLEN 位的 -7 写入 x5,等效于 neg x5, x7。
二者 opcode=0110011、funct3=000;SUB 的 funct7=0100000,ADD 为 0000000。
写 addi rd, rs1, -8。ADDI 的有符号 12 位立即数必须为 -2048 到 2047;任意常量不能都用一条 ADDI 表示。