Assembly 在MIPS中索引数组的最佳做法

Assembly 在MIPS中索引数组的最佳做法,assembly,mips,Assembly,Mips,当数组的基址存储在寄存器中时,我的理解是不希望调整该寄存器。我试图理解这一原则何时有效。当只处理保存的寄存器或保存的寄存器和参数寄存器时,这是有效的做法吗 下面是我正在处理的一个例子,它涉及到将简单的C代码转换成MIPS指令。我尝试了两种方法来解决这个问题 在第一个解决方案中,我增加了最初保存数组a和数组b的基址的寄存器。我的想法是,给定的基址寄存器,$a0和$a1是参数寄存器,而不是保存的寄存器。我想,也许,调整一下也没关系。在我的第二个解决方案中,我将每个数组的基址存储到临时寄存器中,并对它

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

下面是我正在处理的一个例子,它涉及到将简单的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.
#C代码:
对于(i=0;i如果要将C代码转换为程序集(即手动编译),则必须确保不会丢失任何信息

如果数组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]

for(i=0;i禁止在以后不需要参数寄存器的原始内容时更改参数寄存器。好的,如果我想从头到尾打印数组a的内容,我必须保留[0]的地址或者用减法把我现在的地址带回来?太好了!谢谢!我下一步要讲函数了,这会很有帮助的。干杯!