用MIPS写的时候,我拿不准是用li还是addi。我仍然不清楚有什么区别。
When writing in MIPS, I am unsure whether to use li or addi. I am still unclear what the difference is.
例如,我有一段C代码,我想转换成MIPS来练习,但是对于变量count,我不知道是用addi $t0,0还是li $t0, 0. 我可以使用 either or 吗?有什么区别?
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
}
}
这是我将上述代码转换为 MIPS 后的结果。假设 $a0 是 vector[] 并且 $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
li(立即加载)指令将特定数值加载到寄存器中。
addi(Add inmediate)将一个寄存器和一个符号扩展的立即数相加,并将结果存入寄存器。
因此,除非您 100% 确定寄存器的值为零,否则您不应使用 addi 指令来设置寄存器。
例如:
addi $t1, $t1, 0 #t1 holds count. count = 0
您不知道 $t1 在那个特定时刻是否为零。如果那是一个子例程,您可能正在使用 $t1 的垃圾值(在调用子例程之前,在跳转到子例程的地址之前的值)。
所以安全的方法是用 li 设置寄存器(因此,count=0),而不考虑寄存器的先前值。
例如,我有一段C代码,我想转换成MIPS来练习,但是对于变量count,我不知道是用addi $t0,0还是li $t0, 0. 我可以使用 either or 吗?有什么区别?
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
}
}
这是我将上述代码转换为 MIPS 后的结果。假设 $a0 是 vector[] 并且 $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
li(立即加载)指令将特定数值加载到寄存器中。
addi(Add inmediate)将一个寄存器和一个符号扩展的立即数相加,并将结果存入寄存器。
因此,除非您 100% 确定寄存器的值为零,否则您不应使用 addi 指令来设置寄存器。
例如:
addi $t1, $t1, 0 #t1 holds count. count = 0
您不知道 $t1 在那个特定时刻是否为零。如果那是一个子例程,您可能正在使用 $t1 的垃圾值(在调用子例程之前,在跳转到子例程的地址之前的值)。
所以安全的方法是用 li 设置寄存器(因此,count=0),而不考虑寄存器的先前值。