首页 文章

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

提问于
浏览
0

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

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

  • 2

    如果要将C代码转换为汇编(即手动编译),则必须确保没有信息丢失 .

    如果数组a和b的唯一"copy"存储在 $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循环后重新计算它 .

相关问题