【发布时间】:2016-12-22 04:27:03
【问题描述】:
我试图将 C 代码转换为 MIPS 程序集。这是一个sn-p。问题是我不太确定我是否走在正确的轨道上。我希望有人可以提供帮助。
这是最初的问题:
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
好吧,这就是我所知道的。我这样做是对的还是我完全失去了它!?
【问题讨论】:
-
我没有看到任何问题。请查阅顶行的帮助按钮,了解如何提出关于 SO 的问题。对于手头的问题,从 C 代码生成汇编器,我知道的所有编译器都有一个命令行开关来生成它。例如 gcc 有
-S。你有什么问题? -
你有一个循环,C 代码没有循环。数组是 int 的,我们可以假设是 4 字节或 32 位。所以你需要将 k 乘以 4 或左移 2,然后将其添加到 v 并将其加载到 temp 中。然后在 v 中创建一个 j 乘以 4 的偏移量并存储到 v 加上 k 乘以 4。然后将 temp 放入 v 加上 j 乘以 4。你的代码是这样做的吗?
-
看来发帖者正在尝试学习 MIPS 汇编器和 c 调用约定。对我来说似乎是一个公平的问题。但是考虑到这里很少有人是 MIPS 专家,从给定的 c 编译器生成 asm 文件的建议是一个很好的建议。
-
这对我来说更像是
strcpy的翻译/实现.... 将s0设置为0,然后从地址a1+s0到a0+s0,逐字节复制,如果刚刚写入的值是== 0,则跳转到L2,否则跳转回L1。 -
那个汇编代码确实看起来与您的 C 代码无关。这里有什么故事?
标签: c arrays assembly mips pipeline