【问题标题】:writing iteration in MIPS在 MIPS 中编写迭代
【发布时间】:2013-11-15 14:50:52
【问题描述】:

我正在 MIPS 中编写这个程序来计算 2 到我给定的幂,并将顺序幂求和为 0。例如,如果我像下面的代码一样将 4 放入 $a0,我希望它计算 ( 4^2)+(3^2)+(2^2)+(1^2) 应该是 15。它应该在达到零之前停止。这是我到目前为止写的内容

main: 
addi $a0, $zero, 4    #put k in $a0 in this case 
addi $a1, $zero, 0    #put 0 in current sum
addi $v1, $v1, 0      #tally the total in $v1   
for:  
lw $10, $a0           #load k into reg $10
lw $11, $a1           #load sum into $11
    addi $10, $10, -1     #subtracts 1 from k
    li $9, 0              #sets i in for loop ($9) to 0

完成:

    li $v0, 10
    syscall

我是 MIPS 的新手,可以在完成此操作时使用很多帮助,我知道我想使用 for 循环,但我不知道如何在从 k 中减去 1 并计算和。我如何将 2 带入 k 的幂,因为我猜 mips 中没有幂运算。在课程的这一点上,我只能使用 add、sub、and、or、slt、addi、j、beq、lw、sw 和 sll。使用 sub 时不能使用常量吗?感谢您的帮助

【问题讨论】:

    标签: mips


    【解决方案1】:

    快速提问:

    你在做2^4+2^3.。等等?或4^2+3^2 等? 只是一个简短的说明:

    2^4+2^3+2^2+2^1+2^0 = 15.
    
    4^2+3^2+2^2+2^1 != 15.
    

    (如果是第一个,你确实需要 2^0,因为你需要考虑奇数,2^0 = 1。这就是我们得到二进制奇数的方法。)

    在这种情况下,关于左移 (lls) 的答案是正确的。当你左移一个二进制数时,你将以 2 为底的指数增加 1。

    所以:

    0001 = 1
    0010 = 2
    0100 = 4
    1000 = 8
    

    这些总和给你 15。

    因此您可以向左移动,并将每次移动的结果添加到寄存器中。

    【讨论】:

      【解决方案2】:

      我认为您的讲师试图向您展示的概念是 sll 实际上乘以 2。您必须以二进制方式思考。例如,让我们从 1 开始:

      0000 0000 0000 0000 0000 0000 0000 0001
      

      对此做一个“sll”,你最终会得到什么? 0010 = 2. 再次sll,你得到0100 = 4。依此类推,直到你完全移动并得到0x80000000

      因此,“我如何将 2 设为 k 的幂?”这个问题的答案比您想象的要简单:您将 1 移动 k

      # $t0 contains 'k', the amount we want to shift by
      addi $t1, $zero, 1
      sllv $t3, $t1, $t0
      

      注意:我必须仔细检查您是否可以按可变数量移动,但this linksllv 是有效的。但是,由于它不在您的允许功能列表中,您必须在循环中执行 sll $t1, $t1, 1 。 (请务必在循环开始时打勾,以防您要移动的数量为零!)

      【讨论】:

      • 2 的幂不等于乘以 2 ;)
      • @m0skit0 奥利? 2*2*2 2^3?
      • 老兄,请阅读问题:“我希望它计算 (4^2)+(3^2)+(2^2)+(1^2)” 现在请使用移位计算 3^2。
      • 我责怪一个错误的需求规范。 ;)
      • @JosephPlymouth 那么,我们的任何一个答案都有帮助吗?
      【解决方案3】:

      幂是乘法,乘法是和。因此,您可以编写一个通过加法进行乘法运算的函数,以及另一个通过乘法运算进行幂运算的函数。比如乘法函数:

      multiply: # $a0 first factor, $a1 second factor, $v0 result of multiplication
          or $t0, $zr, $zr 
          or $t1, $a1, $a1
          or $t3, $zr, $zr
      loop:
          beq $t1, $zr, end
          add $t0, $t0, $a0
          addi $t1, $t1, -1
          j loop
          nop
      end:
          or $v0, $t0, $0
          jr $ra
          nop
      

      (请注意,我没有对此进行测试,这不适用于负数)

      顺便说一句,你也有 MUL 指令,但我不知道你是否已经看到了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多