Lab7report
前情提要
这个lab是一个后续问题,因此没有手写任务,我们不在ipad上完成这个问题,直接用obsidian.
问题描述
lab7的manual中有这个题目的前身,是一个处理黑白图片的问题,其中要实现的function是
但是report中的问题就是询问我们如果超出了4个参数怎么办?(mips中有$a0-$a3这四个参数寄存器)
原来的汇编代码
abs_diff:
slt $t0,$a1,$a0 #a1 less than a0 set t0=1
beq $0,$t0,less
sub $t1,$a0,$a1
j out
less:
sub $t1,$a1,$a0
out:
add $v0,$0,$t1
jr $ra
abs_diff_color:
slt $t0,$a1,$a0 #a1 less than a0 set t0=1
beq $0,$t0,less
sub $t1,$a0,$a1
j color2
less:
sub $t1,$a1,$a0
color2:
slt $t0,$a3,$a2 #a1 less than a0 set t0=1
beq $0,$t0,less
sub $t2,$a2,$a1
j color3
less:
sub $t2,$a3,$a2
color3:
lw $a0,4($sp)
lw $a1,8($sp)
slt $t0,$a1,$a0 #a1 less than a0 set t0=1
beq $0,$t0,less
sub $t3,$a0,$a1
j out
less:
sub $t3,$a1,$a0
out:
add $v0,$t2,$t1
add $v0,$v0,$t3
jr $ra
下面是GPT老师的点评和修改
abs_diff_color:
# 计算 R 分量的差值 abs(R1 - R2)
slt $t0, $a1, $a0 # 比较 R2 < R1 吗?如果是,则 $t0 = 1
beq $t0, $0, R2_less_R1 # 如果 R2 >= R1, 跳转
sub $t1, $a0, $a1 # 否则,计算 R1 - R2
j G_diff # 跳转去计算 G 分量的差异
R2_less_R1:
sub $t1, $a1, $a0 # 计算 R2 - R1
G_diff:
# 计算 G 分量的差值 abs(G1 - G2)
slt $t0, $a3, $a2 # 比较 G2 < G1 吗?如果是,则 $t0 = 1
beq $t0, $0, G2_less_G1 # 如果 G2 >= G1, 跳转
sub $t2, $a2, $a3 # 否则,计算 G1 - G2
j B_diff # 跳转去计算 B 分量的差异
G2_less_G1:
sub $t2, $a3, $a2 # 计算 G2 - G1
B_diff:
# 从栈中加载 B 分量参数 B1 和 B2
lw $t4, 4($sp) # 从栈中加载 B1(第五个参数)
lw $t5, 8($sp) # 从栈中加载 B2(第六个参数)
# 计算 B 分量的差值 abs(B1 - B2)
slt $t0, $t5, $t4 # 比较 B2 < B1 吗?如果是,则 $t0 = 1
beq $t0, $0, B2_less_B1 # 如果 B2 >= B1, 跳转
sub $t3, $t4, $t5 # 否则,计算 B1 - B2
j Result # 跳转去计算最终结果
B2_less_B1:
sub $t3, $t5, $t4 # 计算 B2 - B1
Result:
# 计算总的颜色差值: abs(R1-R2) + abs(G1-G2) + abs(B1-B2)
add $v0, $t1, $t2 # 计算 R 差值 + G 差值
add $v0, $v0, $t3 # 加上 B 差值
# 返回结果
jr $ra # 返回调用者