.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