我试图将 C 代码转换为 MIPS 汇编。这是一个片段。问题是我不太确定我是否走在正确的轨道上。我希望有人能提供帮助。
这是最初的问题:
void swap(int v[], int k, int j) {
int temp;
temp = v[k];
v[k] = v[j];
v[j] = temp;
}
这就是我已经走了多远:
swap:
addi $sp, $sp, -4
sw $s0, 0($sp)
add $s0, $zero, $zero
L1: add $t1, $s0, $a1
lb $t2, 0($t1)
add $t3, $s0, $a0
sb $t2, 0($t3)
beq $t2, $zero, L2
addi $s0, $s0, 1
j L1
L2: lw $s0, 0($sp)
addi $sp, $sp, 4
jr $ra
好吧,这就是我所能得到的。我这样做是正确的还是我完全失去了它!?
最佳答案
分解然后实现
v、k 和 j 作为我们假设的寄存器出现。
您需要构建地址 v+(k<<2) 和 v+(j<<2) 您可以使用暂存寄存器,我假设您也可以丢弃 k 和 j 传入寄存器,因为您不再需要它们了。
k = k << 2;
k = k + v
j = j << 2;
j = j + v
temp0 = load(k)
temp1 = load(j)
store(k) = temp1
store(j) = temp0
您应该能够将其转换为 asm,可以重新排列一些指令并使其仍然有效。
编辑,我会让你弄清楚,但我没有先作弊和编译。但发现 gcc 产生了相同的基本指令序列。两个类次,两个类次增加两个负载,然后两个存储。
关于C 代码到汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38964003/