rendered paste body
.data
.globl vec1
vec1:
.word 10, -100, 50000
.globl vec2
vec2:
.word 9, -300, -100
.globl vec3
vec3:
.word 0, -80000, 3
.globl vec4
vec4:
.word 4000, 300, 20, 1
.globl vec5
vec5:
.word 1, 70000
firstdot: .asciiz " <-- first_dot\n"
seconddot: .asciiz " <-- second_dot\n"
thirddot: .asciiz " <-- third_dot\n"
firstss: .asciiz " <-- first_ss\n"
secondss: .asciiz " <-- second_ss\n"
.text
.globl main
main:
#Appears as though I need 5 registers to store results
la $a0, vec1
la $a1, vec2
addi $a2, $zero, 3
jal dot_product
add $s0, $zero, $v0 # $s0 = first_dot
la $a0, vec1
la $a1, vec3
addi $a2, $zero, 3
jal dot_product
add $s1, $zero, $v0 # $s1 = second_dot
la $a0, vec1
la $a1, vec1
addi $a2, $zero, 3
jal dot_product
add $s2, $zero, $v0 # $s2 = third_dot
add $a0, $zero, $s0 # printing signed
addi $v0, $zero, 1
syscall
la $a0, firstdot
addi $v0, $zero, 4
syscall
add $a0, $zero, $s1
addi $v0, $zero, 1
syscall
la $a0, seconddot
addi $v0, $zero, 4
syscall
add $a0, $zero, $s2 # printing signed
addi $v0, $zero, 1
syscall
la $a0, thirddot
addi $v0, $zero, 4
syscall
la $a0, vec4
addi $a1, $zero, 4
jal sum_squares
add $s3, $zero, $v0
la $a0, vec5
addi $a1, $zero, 2
jal sum_squares
add $s4, $zero, $v0
add $a0, $zero, $s3
jal print_unsigned
la $a0, firstss
addi $v0, $zero, 4
syscall
add $a0, $zero, $s4
jal print_unsigned
la $a0, secondss
addi $v0, $zero, 4
syscall
jr $ra
.text
.globl dot_product
dot_product:
add $t0, $zero, $zero # $t0 will be reserved for i
add $t1, $zero, $zero # sum = 0;
for_loop:
slt $t5, $t0, $a2 # if i < n, break from loop
beq $t5, $zero, end_for
sll $t2, $t0, 2 # $t2 = 4*i
add $t3, $t2, $a0 # $t3 = &a[i]
add $t4, $t2, $a1 # $t4 = &b[0]
#add $t3, $t3, $t2 # $t3 = &a[i]
#add $t4, $t4, $t2 # $t4 = &b[i]
lw $t6, ($t3) # $t6 = a[i]
lw $t7, ($t4) # &t7 = b[i]
mult $t6, $t7 # HiLo = a[i] * b[i]
mflo $t8
add $t1, $t1, $t8 # sum = sum + a[i] * b[i]
addi $t0, $t0, 1 # i++
j for_loop
end_for:
add $v0, $zero, $t1 # return sum;
jr $ra
.text
.globl sum_squares
sum_squares:
add $t0, $zero, $zero # $t0 will be used for i
add $t1, $zero, $zero # sum = 0
for_loop1:
slt $t5, $t0, $a2 # if i < n, break from loop
beq $t5, $zero, end_for1
sll $t2, $t0, 2 # $t2 = 4*i
add $t3, $t2, $a0 # $t3 = &a[0]
#add $t3, $t3, $t2 # $t3 = &a[i]
lw $t6, ($t3) # $t6 = a[i]
mult $t6, $t6 # Same as a[i] * a[i]
mflo $t8
add $t1, $t1, $t8 # sum = sum + a[i] * b[i]
addi $t0, $t0, 1 # i++
j for_loop1
end_for1:
add $v0, $zero, $t1 # return sum;
jr $ra
# Printing command
.data
base_ten_digits:
.asciiz "0123456789"
.text
.globl print_unsigned
print_unsigned:
addiu $sp, $sp, -16 # space for saved $ra and an array of 12 chars
sw $ra, 12($sp)
sb $zero, 11($sp) # '\0' at end of string
bne $a0, $zero, pr_uns_nonzero # if (arg != 0) goto pr_uns_nonzero
addiu $t9, $zero, '0' # $t9 = ascii for '0'
sb $t9, 10($sp)
addiu $t0, $sp, 10 # $t0 points to start of 1-char string
j pr_uns_syscall
pr_uns_nonzero:
addiu $t0, $sp, 11 # $t0 points to end of string
addiu $t1, $zero, 10 # $t1 = 10
la $t2, base_ten_digits # $t2 = &base_ten_digits[0]
pr_uns_loop:
divu $a0, $t1
mfhi $t3 # $t3 = arg % 10
mflo $a0 # arg = arg / 10
addu $t8, $t2, $t3 # $t8 = &base_ten_digits[$t3]
lb $t7, ($t8) # $t7 = base_ten_digits[$t3]
addiu $t0, $t0, -1 # back up one char in string
sb $t7, ($t0) # *$t0 = base_ten_digits[$t3]
bne $a0, $zero, pr_uns_loop
pr_uns_syscall:
addu $a0, $t0, $zero # $a0 points to start of digit string
addiu $v0, $zero, 4
syscall # print string
lw $ra, 12($sp)
addiu $sp, $sp, 16
jr $ra