在MIPS中索引数组的最佳实践

时间:2015-10-22 15:44:16

标签: assembly mips

当数组的基址存储在寄存器中时,我理解一个人不想调整该寄存器。我试图了解该原则何时有效。在处理仅保存的寄存器或保存的寄存器和参数寄存器时,这是一种有效的做法吗?

以下是我正在使用的一个示例,涉及将简单的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 个答案:

答案 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循环后重新计算它。