Mips 更直接的方法?

Mips 更直接的方法?,mips,Mips,这是一个家庭作业问题。我的代码给出了正确的答案。像我那样写出解决方案非常令人困惑,花了我一段时间。有没有更好的编码方法 # Convert to MIPS: (((5 + 1) - (1 + 3) + (5 - 3)) - 1) – 5 + 3 main: li $t0 5 li $t1 1 li $t2 3 # (((5 + 1) - (1 + 3) + (5 - 3)) - 1) – 5 + 3 # b

这是一个家庭作业问题。我的代码给出了正确的答案。像我那样写出解决方案非常令人困惑,花了我一段时间。有没有更好的编码方法

# Convert to MIPS: (((5 + 1) - (1 + 3) + (5 - 3)) - 1) – 5 + 3

main:
    li $t0 5
    li $t1 1
    li $t2 3
    #         (((5   + 1)   - (1   + 3)   + (5   - 3))   - 1)   – 5   + 3
    # becomes ((($t0 + $t1) - ($t1 + $t2) + ($t0 - $t2)) - $t1) - $t0 + $t2
    #         (((  $t3    ) - (  $t4    ) + (  $t5    )) - $t1) - $t0 + $t2

    add $t3, $t0, $t1
    add $t4, $t1, $t2
    sub $t5, $t0, $t2
    sub $t6, $t3, $t4
    add $t6, $t6, $t5
    sub $t6, $t6, $t1
    sub $t6, $t6, $t0
    add $a0, $t6, $t2

    li $v0, 1             # print $a0
    syscall

    li $v0, 10            # system call 10... lets us exit, load 10 in $v0
    syscall               # call the exit.

如果您有MIPS C编译器,则始终可以在关闭优化的情况下编译此编译器:

int main()
{
    int one, three, five;
    int result;

    one = 1;
    three = 3;
    five = 5;

    result = (((five + one) - (one + three) + (five - three)) - one) -
        five + three;
    return result;
}
然后在生成的目标代码上运行objdump。这不是你的教授想要你做的,但你已经做到了,你会学到更多

编辑

在将汇编语言文件传递给汇编程序之前,我通常在汇编语言文件上运行C预处理器。当特定寄存器用于特定对象时,它可以使对象更易于读取:

#define FIVE  $t0
#define ONE   $t1
#define THREE $t2
#define FIVE_PLUS_ONE    $t3
#define ONE_PLUS_THREE   $t4
#define FIVE_MINUS_THREE $t5
#define ACCUM $t6

main:
    li FIVE 5
    li ONE 1
    li THREE 3
    //         (((5   + 1)   - (1   + 3)   + (5   - 3))   - 1)   – 5   + 3
    // becomes ((($t0 + $t1) - ($t1 + $t2) + ($t0 - $t2)) - $t1) - $t0 + $t2
    //         (((  $t3    ) - (  $t4    ) + (  $t5    )) - $t1) - $t0 + $t2

    add FIVE_PLUS_ONE, FIVE, ONE
    add ONE_PLUS_THREE, ONE, THREE
    sub FIVE_MINUS_THREE, FIVE, THREE
    sub ACCUM, FIVE_PLUS_ONE, ONE_PLUS_THREE
    add ACCUM, ACCUM, FIVE_MINUS_THREE
    sub ACCUM, ACCUM, ONE
    sub ACCUM, ACCUM, FIVE
    add $a0, ACCUM, THREE

    li $v0, 1             // print $a0
    syscall

    li $v0, 10            // system call 10... lets us exit, load 10 in $v0
    syscall               // call the exit.

我在你的代码中看到了这个问题的注释

是的,你可以用更直接的方式来做。您只需按照操作发生的顺序为每个操作创建一个不同的部分。但这会使您的代码更长,而且实际上也没有那么好的可读性

li $t0 5
li $t1 1
add $t2, $t0, $t1

li $t0 1
li $t1 3
add $t3, $t0, $t1

sub $t4, t2, t3


li $t0 5
li $t1 3
sub $t2, $t0, $t1

add $t3, $t4, $t2

li $t0 1
sub $t2, $t3, $t0
#etc.

您是偶然使用SPIM模拟器的吗?我使用的是QtSpim。我的代码应该做一个简单的算术题。对于上面的算术题,括号在1的情况下除了符号外没有任何变化。你可以将数字(5,1,-1,-3,5,3,-1,-5,3)加载到RAM表中,通过读取一个值进行循环,将其加到总数中,然后在完成时返回值。这将占用很少的寄存器,成为一个简单的循环。你已经完成了你的家庭作业。交上来。这是一种了解更多关于计算机如何工作的方法。