在MIPS中写作时,我不确定是使用li还是addi。我仍然不清楚两者的区别是什么。

在MIPS中写作时,我不确定是使用li还是addi。我仍然不清楚两者的区别是什么。,mips,mips32,mips64,Mips,Mips32,Mips64,例如,我有一段C代码,我试图将其转换为MIPS以供练习,但对于变量计数,我不知道是使用addi$t0,0还是li$t0,0。我可以用其中一个还是另一个?有什么区别 Void haarPredict (int vector[], int N) { int half = N >> 1; int count = 0; for(int i = 0; i < half; i++) {

例如,我有一段C代码,我试图将其转换为MIPS以供练习,但对于变量计数,我不知道是使用addi$t0,0还是li$t0,0。我可以用其中一个还是另一个?有什么区别

   Void haarPredict (int vector[], int N) 
    { 
        int half = N >> 1; 
        int count = 0; 

        for(int i = 0; i < half; i++) 
        { 
            int predictVal = vector[i]; 
            int j = i + half; 
            vector[j] = vector[j] - predictVal 
        } 
    } 
Void haarPredict(int vector[],int N)
{ 
int half=N>>1;
整数计数=0;
对于(int i=0;i
这就是我在将上述代码转换为MIPS之后到目前为止所拥有的。假设$a0是向量[],而$a1是N。同样,我不确定li或addi是否正确使用

      srl $t0, $a1, 1     #t0 holds half. half = N >> 1
      addi $t1, $t1, 0    #t1 holds count. count = 0
      addi $t2, $t2, 0    #t2 holds i. i = 0
loop: slt $t3, $t2, $t0     #t3 holds 1 if i < half
      beg $t3, $zero, exit  #exit if t3 == 0
      lw  $t4, 0($a0)       #t4 holds predictValue
      addi $a0, $a0, 4    #4 bytes for next word address
      addi $t5, $t2, $t0  #t5 holds j. j = i + half
      lw $t6, $t6, $t4    #vector[j]=vector[j]-predivtVal
      addi $t2, $t2, 1    #i++
      j loop
exit: jr $ra
srl$t0,$a1,1#t0持有一半股份。一半=N>>1
加上$t1,$t1,0#t1保持计数。计数=0
加上$t2,$t2,0#t2持有i。i=0
循环:slt$t3,$t2,$t0#如果i<一半,则t3保持1
beg$t3,$0,退出#如果t3==0,则退出
lw$t4,0($a0)#t4持有可预测价值
添加$a0,$a0,4个字节作为下一个字地址
addi$t5、$t2、$t0#t5持有j。j=i+1/2
lw$t6,$t6,$t4#向量[j]=向量[j]-预测值
附加$t2,$t2,1#i++
j环
出口:jr$ra
li指令(立即加载)将特定数值加载到寄存器中

addi(Add inmediate)添加寄存器和符号扩展立即数值,并将结果存储在寄存器中

因此,除非您100%确定寄存器具有零值,否则不应使用addi指令来设置寄存器

例如:

addi $t1, $t1, 0    #t1 holds count. count = 0
你不知道在那个特定时刻$t1是否为零。如果这是一个子例程,那么您可能正在使用$t1的垃圾值(一个在调用子例程之前、跳转到子例程地址之前的值)

因此,安全的方法是将寄存器设置为li(因此,count=0),而不考虑寄存器的先前值。

li(立即加载)指令将特定数值加载到寄存器中

addi(Add inmediate)添加寄存器和符号扩展立即数值,并将结果存储在寄存器中

因此,除非您100%确定寄存器具有零值,否则不应使用addi指令来设置寄存器

例如:

addi $t1, $t1, 0    #t1 holds count. count = 0
你不知道在那个特定时刻$t1是否为零。如果这是一个子例程,那么您可能正在使用$t1的垃圾值(一个在调用子例程之前、跳转到子例程地址之前的值)

因此,安全的方法是将寄存器设置为li(因此,count=0),而不考虑寄存器的先前值。

“因此,除非您100%确定寄存器具有零值”旁注:MIPS处理器有一个始终包含值0的寄存器(
$zero
)。这就是加载立即数时用作源寄存器的内容。实际上,
li$t1,123
将组合成类似于
ori$t1,
addiu$t1,
的东西。但是,如果汇编程序支持,则应首选
li
,因为它使代码更易于读取和写入。“因此,除非您100%确定寄存器具有零值”,旁注:MIPS处理器有一个始终包含值0的寄存器(
$zero
)。这就是加载立即数时用作源寄存器的内容。实际上,
li$t1,123
将组合成类似于
ori$t1,
addiu$t1,
的东西。但是,如果汇编程序支持它,
li
应该是首选,因为它使代码更易于读写。