Chapter2: Instructions: Language of the Machine
一些细小知识点
Memory Operands
Memory is byte addressed.
RISC-V is Little Endian.
Sign Extension
符号拓展时需要将符号位复制:
In RISC-V instruction set:
lb: sign-extend loaded byte.
lbu: zero-extend loaded byte.
RISC-V fields (format)
SB、UJ型指令立即数最低为为imm[1],因此使用时需要将得到的数字×2。
Opeartions
Shift
slli by i bits multiplies by
AND
mask bits in a word, ex. and x9, x10, x11.
保护对应rs2中值为1的位。
OR
将某几位全置为1.
XOR
比较不同.
C to Assembly Code
if-else
1 | if(i == j) f = g + h; |
1 | bne x22, x23, Else |
Jump register & jump address table
Jump with register content
1 | jalr x1, 100(x6) |
Jump Address table
x6为地址表的首地址,通过偏移量来取得地址表中的地址。
Caller and Callee
1 | Caller jal x1, ProcedureAddress |
jal指令为jump and link,将返回地址保存到x1后,跳转到立即数表示的地址。
jalr指令为jump and link register,将返回地址保存到rd(一般为x0不可修改),通过寄存器rs1保存的值进行跳转,拥有更大的跳转范围。
堆栈(Stack)
拥有指针Stack pointer(sp),对于push操作则sp=sp-8.
对于pop操作则sp=sp+8. Stack地址从上到下从高到低.
Leaf Procedure
没有进一步的函数调用,需要弹出Stack,栈指针sp自增,归还堆栈。
Recursive Procedure
1 | int fact(int n) |
1 | fact: addi sp, sp, -16 |
32-bit立即数寻址
lui指令
寻址过程
因此如果进行立即数寻址操作,则需要先进行lui加载高20位:
例如需要寻址
1 | lui s3, 976 // s3=0000 0000 0011 1101 0000 (0)_{12} |
由于976在12-bit下最高位恰为1,因此在符号位拓展后高20位全为1,因此计算完成后需要加上
- Title: Chapter2: Instructions: Language of the Machine
- Author: zcyzzz
- Created at : 2024-12-28 19:55:04
- Updated at : 2024-12-29 21:58:29
- Link: https://rockissleeping.github.io/2024/12/28/com_C2/
- License: This work is licensed under CC BY-NC-SA 4.0.