C 代码到汇编

标签 c arrays assembly mips pipeline

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

相关文章:

c++ - 用 C 和 C++ 最快的输出到文件

javascript - 需要帮助从 Javascript 对象提取数据吗?

arrays - 定义具有随机步骤的向量

c++ - 使用 RAX/EAX/AX/AL/AH 寄存器作为目的地时,进位加法是否更快?

gcc - PowerPC GCC 在没有 % 符号的汇编中打印寄存器

assembly - MIPS - assembly BEQ 命令

c - 为什么在使用 mmap 时会附加额外的字符 ^@?

c - 我是否必须为 C 中的每对进程创建一个新管道?

c - 为什么下面的等式总是四舍五入?

java - Android 时间到字节数组