C阵列在MIPS组件中索引
C array indexing in MIPS assembly?
问题:
void swap (int v[], int k)
{
int temp;
temp = v[k];
v[k] = v[k+1];
v[k+1] = temp;
}
我的问题是为什么int v[]
添加了 $t1
?(无论谁这样做的人甚至都没有发表评论,所以我假设$a0
是v[]
,$a1
是k
)。
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
相关文章:
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 如何将 txt 文件中的行分隔为组件C++
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- 到连接组件算法的问题(递归)
- D3D11-将混合权重和索引传递到顶点着色器
- 将转换字符键入 int 以用作向量C++的索引
- 两个 COM 组件中 ENUM 的重复条目
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 为什么 gcc 会产生这种奇怪的组件与叮当声?
- 使用 bfs 解决连接组件问题时得到错误的答案
- C阵列在MIPS组件中索引