Chapter2: Instructions: Language of the Machine

zcyzzz cy

一些细小知识点

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
2
if(i == j) f = g + h;
else f = g - h;
1
2
3
4
5
        bne x22, x23, Else
add x19, x20, x21
beq x0, x0, EXIT //记得需要退出
Else: sub x19, x20, x21
Exit:

Jump register & jump address table

Jump with register content
1
jalr x1, 100(x6)
Jump Address table

x6为地址表的首地址,通过偏移量来取得地址表中的地址。

Caller and Callee

1
2
Caller jal x1, ProcedureAddress
Callee jalr x0, 0(x1)

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
2
3
4
5
int fact(int n)
{
if(n < 1) return 1;
else return (n * fact(n-1));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fact: addi sp, sp, -16
sd ra, 8(sp)
sd a0, 0(sp)
// addi t0, a0, -1
bge a0, x0, L1 // bge t0, x0, L1
addi a0, x0, 1
addi sp, sp, -16
ld ra, 8(sp)
jalr x0, 0(ra)
L1: addi a0, a0, -1
jal ra, fact
add t1, a0, x0
ld a0, 8(sp)
ld ra, 0(sp)
addi sp, sp, -16
mul a0, a0, t1
jalr x0, 0(ra)

32-bit立即数寻址

lui指令

lui x19, 976
将立即数放置在x19的高20位

寻址过程

因此如果进行立即数寻址操作,则需要先进行lui加载高20位:
例如需要寻址

1
2
3
lui s3, 976 // s3=0000 0000 0011 1101 0000 (0)_{12}
addi s3, s3, 2304 // sign extended
addi s3, s3, 4096 // 修正

由于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.