MIPS汇编中的C数组索引?

问题描述 投票:-3回答:1

题:

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

我的问题是为什么int v[]被添加$t1? (无论谁做到这一点甚至没有评论它所以我假设$a0 isv[]$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

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

c++ c assembly mips
1个回答
1
投票

谁做了这个甚至没有评论它所以我假设$ a0是v []而$ a1是k

这些是MIPS calling conventions。函数的前4个参数在$a0..$a3中,返回值(此处不需要)在$v0(如果需要,则为$v1)。退货地址在寄存器$ra

我知道这用于交换变量,但它在这里做了什么,为什么用k添加v []? isnt 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
© www.soinside.com 2019 - 2024. All rights reserved.