指令系统

1 操作数

指令操作数Operand):与高级语言不同,算术指令操作数会受到限制————必须取自寄存器(Register),寄存器数量有限并内建于硬件。

双字Double Word):一般为 64 位,对应于 RISC-V 中寄存器大小,8个字节。

Word):一般为 32 位,4个字节。

寄存器Register):限制32个。

设计原则2:更少则更快

数量过多的寄存器可能会增加时钟周期,电信号传输的距离越远,所花费的时间越长。

2 数据传输指令

数据传输指令:在内存和寄存器之间传送数据的命令。

地址Address):用于描述内存数组中特定数据元素位置的值。

image-20231107160709554

载入指令Load):将数据从内存复制到寄存器。

g = h + A[8];
// x20 <- g
// x21 <- h
// x22 <- address of A[]

编译后:

ld  x9, 8(x22)		// 临时寄存器 x9 得到 A[8]
add x20, x21, x9	// g = h + A[8]

大小端:

一种使用最左边的“大端”字节作为双字地址,另一种使用最右端或“小端”。RISC-V属于小端编址。

存储指令Store):将数据从寄存器复制到内存。

A[12] = h + A[8];
// x21 <- h
// x22 <- address of A[]

编译后:

ld  x9, 64(x22)		// 临时寄存器 x9 得到 A[8]: 64 = 8 * 8bit
add x9, x21, x9		// 临时寄存器 x9 得到 h + A[8]
sd  x9, 96(x22)		// 存储 h + A[8] 到 A[12]: 96 = 12 * 8bit

3 常数与立即数

通过把常数作为算数指令操作数,操作更快,能耗更低。

常数0有另一个作用:通过有效使用它可以简化指令系统体系结构。例如,你可以使用0寄存器求原数的相反数。因此,RISC-V专用寄存器x0硬连线到常数0。根据使用频率来确定要定义的常数。

求相反数:按位取反加一

4 指令表示

对于 RISC-V 加法指令:x9 = x20 + x21

add  x9, x20, x21

指令格式:二进制数字字段组成的指令表示形式。(机器语言)

十进制:    |    0    |  21   |  20   |  0  |   9   |   51    |
二进制:    | 0000000 | 10101 | 10100 | 000 | 01001 | 0110011 |
位数:           7    +   5   +   5   +  3  +   5   +    7     =  32 bit
段数:          [1]      [2]     [3]    [4]    [5]      [6]

字段:一条指令每一段成为字段,第[1][4][6]字段组合告诉指令执行加法操作,即操作码Opcode);第[2]告诉加法运算第二个源操作数寄存器编号21;第[3]个字段给出了加法运算的另一个源操作数寄存器编号20;第[5]个字段存放要接收和的寄存器编号9