All pastes #932093 Raw Edit

spim code for brian

public text v1 · immutable
·published 2008-03-07 14:18 UTC
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