【问题标题】:MIPS assembly for a simple for loop用于简单 for 循环的 MIPS 汇编
【发布时间】:2012-02-27 15:30:21
【问题描述】:

我需要将此 C 代码转换为 MIPS 程序集。 这是C代码:

int tmp = 0; 
for (int  j = 0; j < 15; ++j) 
     tmp = tmp * 2 + 3

这是我的 MIPS 汇编代码。是正确的翻译吗?如果您发现任何错误,我真的很想知道。

# tmp = $v0
# j = $t0

.globl main

 main:
    li $v0,0

loop:
    bgt $t0,15,exit
    addi $t0,$t0,1
    mul $t1,$v0,2
    add $v0,$t1, 3
    j loop  

exit:

【问题讨论】:

  • 乘以 2 的幂使用 sll。 不要使用 mul

标签: assembly mips mips32


【解决方案1】:
.data
mensage: asciiz "Text Test"
newline: asciiz "\n"
.text

# tmp = $v0
# j = $t0
 
main:
    li $t0,0
    li $t1,0
    li $t3,0
loop:
    bgt $t0,15,exit
    addi $t0,$t0,1
    j loop
    mul $t1,$t1,2
    add $t3,$t1,3  
exit:
    li $v10,0
    syscall

【讨论】:

  • 不应该 li $v0,0li $v0, 10 吗?在 MIPS 中真的有 syscall0 吗?
  • 感谢您的指出,@user366312。我请求编辑。
【解决方案2】:

我也不知道您正在运行什么 MIPS 模拟器,但我知道 其中一些不是常量,它们要求您将它们分配给 寄存器。所以像 bgt Rsrc1, Src2, label, 通常如果你放一个 src2 中的整数计算机会翻译,但我知道 有些你会得到一个错误 add $v0, $t1, 3 因为它不会 将add翻译成addi。与 mul 相同。我知道我的 SPIM 模拟器没有 允许它。

【讨论】:

    【解决方案3】:

    您没有在循环之前将 j ($t0) 设置为零。

    【讨论】:

      【解决方案4】:

      你的循环从 0 到 14,所以你的 bgt 指令应该是:bgt $t0,14,exit 我想。

      .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多