Optimization MIPS汇编变量寄存器

Optimization MIPS汇编变量寄存器,optimization,assembly,mips,Optimization,Assembly,Mips,我有一段代码希望重用,而在一条指令中只更改一个寄存器。coproc1中的初始寄存器是$f18,每次运行此代码时,我希望它最多使用下一个COP1寄存器4次。在这种情况下,我的内存和可用的GPR寄存器非常有限,所以我不想为这做一个单独的子程序 我知道我可以使用自修改代码来更改实际指令,但这样做似乎需要我知道所讨论行的确切地址。这使得开发我的代码变得困难,因为在我完成之前,代码的大小会不断波动 是否可以通过标签+偏移量引用内存地址? 使用很少的指令和额外的寄存器有更好的方法吗 calc_and_add

我有一段代码希望重用,而在一条指令中只更改一个寄存器。coproc1中的初始寄存器是$f18,每次运行此代码时,我希望它最多使用下一个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

你知道,你可以在你想修改的指令上贴上标签;顺便说一句,MIPS没有PC相对寻址,所以这会很难看。此外,在具有缓存的系统上,自修改代码是一场噩梦。如果您有某种形式的防止修改可执行内存的保护,那么您也必须禁用它。真的,除非你在系统中遇到最后一个千字节的内存,否则它会太慢,太痛苦,不值得这么做。@Jester:哇,我觉得很愚蠢,不知怎么的,我没有想到这一点。虽然由于标签不是代码的实际部分,我不明白为什么不允许标签偏移。@EOF我的代码空间不足1 KB,但更改代码时没有保护。如果您的计算机有缓存,这就留下了I-cache的问题。您的循环很小,因此指令不会自行从统一缓存重新加载,您必须添加显式指令以将i-cache中的当前页标记为无效。。。丑陋的