I-type总共有15条指令,这里先介绍前6条指令,包括以下: ADDI、SLTI、SLTIU、ANDI、ORI、XORI 1.1. ADDI :ADDI指令格式为ADDI rd,rs1,immediate。x[rd] = x[rs1] + sext(imm) 1.2. SLT:SLTI指令格式为SLTI rd,rs1,immediate。x[rd] = x[rs1] < sext(immediate) 1.3. SLTIU :SLTIU指令格式为SLTI...
按照上一小结的说明,可以先用LUI指令,再用ADDI指令 LUI x10, 0xDEADB # x10=0xDEADB000 ADDI x10, 0xEEF # x10=0xDEADAEEF 但是结果并不是我们预想的值,而是变成了 0xDEADAEEF,中间的B变成了A 这是因为ADDI指令中的12位立即数是有符号的,ADDI的操作会将12位的立即数符号扩展为32位的数值,再和寄存器中3...
addi_ins2 函数的指令和 addi_ins 函数一样,只不过立即数变成了负数。我们很清楚所谓减法就是加上一个负数,所以通过 addi_ins2 函数就实现了立即数减法指令。 同样地,在 main 函数中调用它,代码如下所示: #include"stdio.h"intaddi_ins(intx);//声明一下汇编语言中的函数:addi_insintaddi_ins2(intx);//...
在 RV32I 中,它等同于执行 lui 和/或 addi;对于 RV64I,会扩展为这种指令序列 lui, addi, slli, addi, slli, addi ,slli, addi。 lui lui rd, immediate x[rd] = sext(immediate[31:12] << 12) 高位立即数加载 (Load Upper Immediate). U-type, RV32I and RV64I. 将符号位扩展的 ...
2. ADDI rd, rs1, imm 这条指令将寄存器rs1的值与一个立即数imm相加,并将结果存储在寄存器rd中。立即数imm可以是一个有符号的二进制数。例如,要将寄存器x5的值与立即数10相加,并将结果存储在寄存器x7中,可以使用以下指令: ADDI x7, x5, 10 3. SUB rd, rs1, rs2 这条指令将寄存器rs1的值减去寄存器...
接上文,观察lui指令、addi指令会得到这个结果:lui指令加载的立即数为无符号,无需注意。addi指令加载的为有符号数,这个需要考虑一下立即数的符号位 假如我们要加载大立即数到指定的寄存器,需要考虑两种情况 1、第11位为0 第11位为0,则指令:li a0, immediate会直接扩展成: ...
主要包括:算术运算、逻辑运算、数据传输、移位操作、条件分支、无条件跳转。 数据存储模式:大端存储,小端存储。 大端:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 小端:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 设计原则:简单源于规整、优秀的设计需要适当的折中、更少则更快...
ADD指令与RISC-V指令集讲解(2)I-Type整数寄存器-立即数指令中提到的ADDI指令的操作原理类似,唯一区别是原本是12位立即数的位置,拆分为了7位的funct7和5位的rs2。 ADD指令格式为ADD rd,rs1,rs2。x[rd] = x[rs1] + x[rs2] 如图2所示,ADD指令的funct7为000_0000,funct3为000。该指令是将rs1 + rs2...
(1)nop 空指令,RISC-V没有提供nop 指令,而是用addi x0,x0,0来实现空指令,这条addi 使用x0作为目标存器,会丢弃结果,所以这条指令不会对程序状态产生任何影响,和空指令是完全等价的,这就不需要单独的空指令了。 (2)neg 取负数指令,RISC-V用 sub rd,x0,rs 来实现,x0-rs 等价于0-rs,等价于-rs,有...
RISC-V指令集包括R型和I型指令。 R型指令(寄存器-寄存器指令)主要进行寄存器之间的算术和逻辑操作,比如: * ADDI:将两个寄存器相加,并将结果存储在目标寄存器中。 * SLTI:当第一个寄存器的值小于第二个寄存器的值时,设置目标寄存器的值为1,否则为0。 * ANDI:对两个寄存器执行按位与操作,并将结果存储在目标...