废话:
大三老菜狗来更新啦,哎,感叹一下生活不易,天天犯困。记得去看书哦。
注释:
RISC-V汇编学习笔记系列是RISC-V学习笔记系列下的一个分支,在这里着重讲解的是RISC-V的汇编指令是如何实现的。对读懂RISC-V有一定的帮助,但因为不是主线剧情所以会更加随意一点。
条件判断分支转移指令 :
1.在RISC-V指令系统中,有用于条件判断分支转移的指令能实现与高级语言中if(其实我感觉更像switch语句一些)语句类似的效果。
in C in RISC-V
if (reg1 == reg2) L1 <——> beq reg1, reg2, L1 # 如果相等则跳转到L1
注释:beq:判断是否相等;bne:判断是否不相等
2.条件判断分支转移指令 :条件分支转移;无条件分支转移
1)条件分支转移指令:通过比较判断操作数值,决定是否改变程序流向。如:beq指令,bne指令,blt指令,bge指令等。
2) 无条件分支转移指令:可以直接跳转不需要附加条件判断。如:j(jump)指令可以直接跳转到label标识的指令目标地址。
1.if语句对应的RISC-V的汇编指令
in C in RISC-V
if (i == j) <——> bne x13, x14, Exit
f = g + h; add x10, x11, x12
Exit:
f <=> x10 g <=> x11 h <=> x12 i <=> x13 j <=> x14
2.if-else语句对应的RISC-V汇编指令
in C in RISC-V
if (i == j) bne x13, x14, Else
f = g + h; add x10, x11, x12
else j Exit
f = g - h; Else: sub x10, x11, x12
Exit:
3.在RISC-V指令系统中 "<" 和 ">" 的比较判断使用blt指令
in C in RISC-V
if (reg1 < reg2) goto label blt reg1, reg2, label
注释:bltu指令会将两个操作数当作无符号数进行比较,相邻的两字节(Byte)组成一个字(Word),来表示一个无符号数,因此,字为16位。
3.RISC-V中for循环案例
in C in RISC-V
int A[20]; add x9, x8, x0 # x9 = &A[0]
int sum = 0; add x10, x0, x0 # sum = 0
for (int i =0; i < 20; i++) add x11, x0, x0 # i = 0
sum += A[i]; addi x13, x0, x20 # x13 = 20
Loop:
bge x11, x13, Done # i < 20
lw x12, 0(x9) # x12 = A[i]
add x10, x10, x12 # sum +=
addi x9, x9, 4 # &A[ i+1 ]
addi x11, x11, 1 # i++
j Loop # 进行循环
Done: