C阵列在MIPS组件中索引

C array indexing in MIPS assembly?

本文关键字:索引 组件 MIPS 阵列      更新时间:2023-10-16

问题:

void swap (int v[], int k)
{
int temp;
temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;
}

我的问题是为什么int v[]添加了 $t1?(无论谁这样做的人甚至都没有发表评论,所以我假设$a0v[]$a1k)。

MIPS中的答案:

swap: sll $t1, $a1, 2
add $t1, $a0, $t1
lw $t0, 0($t1)
lw $t2, 4($t1)
sw $t2, 0($t1)
sw $t0, 4($t1)
jr $ra

我知道这是用于交换变量,但是在这里做什么,为什么使用k添加v[]v[]不是声明的变量数组,如何使用整数k添加它?

谁甚至没有发表评论,所以我假设$ a0是v [],$ a1是k

这些是呼叫约定的MIP。函数的前4个参数是在$a0..$a3中,返回值(此处不需要)在$v0中(如果需要,则$v1)。返回地址在寄存器$ra中。

我知道这是用于交换变量,但是在这里做什么,为什么用k添加v []?v []不是一系列声明的变量,如何使用整数k?

添加它

v []确实是int的数组。持有变量V的是数组的地址。将值添加到数组地址是到达数组的特定元素的方法。

swap:                   # void swap (int v[], int k)
                        ; so v[] is in $a0 and k in $a1
      sll $t1, $a1, 2   ; k*=4 (ie sizeof(int))
      add $t1, $a0, $t1 ; $t1=@v+4*k==@(v[k])
      lw $t0, 0($t1)    #   temp = v[k];
      lw $t2, 4($t1)    ; 4(t1) is @(v[k])+4==@(v[k+1]
                        ; $t0==temp==v[k], $t2==v[k+1]
      sw $t2, 0($t1)    #   v[k] = v[k+1]; 
      sw $t0, 4($t1)    #   v[k+1] = temp;
      jr $ra            ; go back to caller