在MIPS中写作时,我不确定是使用li还是addi。我仍然不清楚两者的区别是什么。
例如,我有一段C代码,我试图将其转换为MIPS以供练习,但对于变量计数,我不知道是使用addi$t0,0还是li$t0,0。我可以用其中一个还是另一个?有什么区别在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++) {
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
应该是首选,因为它使代码更易于读写。