2016-09-13 6 views
0

MIPSで奇数の正の整数の合計を計算するにはどうすればよいですか?私は自宅でMIPSシミュレータを持っており、私は自分の仕事を確認するのに役立つために予約しています。私の大学には、外部企業が提供するハードウェアを備えたコンピュータラボがあります。私が考えているのは、大学がクラスを通って学生にハードウェアを「出す」ということです。私が問題にしているのは、学校でボードを使用している間にコードが正常に動作していることを確認したいが、自宅でコードが動作することを確認するのが簡単なようだ。とにかく、このコードは次のように表示されるはずです:MIPSで奇数の正の整数の合計を計算するにはどうすればよいですか?

andi $t8, $s0, 1 #value from $s0 and add 1 to it. Place in $t8 register 
bnez $t8 #This should determine if its odd 
beqz $79 #This should determine if its even 
even: 
    addi $t7, $t8, -1 
    bnez $t7, odd 
odd: 
    addi $t6, $t7, -2 
    Rt6, loop 

これは簡単な方法はありますか?私は実行の最後にv0 = 11000の間の奇数の正の整数の合計を実行するメインルーチンを書く必要があります。この場合、$t8は私の$v0です。有益な提案は非常に詳しく検討されます。

+0

どのアセンブラを使用していますか?コードの多くは私には意味がありません。 「beqz $ 79」とは何ですか? 'Rt6、loop'はどうですか? '$ t8'が和を保持すると仮定すると、なぜそれを' andi $ t8、$ s0、1'のデスティネーションオペランドとして使うのですか? – Michael

+0

ええ、私は自分が何をしているのか分かりません。私は自宅でQtspimを使用します。私は1から1000までのすべての正の整数を加算するコードを書く方法を理解しようとしています。 – Jeremiah

+0

'int sum = 0; for(int i = 1; i <= 1000; i ++)if(i&1)sum + = i; 'そういうもの。手作業でMIPSアセンブリに転写するのに十分なはずです。ループは 'for(int i = 1; i <= 1000; i + = 2)sum + = i;' – Michael

答えて

0

奇数の偶数の両方の合計を行う注釈付きコードがあります。サブルーチンの例もあります。

.data 
array: 
    .word 17767, 9158, 39017, 18547 
    .word 56401, 23807, 37962, 22764 
    .word 7977, 31949, 22714, 55211 
    .word 16882, 7931, 43491, 57670 
    .word 124, 25282, 2132, 10232 
    .word 8987, 59880, 52711, 17293 
    .word 3958, 9562, 63790, 29283 
    .word 49715, 55199, 50377, 1946 
    .word 64358, 23858, 20493, 55223 
    .word 47665, 58456, 12451, 55642 
arrend: 

msg_odd: .asciiz  "The sum of the odd numbers is: " 
msg_even: .asciiz  "The sum of the even numbers is: " 
msg_nl:  .asciiz  "\n" 

    .text 
    .globl main 
# main -- main program 
# 
# registers: 
# t0 -- even sum 
# t1 -- odd sum 
# t2 -- current array value 
# t3 -- isolation for even/odd bit 
# t6 -- array pointer 
# t7 -- array end pointer 
main: 
    li  $t0,0     # zero out even sum 
    li  $t1,0     # zero out odd sum 
    la  $t6,array    # address of array start 
    la  $t7,arrend    # address of array end 

main_loop: 
    bge  $t6,$t7,main_done  # are we done? if yes, fly 

    lw  $t2,0($t6)    # get value 
    addiu $t6,$t6,4    # point to next array element 

    andi $t3,$t2,1    # isolate LSB 
    beqz $t3,main_even   # is is even? if yes, fly 

    add  $t1,$t1,$t2    # add to odd sum 
    j  main_loop 

main_even: 
    add  $t0,$t0,$t2    # add to even sum 
    j  main_loop 

main_done: 
    # output the even sum 
    la  $a0,msg_even 
    move $a1,$t0 
    jal  print 

    # output the odd sum 
    la  $a0,msg_odd 
    move $a1,$t1 
    jal  print 

    # terminate program 
    li  $v0,10 
    syscall 

# print -- output a number 
# 
# arguments: 
# a0 -- pointer to message 
# a1 -- number to output 
print: 
    # output the message 
    la  $v0,4 
    syscall 

    # output the number 
    li  $v0,1 
    move $a0,$a1 
    syscall 

    # output a newline 
    la  $a0,msg_nl 
    li  $v0,4 
    syscall 

    jr  $ra      # return 

あなたが私の答えを参照、私自身の経験に基づいて、きれいなASMの記述に関するいくつかのヒントが欲しい場合:私はspimQtSpim、およびシミュレータのためのmarsを使用しましたMIPS linked list

を。個人的には、可能であればmarsが好きです。参照:http://courses.missouristate.edu/KenVollmar/mars/

関連する問題