0

私はこのプログラムを MIPS で書いて、私が与えた 2 のべき乗を計算し、0 までの累乗を合計します。たとえば、以下のコードのように $a0 に 4 を入れると、(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 を引き、合計を計算する方法がわかりません。mipsにはべき乗演算がないと思うので、どうすれば2をkの累乗にすることができますか。コースのこの時点では、add、sub、and、or、slt、addi、j、beq、lw、sw、および sll しか使用できません。サブを使用する場合、定数を使用できませんか? 助けてくれてありがとう

4

3 に答える 3

2

累乗は乗算であり、乗算は和です。したがって、加算によって乗算を行う関数と、乗算によってべき乗を行う別の関数を作成できます。たとえば、乗算関数:

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命令もありますが、すでに見たかどうかはわかりません。

于 2013-11-04T21:08:06.037 に答える
1

インストラクターがあなたに見せようとしている概念はsll、事実上、 が 2 倍になるということだと思います。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

注:可変量でシフトできることを再確認する必要がありましたが、このリンクは有効であると述べsllvています。ただし、許可されている関数のリストにないためsll $t1, $t1, 1、ループで実行する必要があります。(シフトしたい量がゼロの場合に備えて、必ずループの開始時にチェックを入れてください!)

于 2013-11-04T22:07:28.383 に答える