Lab7report

前情提要

这个lab是一个后续问题,因此没有手写任务,我们不在ipad上完成这个问题,直接用obsidian.

问题描述

Pasted image 20240911133211.png
lab7的manual中有这个题目的前身,是一个处理黑白图片的问题,其中要实现的function是
Pasted image 20240911133350.png
但是report中的问题就是询问我们如果超出了4个参数怎么办?(mips中有$a0-$a3这四个参数寄存器)
Pasted image 20240911133632.png
原来的汇编代码

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                  # 返回调用者