当数组的基址存储在寄存器中时,我理解一个人不想调整该寄存器。我试图了解该原则何时有效。在处理仅保存的寄存器或保存的寄存器和参数寄存器时,这是一种有效的做法吗?
以下是我正在使用的一个示例,涉及将简单的C代码转换为MIPS指令。我尝试了两种解决方案。
在第一个解决方案中,我增加了最初保存数组a和数组b的基址的寄存器。我的想法是给定的基址寄存器$ a0和$ a1是参数寄存器,而不是保存的寄存器。我想,或许,调整它们并不重要。在我的第二个解决方案中,我将每个数组的基地址存储到临时寄存器中并对其进行操作。
我确实在网上找到了一些针对这个特定示例的解决方案,但我试图理解每条指令的基础,而不仅仅是遵循程序解决方案。任何关于最佳MIPS实践的建议都非常感谢!
# C Code:
for (i=0; i<=100; i=i+1)
{
a[i] = b[i] + c;
}
# $a0 = base address of array a
# $a1 = base address of array b
# $s0 = c
# Attempted Solution # 1
li $t0, 0 # t0 = 0
li $t1, 101 # t1 = 100
Loop:
lw $t2, 0($a1) # t2 = b[i]
add $t3, $t2, $s0 # t3 = b[i] + c
sw $t3, 0($a0) # a[i] = b[i] + c
addi $a0, $a0, 4 # a0 = address of a[i+1]
add $a1, $a1, 4 # a1 = address of b[i+1]
addi $t0, 1 # t0 = i++
bne $t0, $t1, Loop # If t0 != 101, loop again.
# Attempted Solution # 2:
li $t0, 0 # t0 = 0
li $t1, 101 # t1 = 100
add $t2, $a0, $zero # t2 = adress of a[0]
add $t3, $a1, $zero # t3 = adress of b[0]
Loop:
lw $t4, 0($t3) # t4 = b[i]
add $t4, $t4, $s0 # t4 = b[i] + c
sw $t4, 0(t2) # a[i] = b[i] + c
addi $t2, $t2, 4 # t2 = address of a[i+1]
addi $t3, $t3, 4 # t3 = address of b[i+1]
bne $t0, $t1, Loop # If t0 != 101, loop again.
答案 0 :(得分:2)
如果您将 C代码转换为汇编(即手动编译),那么您必须确保没有信息丢失。
如果只有&#34;副本&#34;数组a和b的基地址存储在$a0
和$a1
中,而你的for循环后你应该保存它们。如果这些地址保存在其他地方,您可以修改它们,如果您不打算在日常工作中使用它们。
例如,假设您的C代码在for循环之后使用数组a或b执行其他操作,例如:
for (i=0; i<=100; i=i+1)
{
a[i] = b[i] + c;
}
c = a[0]
然后你要保留数组a的基地址,要么在for循环后重新计算它。