Menu Close

RISC-V指令集讲解(2)I-Type整数寄存器-立即数指令

1. I-type整数寄存器-立即数指令

 

相关参考文章:

RISC-V教学教案

 

上文RISC-V指令集讲解 (1) 通用寄存器和汇编指令分类介绍了通用寄存器,程序计数器和6种汇编指令,本文将先从I-type的整数寄存器指令开始,详细介绍每一种汇编指令包括的具体指令。

RISC-V指令类型机器码格式

图1 6种基本指令的机器码格式 [1]

除了CSR指令之外,所有出现的立即数都是有符号位扩展的,并且通常是在指令中最左边的可用位上 [1]。如图1所示,

所有出现立即数的指令种类(I-type,S-type,B-type,U-type和J-type),立即数的符号扩展都取决于指令的bit 31(也是立即数的最高位,比如J-type的imm[20])。

所以I-type中提到的立即数都是有符号位扩展的。

这里举例解释一下带符号位扩展,比如有一个12位立即数,

如果最高位是0,则表示立即数是正数,

如果最高位为1,表示立即数是负数。正数带符号扩展时高20位全部填充上0,负数带符号扩展时高20位全部填充上1,之后再进行相加或比较。而无符号扩展时,高20位都是填充0。

 

绝大多数整数计算指令对保存在整数寄存器中的XLEN位进行操作(RV32I里对应的整数寄存器为32位)。整数计算指令要么使用I-type指令为寄存器-立即数操作,要么使用R-type指令为寄存器-寄存器操作。

I-type对应的opcode被命名为OP-IMM,

I-type对应的immediate,固定为12位,被命名为I-immediate,如图2所示。

 

RISC-V I-immediate

图2 整数寄存器-立即数指令机器码格式  [2]

I-type总共有15条指令,这里先介绍前6条指令,包括以下:

  1. ADDI
  2. SLTI
  3. SLTIU
  4. ANDI
  5. ORI
  6. XORI

1.1. ADDI

ADDI指令格式为ADDI rd,rs1,immediate。x[rd] = x[rs1] + sext(imm)

举例说明:

ADDI x13,x12,5

将x12寄存器里的值加上有符号扩展的立即数5,并将结果放置进x13寄存器里。

可以看到,其机器码如图3所示,ADDI的

OP-IMM为001_0011

funct3为000

immediate为12’b0000_0000_0101

rs1为 5’b0_1100

rd为 5’b0_1101

所以ADDI x13,x12,5对应的机器码为0000_0000_0101_01100_000_01101_0010011,对应的16进制为32’h0056_0693

RISC-V addi机器码

图3 ADDI机器编码格式 [2]

addi

 

经过译码后,只要机器码opcode和funct3对应的位置为001_0011和000,那么这条指令一定为addi。ADDI中“ADD”表示加法,“I”表示立即数,“ADDI”全称意为立即数加法。该指令是把rs1寄存器中的值和有符号位扩展的立即数相加,之后把相加得到的结果存到rd里去(溢出的部分忽略。溢出处理可以由软件实现,这里介绍如何处理)。

这里要引入一个概念,“伪指令(pseudo-instruction)”,伪指令是指在汇编指令集里不存在的指令。这些指令对于汇编用户来说表达方便,而且经常使用。

  • 例如汇编程序中经常会出现寄存器之间的搬移,就有了伪指令MV(move),

指令书写格式:MV  rd,rs1

这个指令是把rs1里的值搬移到rd中去(x86中就有move指令,mcs-51里也有这条指令)。

其实际代表的含义是ADDI rd,rs1,0   也就是说把rs1寄存器中的值,跟后面的立即数值0加起来,最后存到rd寄存器中。因为rs1加零后rs1的值不变,所以MV指令实际上就是把rs1的值移动到rd里。用户在写汇编程序的时候可以写这样一条伪指令MV,在程序编译时编译软件会把这条指令翻译成ADDI rd,rs1,0,随后把ADDI这条指令送到CPU运行。

  • 还有一条使用频率高的伪指令,NOP(no operation,无操作),

指令书写格式:NOP

其实际代表的含义是 ADDI x0,x0,0   之前有提到过,x0的值无法改写,只能读取,且永远为0,那么 ADDI x0,x0,0做了一次无结果的加法,将x0 + 0的结果放入x0,其唯一作用是将PC值推进。

 

1.2. SLTI

SLTI指令格式为SLTI rd,rs1,immediate。x[rd] = x[rs1] <𝑠 sext(immediate)

