我有一段代码,我想重复使用,而在一条指令中只更改一个寄存器。 $f18
中的初始寄存器为coproc1
,每次运行此代码时,我希望它使用下一个COP1
寄存器(最多4次)。在这种情况下,我对内存和可用的GPR寄存器非常有限,所以我不想为此制作单独的子程序。
我知道我可以使用自修改代码来更改实际指令,但这样做似乎要求我知道相关行的确切地址。这使我的代码难以开发,因为在我完成之前,大小会不断波动。
是否可以通过标签+偏移量来引用内存地址? 使用极少数指令和附加寄存器有更好的方法吗?
calc_and_add_color:
srl $t2, $t2, $t0
andi $s2, $t2, 0x1F
mtc1 $s2, $f22 #f22 is now red/green/blue component
cvt.s.w $f22, $f22
mul.s $f25, $f22, $f18 #<<<F18 HERE IS WHAT I WANT TO CHANGE
round.w.s $f25, $f25
lh $s2, 0x0($s1)
mfc1 $s5, $f25
addu $s5, $s5, $s2 #add new red comp. to existing one
andi $s5, $s5, 0x1F #cap at 31
sh $s2, 0x0($s1) #store it
addiu $s1, $s1, 0x6C0 #next color
addiu $s2, $r0, 0x5 #bit shifter
andi $s5, $fp, 0x0003 #isolate counter
bnel $s5, $zero, calc_and_add_color #when fp reaches zero every color has been done
addiu $fp, $fp, -0x1