在MIPS中添加最多10位的所有数字

时间:2012-02-28 19:21:21

标签: assembly mips

我以为我知道如何只使用add,sub,mult,addi和,或者andi,ori,lw,sw,beq,bne,slt,slti,mflo。

我必须确保每个细节都在那里,堆栈指针是清晰的等等。

请帮忙解决这个问题吗?不是为了完成作业,只是为了学习考试。我试图解决它并弄错了,只是想看到一个正确的解决方案,所以我可以看到我做错了什么。我会问我的教授,但他今天没有办公时间,今晚我需要弄明白这一点,因为我忙于其余的一周

1 个答案:

答案 0 :(得分:1)

没有任何理由对堆栈指针做任何事情,除非我们想在堆栈上保留一些东西。但是,在这样一个简单的程序中,只使用寄存器更容易。 (仅使用add,sub,mult,addi,和,or,andi,ori,lw,sw,beq,bne,slt,slti,mflo。)

    .text
    .global main
main:
    addi    $t0, $zero, 10          # (counter) we will start with 10 and go down to zero
    add     $t1, $zero, $zero       # (sum) our sum, 0
count:
    add     $t1, $t1, $t0           # sum += counter
    addi    $t0, $t0, -1            # counter -= 1
    bne     $t0, $zero, count       # if (counter) goto count
    add     $v0, $zero, $t1         # return value, our sum
    #jr     $ra                     # return (jr not allowed?)

如果你真的想利用堆栈来存储局部变量(count和sum),你可以这样做。但是,正如您所看到的,这是一个相当广泛和不必要的。

    .text
    .global main
main:
    addi    $sp, $sp, -12       # Make room on the stack ($ra, sum, counter)
    sw      $ra, 0($sp)         # save the return address (not really needed)
    sw      $zero, 4($sp)       # sum variable, set to 0
    addi    $t0, $zero, 10
    sw      $t0, 8($sp)         # counter variable, set to 10
count:
    lw      $t0, 4($sp)         # load sum
    lw      $t1, 8($sp)         # load counter
    add     $t0, $t0, $t1       # sum += counter
    addi    $t1, $t1, -1        # counter -= 1
    sw      $t0, 4($sp)         # save the sum value
    sw      $t1, 8($sp)         # save the counter
    bne     $t1, $zero, count   # if (counter) goto count

    lw      $v0, 4($sp)         # return value, the sum
    lw      $ra, 0($sp)         # restore caller's address
    addi    $sp, $sp, 12        # pop the stack
    #jr     $ra                 # return to caller (jr not allowed?)