指令系统
1 操作数
指令操作数(Operand):与高级语言不同,算术指令操作数会受到限制————必须取自寄存器(Register),寄存器数量有限并内建于硬件。
双字(Double Word):一般为 64 位,对应于 RISC-V 中寄存器大小,8个字节。
字(Word):一般为 32 位,4个字节。
寄存器(Register):限制32个。
设计原则2:更少则更快
数量过多的寄存器可能会增加时钟周期,电信号传输的距离越远,所花费的时间越长。
2 数据传输指令
数据传输指令:在内存和寄存器之间传送数据的命令。
地址(Address):用于描述内存数组中特定数据元素位置的值。
载入指令(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
。