【问题标题】:C-code to assembly [closed]汇编的C代码[关闭]
【发布时间】: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+s0a0+s0,逐字节复制,如果刚刚写入的值是== 0,则跳转到L2,否则跳转回L1
  • 那个汇编代码确实看起来与您的 C 代码无关。这里有什么故事?

标签: c arrays assembly mips pipeline


【解决方案1】:

分解然后实施

v、k 和 j 作为我们假设的寄存器进来。

你需要建立地址 v+(k

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 产生了相同的基本指令序列。两个班次,两个加两个负载,然后两个存储。

【讨论】:

    【解决方案2】:

    这是一个free online tool,它将 c 代码转换为汇编。

    这是转换后的代码:

        addiu   $sp,$sp,-24
    $LCFI0:
        sw  $fp,20($sp)
    $LCFI1:
        move    $fp,$sp
        movz    $31,$31,$0
    $LCFI2:
        sw  $4,24($fp)
        sw  $5,28($fp)
        sw  $6,32($fp)
        lw  $2,28($fp)
        nop
        sll $2,$2,2
        lw  $3,24($fp)
        nop
        addu    $2,$3,$2
        lw  $2,0($2)
        nop
        sw  $2,8($fp)
        lw  $2,28($fp)
        nop
        sll $2,$2,2
        lw  $3,24($fp)
        nop
        addu    $2,$3,$2
        lw  $3,32($fp)
        nop
        sll $3,$3,2
        lw  $4,24($fp)
        nop
        addu    $3,$4,$3
        lw  $3,0($3)
        nop
        sw  $3,0($2)
        lw  $2,32($fp)
        nop
        sll $2,$2,2
        lw  $3,24($fp)
        nop
        addu    $2,$3,$2
        lw  $3,8($fp)
        nop
        sw  $3,0($2)
        move    $sp,$fp
        lw  $fp,20($sp)
        addiu   $sp,$sp,24
        j   $31
        nop
    

    【讨论】:

    • 并且未优化且比手动操作更难解释和/或编码。
    • 我已经编辑过,没有看到 mips 部分只是程序集,所以我跳上答案认为他想要 x86 asm。
    • @Siguza 不,这是 mips。注意lwsw 指令。并且,三重参数addu 指令等
    • 最初链接的工具确实将 MIPS 作为目标选项,以及添加标志的选项 (-O3)。 Doesn't look so bad then.
    • @CraigEstey 我在编辑前发表了评论。 ;) 是的,现在是 MIPS。虽然仍然没有优化。 :P
    猜你喜欢
    • 2014-06-21
    • 2012-01-24
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2017-05-08
    • 1970-01-01
    • 2018-05-07
    相关资源
    最近更新 更多