Exercises
These are the implementations of the exercises presentend in course's slides and notations.
; pdf 3 slide 10
.data
.text
li $s0, 2 #; a = 2
li $s1, 5 #; b = 5
li $s2, 9 #; c = 9
li $s3, 4 #; d = 4
li $s4, 12 #; e = 12
#; a = ( b - c ) + ( d - e )
sub $t0, $s1, $s2 #; t0 = b - c
sub $t1, $s3, $s4 #; t1 = d - e
add $s0, $t0, $t1 #; s0 = t0 + t1
; pdf 3 slide 11
.data
variable: 10
vector: .word 12, 4, 59, 9, 19, 8, 6, 18, 9, 19, 28, 12, 100
.text
la $s6, variable #; s6 = address of variable
la $s5, vector #; s5 = address of vector
#; vector[12] = vector[6] + variable
lw $t0, ($s6) #; t0 = *s6 (value at address s6, which is the value of the variable)
lw $t1, 24($s5) #; t1 = s5[6] ; s5[6] = *(s5 + 6), but 6 rappresents words, not bytes, so 6 * 4 = 24 (which corresponds to vector[6])
add $t0, $t0, $t1 #; t0 += t1 (which is vector[5])
sw $t0, 48($s5) #; stores result of sum (from t0) to vector[12], but 12 is words, so 48 is bytes
; pdf 3 slide 17
.data
.text
li $s0, 1 #; u = 1
li $s1, 0 #; v = 0
#; v = u * 256
sll $s1, $s0, 8 #; s1 = s0 * 256
#; which is the first value that breaks?
#; a word ha 32 bits, multiplying by 256 means shifting by 8 bits
#; this means that as soon as we have the 25 bit set to 1, the 1 is shifted out of 32
#; 2^24 = 16777216
li $s2, 16777216 #; 16777215 will work normally
sll $s0, $s2, 8 #; becomes 0
; pdf 4 slide 34
.data
vector: .word 11, 35, 2, 7, 29, 95
size: .word 6
.text
#; find max value in vector
la $t0, vector #; t0 = current address
la $t1, vector #; t1 = end of vector
la $t2, size #; t2 = address of vector size
lw $t2, ($t2) #; t2 = vector size
sll, $t2, $t2, 2 #; t2 *= 4, to accomodate words
add $t1, $t1, $t2 #; t1 = end of vector + vector size
lw $t2, ($t0) #; t2 = max value
for:
bgt $t0, $t1, endFor #; if current address > end of vector, end for
lw $t3, ($t0) #; load value from current address
ble $t3, $t2, elseSmaller #; if current value <= max value, continue
ifBigger:
move $t2, $t3 #; max value = current value
elseSmaller:
addi $t0, $t0, 4 #; current address = next address
j for #; repeat cycle
endFor:
; pdf 4 slide 35
.data
vector: .word 4, -1, 5, 500, 0, 10000, -256
size: .word 5
sums: .word 0, 0
.text
#; find max value in vector
la $t0, vector #; t0 = current address
la $t1, vector #; t1 = end of vector
la $t2, size #; t2 = address of vector size
lw $t2, ($t2) #; t2 = vector size
sll, $t2, $t2, 2 #; t2 *= 4, to accomodate words
add $t1, $t1, $t2 #; t1 = end of vector + vector size
li $t2, 0 #; t2 = parity
li $t4, 0 #; t4 = even
li $t5, 0 #; t5 = odd
for:
bgt $t0, $t1, endFor #; if current address > end of vector, end for
lw $t3, ($t0) #; load value from current address
beq $t2, 1, ifIsOdd #; check if current parity is odd
ifIsEven:
add $t4, $t4, $t3 #; even += current value
li $t2, 1 #; parity = odd
j nextIteration
ifIsOdd:
add $t5, $t5, $t3 #; odd += current value
li $t2, 0 #; parity = even
nextIteration:
addi $t0, $t0, 4 #; current address = next address
j for #; repeat cycle
endFor:
la $t6, sums #; t6 = address of the result
sw $t4, ($t6) #; t6[0] = even
sw $t5, 4($t6) #; t6[1] = odd; 4 is used instead of 1 because a word is 4 bytes long
; pdf 5 slide 10
.data
vector: .byte 1, 2, 3, 4
.text
#; the vector corresponds to the word 0x04030201
#; which basically is 4, 3, 2, 1
#; as it's rappresented in memory using little-endian
; pdf 6 slide 7
.globl main
.data
matrix: .word 2, -10, -10, -10, 2, -10, -10, -10, 2
length: .word 3
.text
main:
la $t0, matrix #; t0: matrix_address = matrix
la $t1, length #; t1: matrix_length_address = length
lw $t1, ($t1) #; t1: matrix_length = *length
move $t2, $t1 #; t2: jumps_to_do = matrix_length (to count how many jumps are needed to reach the end)
addi $t1, $t1, 1 #; t1: jump_length = matrix_length += 1 (to jump to next diagonal cell)
sll $t1, $t1, 2 #; t1: jump_length = jump_length * 4 (because words are 4 bytes long)
li $t3, 0 #; t3: sum = 0
while:
beq $t2, 0, end #; if jumps_to_do == 0 { end loop }
lw $t4, ($t0) #; t4: value = *matrix_address
add $t3, $t3, $t4 #; sum += value
subi $t2, $t2, 1 #; jumps_to_do -= 1
add $t0, $t0, $t1 #; matrix_address = matrix_address = jump_length
j while
end:
print:
li $v0, 1 #; print integer
move $a0, $t3 #; integer = sum
syscall
return:
li $v0, 17 #; exit
li $a0, 0 #; result = 0
syscall
; pdf 7 slide 22
.globl main
.data
.text
main:
li $a0, 5
li $a1, -3
li $a2, 9
li $a3, 2
jal avgOfSquareAbsSub
print:
move $a0, $v0 #; integer = formula
li $v0, 1 #; print integer
syscall
return:
li $v0, 17 #; exit
li $a0, 0 #; result = 0
syscall
avgOfSquareAbsSub:
subi $sp, $sp, 8 #; ra, first result
sw $ra, ($sp)
jal squareAbsSub #; x, y
sw $v0, 4($sp) #; t0: first = (|x|-|y|)^2
move $a0, $a2
move $a1, $a3
jal squareAbsSub #; w, z
move $t1, $v0 #; t1: second = (|w|-|z|)^2
lw $t0, 4($sp) #; t0: first = (|x|-|y|)^2
add $t0, $t0, $t1 #; first += second
srl $v0, $t0, 1 #; numerator /= 2
returnAvg:
lw $ra, ($sp)
addi $sp, $sp, 8
jr $ra
squareAbsSub:
subi $sp, $sp, 4 #; ra
sw $ra, ($sp)
jal abs #; |x|
move $t0, $v0 #; t0: abs_x = |x|
move $a0, $a1 #; number = y
jal abs #; |y|
move $t1, $v0 #; t1: abs_y = |y|
sub $t0, $t0, $t1 #; difference = |x| - |y|
mul $v0, $t0, $t0 #; result = (|x| - |y|)^2
returnSub:
lw $ra, ($sp)
addi $sp, $sp, 4
jr $ra
abs:
bge $a0, 0, returnAbs #; if number >= 0, return
ca2:
nor $a0, $a0, $zero #; number = bitwise not of number
addi $a0, $a0, 1 #; number += 1
returnAbs:
move $v0, $a0 #; result = |number|
jr $ra