奇数との偶数の両方の合計を行う注釈付きコードがあります。サブルーチンの例もあります。
.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の記述に関するいくつかのヒントが欲しい場合:私はspim
、QtSpim
、およびシミュレータのためのmars
を使用しましたMIPS linked list
を。個人的には、可能であればmars
が好きです。参照:http://courses.missouristate.edu/KenVollmar/mars/
どのアセンブラを使用していますか?コードの多くは私には意味がありません。 「beqz $ 79」とは何ですか? 'Rt6、loop'はどうですか? '$ t8'が和を保持すると仮定すると、なぜそれを' andi $ t8、$ s0、1'のデスティネーションオペランドとして使うのですか? – Michael
ええ、私は自分が何をしているのか分かりません。私は自宅でQtspimを使用します。私は1から1000までのすべての正の整数を加算するコードを書く方法を理解しようとしています。 – Jeremiah
'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