条件分支指令
B-type:B指代branch
6-11中:先是第11位然后才是1到4位
24-31中:先是5到10位,然后才是第12位
符号扩展,所以是-20482和20472
标号:标签类似地址
伪指令
写loop不写地址值
char array[] = {'h', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!', '\0'};
int len = 0;
while (array[len] != '\0') {
len++;
}
汇编结果
.data
array: .byte 'h', 'e', 'l', 'l', 'o', ',', 'w', 'o', 'r', 'l', 'd', '!', 0
.text
.globl _start
_start:
la t0, array # 加载数组的地址到寄存器 t0
li t1, 0 # 初始化计数器 t1 为 0
loop:
lbu t2, 0(t0) # 从内存中读取数组元素到寄存器 t2
beqz t2, end # 如果读取到的元素值为 0,即结束标记 '\0',则跳转到 end 标签
addi t1, t1, 1 # 计数器加1
addi t0, t0, 1 # 数组指针移动到下一个元素
j loop # 无条件跳转到 loop 标签继续循环
end:
# 此时计数器 t1 中存储的即为数组长度
# 可以在该处添加代码来利用长度进行其他操作
# 例如打印数组长度,或进行其他处理
li a0, 1 # 将系统调用编号 1 (print integer) 装入寄存器 a0
move a1, t1 # 将计数器 t1 中的值装入寄存器 a1
ecall # 发起系统调用
# 程序结束,退出
li a7, 10 # 将系统调用编号 10 (exit) 装入寄存器 a7
li a0, 0 # 将返回值 0 装入寄存器 a0
ecall # 发起系统调用
无条件跳转指令
以寄存器值为基址来偏移跳转
问题
AUPIC会构造一个32位的数,将IMM作为其高20位,并存放到X6中,然后JALR跳转到X6+IMM的低12位的值。所以整体来看就是跳转到X6+一个32位数值