2013-11-04 98 views
0

我正在用MIPS編寫這個程序來計算2給我給出的功率,並將順序功率降爲0.例如,如果我把$ 4放在$ a0中,就像下面的代碼一樣,我想要它計算應該出來的(4^2)+(3^2)+(2^2)+(1^2)。它應該在它達到零之前停止。這是我至今寫在MIPS中寫入迭代

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次方,因爲我猜測沒有能量操作。在這個過程中,我只能使用add,sub和,或者slt,addi,j,beq,lw,sw和sll。使用sub時,你不能使用常量嗎?謝謝你的幫助

回答

1

功率是一個乘法,乘法是一個和。所以你可以編寫一個函數,通過加法來進行乘法運算,而另一個函數通過乘法來實現乘法運算。例如,乘法功能:

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指令爲好,但我不知道你是否已經看到了。

0

我認爲你的老師試圖向你展示的概念是sll實際上乘以2.你必須用二進制來思考。例如,讓我們從1開始:

0000 0000 0000 0000 0000 0000 0000 0001 

對此做一個'sll',你最終會得到什麼? 0010 = 2. sll再次,你得到0100 = 4。等等,直到你完全移動並有0x80000000

所以對於這個問題的答案是「我將如何爲k的權力帶來2?」,比你想象的要簡單:你換1 k

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

注:我不得不仔細檢查,您可以通過一個可變的移動量,但this link說:sllv是有效的。但是,由於它不在允許的函數列表中,所以您必須在循環中執行sll $t1, $t1, 1。 (請務必在循環開始時進行檢查,以防您想移動的數量爲零!)

+0

2的冪與2相乘的效果不一樣;) – m0skit0

+0

@ m0skit0 orly? 2 * 2 * 2 <> 2^3? – RobertB

+0

夥計,看完這個問題:*「我想要它計算(4^2)+(3^2)+(2^2)+(1^2)」*現在請使用移位計算3^2。 – m0skit0