gpt4 book ai didi

c++ - MIPS 汇编中的 C 数组索引?

转载 作者:行者123 更新时间:2023-11-30 20:58:03 26 4
gpt4 key购买 nike

问题:

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

我知道这是用来交换变量的,但是它在这里做什么,为什么要添加 v[]kv[] 不是一个声明变量的数组吗,你怎么能把它与一个整数k相加呢?

最佳答案

whoever did this didn't even comment it so I'm assuming $a0 is v[] and $a1 is k

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

I know this is used to swap variables but what is it doing here, why is it adding v[] with k? isnt v[] a array of declared variables, how can you add it with a integer 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

关于c++ - MIPS 汇编中的 C 数组索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com