Optimization MIPS汇编变量寄存器
我有一段代码希望重用,而在一条指令中只更改一个寄存器。coproc1中的初始寄存器是$f18,每次运行此代码时,我希望它最多使用下一个COP1寄存器4次。在这种情况下,我的内存和可用的GPR寄存器非常有限,所以我不想为这做一个单独的子程序 我知道我可以使用自修改代码来更改实际指令,但这样做似乎需要我知道所讨论行的确切地址。这使得开发我的代码变得困难,因为在我完成之前,代码的大小会不断波动 是否可以通过标签+偏移量引用内存地址? 使用很少的指令和额外的寄存器有更好的方法吗Optimization MIPS汇编变量寄存器,optimization,assembly,mips,Optimization,Assembly,Mips,我有一段代码希望重用,而在一条指令中只更改一个寄存器。coproc1中的初始寄存器是$f18,每次运行此代码时,我希望它最多使用下一个COP1寄存器4次。在这种情况下,我的内存和可用的GPR寄存器非常有限,所以我不想为这做一个单独的子程序 我知道我可以使用自修改代码来更改实际指令,但这样做似乎需要我知道所讨论行的确切地址。这使得开发我的代码变得困难,因为在我完成之前,代码的大小会不断波动 是否可以通过标签+偏移量引用内存地址? 使用很少的指令和额外的寄存器有更好的方法吗 calc_and_add
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
你知道,你可以在你想修改的指令上贴上标签;顺便说一句,MIPS没有PC相对寻址,所以这会很难看。此外,在具有缓存的系统上,自修改代码是一场噩梦。如果您有某种形式的防止修改可执行内存的保护,那么您也必须禁用它。真的,除非你在系统中遇到最后一个千字节的内存,否则它会太慢,太痛苦,不值得这么做。@Jester:哇,我觉得很愚蠢,不知怎么的,我没有想到这一点。虽然由于标签不是代码的实际部分,我不明白为什么不允许标签偏移。@EOF我的代码空间不足1 KB,但更改代码时没有保护。如果您的计算机有缓存,这就留下了I-cache的问题。您的循环很小,因此指令不会自行从统一缓存重新加载,您必须添加显式指令以将i-cache中的当前页标记为无效。。。丑陋的