当数组的基地址存储在寄存器中时,我的理解是不想调整该寄存器 . 我试图了解该原则何时有效 . 在处理仅保存的寄存器或保存的寄存器和参数寄存器时,这是一种有效的做法吗?
下面是我正在使用的一个示例,涉及将简单的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.
1 回答
如果要将C代码转换为汇编(即手动编译),则必须确保没有信息丢失 .
如果数组a和b的唯一"copy"存储在
$a0
和$a1
中,并且在for循环之后存在,则应保留它们 . 如果这些地址保存在别处,您可以修改它们,如果您不打算在日常工作中使用它们 .例如,假设您的C代码在for循环之后使用数组a或b执行其他操作,例如:
然后你要么保留数组a的基地址,要么在for循环后重新计算它 .