gpt4 book ai didi

C 代码到汇编

转载 作者:行者123 更新时间:2023-11-30 15:06:30 25 4
gpt4 key购买 nike

我试图将 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/

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