其机器码如图4所示,SLTI的OP-IMM为001_0011,funct3为010。SLTI中S代表set置位,作用是有符号比较rs1和经过符号扩展的立即数后置位rd。把rd寄存器中的值,置成0或1。这里需要注意的是指令中判断条件成立则置位为1,条件不成立置位为0。这条指令的置位条件是LT:less than,小于。I代表立即数。所以判断条件是rs1的值是是否小于立即数。SLTI全称为set if less than immediate。

指令示例:

SLTI x13,x12,5

比较x12寄存器和立即数5(有符号扩展后为5),如果x12寄存器里的数小于5(有符号数比较),将x13置成1。

RISC-V slti机器码

图4 SLTI机器编码格式 [2]

1.3. SLTIU

SLTIU指令格式为SLTIU rd,rs1,immediate。x[rd]= x[rs1] <𝑢 sext(immediate)

其机器码如图5所示,SLTIU的OP-IMM为001_0011,funct3为011。SLTIU与SLTI的唯一区别是“U”代表unsigned number(无符号数),不同之处在于将立即数有符号扩展,当作无符号数比较后置位。如果对8位二进制数进行比较。-1:8’b1111_1111 , -2:8’b1111_1110。当作为有符号数比较时-2 < -1,如果作为无符号数比较依然成立,但是如果用-2和+1:8’b0000_0001进行无符号数比较。此时1111_1110 > 0000_0001。(254 > 1)。

指令示例:

SLTIU x13,x12,-1

比较x12寄存器和立即数-1(有符号扩展后0xffffffff),如果x12寄存器里的数小于0xffffffff(无符号数比较),将x13置成1。

RISC-V sltiu机器码

图5 SLTIU机器编码格式 [2]

伪指令SEQZ(set if equal to zero,如果等于0,就进行置位):SEQZ rd,rs1  (等价于SLTIU rd,rs1,1),该伪指令是SLTIU中的一个特殊情况,会被经常使用。因为无符号数中rs1比“1”小的情况只有一种,那就是rs1 = 0, 所以如果SLTIU rd,rs1,1成立,也可以看作是SEQZ rd,rs1 中 rs1 = 0成立。

1.4. ANDI

ANDI指令格式为ANDI rd,rs1,immediate。x[rd] = x[rs1] & sext(immediate)

其机器码如图6所示,ANDI的OP-IMM为001_0011,funct3为111。用法是将立即数进行符号位扩展成32位跟rs1进行按位相与(&),结果写到rd中。

指令示例:

ANDI x13,x12,5

将x12寄存器中的数与有符号位扩展后的立即数5按位与,并将结果写入x13寄存器。

RISC-V ANDI机器码

图 6 ANDI机器编码格式 [2]

1.5. ORI

ORI指令格式为ORI rd,rs1,immediate。x[rd] = x[rs1] | sext(immediate)

其机器码如图7所示,ORI的OP-IMM为001_0011,funct3为110。用法是将立即数按有符号数扩展成32位跟rs1进行按位或(or),结果写到rd中。

指令示例:

ORI x13,x12,5

将x12寄存器中的数与有符号位扩展后的立即数5按位或,并将结果写入x13寄存器。

 

%title插图%num

图7 ORI机器编码格式 [2]

1.6. XORI

XORI指令格式为XORI rd,rs1,immediate。x[rd] = x[rs1] ^ sext(immediate)

其机器码如图8所示,XORI的OP-IMM为001_0011,funct3为100。用法是将立即数按有符号数扩展成32位跟rs1进行按位异或(xor),结果写到rd中。

伪指令NOT:NOT rd,rs1  (等同于XORI rd,rs1,12’hfff)。NOT是取反指令,作用是把rs1中的值取反放到rd中去。因为1和任何数异或都是取反,比如 1 xor 0 = 1, 1 xor 1 = 0,所以12‘hfff符号扩展之后与rs1异或的值就是相当于取反。

指令示例:

XORI x13,x12,5

将x12寄存器中的数与有符号位扩展后的立即数5按位异或,并将结果写入x13寄存器。

RISC-V XORI机器码

图8 XORI机器编码格式 [2]

注意:

RISC-V指令具有灵活性。以上指令中机器码格式都没有强制规定rs1,rd是某一固定的寄存器,用户在写汇编程序时可以根据需要,在32个通用寄存器中挑选相应的寄存器来作为rs1和rd,rs1和rd甚至可以为同一寄存器。

 

2.文章参考

[1] Riscv.org, 2021. [Online]. Available: https://riscv.org/wp-content/uploads/2019/12/riscv-spec-20191213.pdf. [Accessed: 22- Feb- 2021].

[2] D. Patterson and A. Waterman, The RISC-V reader. Berkeley: Strawberry Canyon LLC, 2018.

Posted in RISC-V, RISC-V 教案, 指令集, 教材与教案, 文章
0 0 投票数
Article Rating
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论

相关链接