# MIPS Assembly Language

## Presentation on theme: "MIPS Assembly Language"— Presentation transcript:

MIPS Assembly Language
CPSC 321 Computer Architecture Andreas Klappenecker

lw \$s1, 8(\$s0) # \$s1 = Mem[\$s0+8] register \$s0 contains the base address access the address (\$s0) possibly add an offset 8(\$s0)

Branch instructions beqz \$s0, label if \$s0==0 goto label
bnez \$s0, label if \$s0!=0 goto label bge \$s0, \$s1, label if \$s0>=\$s1 goto label ble \$s0, \$s1, label if \$s0<=\$s1 goto label blt \$s0, \$s1, label if \$s0<\$s1 goto label beq \$s0, \$s1, label if \$s0==\$s1 goto label bgez \$s0, \$s1, label if \$s0>=0 goto label

Non-leaf procedures Suppose that a procedure procA calls another procedure jal procB Problem: jal stores return address of procedure procB and destroys return address of procedure procA Save \$ra and all necessary variables onto the stack, call procB, and retore

Stack 8(\$sp) 4(\$sp) 0(\$sp) The stack can be used for high address
parameter passing storing return addresses storing result variables stack pointer \$sp high address stack pointer \$sp --> low address \$sp = \$sp - 12

Factorial Compute n! Recall that Store on the stack 0! = 1 1! = 1
n! = n(n-1)! Store on the stack \$s0 = n, the parameter \$ra, the return address

factorial: bgtz \$a0, doit # if \$a0>0 goto generic case li \$v0, 1 # base case, 0! = 1 jr \$ra # return doit: sub \$sp,8 # make room for \$s0 and \$ra sw \$s0,(\$sp) # store argument \$s0=n sw \$ra,4(\$sp) # store return address move \$s0, \$a0 # save argument sub \$a0, 1 # factorial(n-1) jal factorial # v0 = (n-1)! mul \$v0,\$s0,\$v0 # n*(n-1)! lw \$s0,(\$sp) # restore \$s0=n lw \$ra,4(\$sp) # restore \$ra add \$sp,8 # reduce stack size jr \$ra # return

Fibonacci fib(0) = 0 fib(1) = 1 fib(n) = fib(n-1) + fib(n-2)
0, 1, 1, 2, 3, 5, 8, 13, 21,…

Fibonacci li \$a0, 10 # call fib(10) jal fib #
move \$s0, \$v0 # \$s0 = fib(10) fib is a recursive procedure with one argument \$a0 need to store argument \$a0, temporary register \$s0 for intermediate results, and return address \$ra

fib: subi \$sp,\$sp,12 # save registers on stack
sw \$a0, 0(\$sp) # save \$a0 = n sw \$s0, 4(\$sp) # save \$s0 sw \$ra, 8(\$sp) # save return address \$ra bgt \$a0,1, gen # if n>1 then goto generic case move \$v0,\$a # output = input if n=0 or n=1 j rreg # goto restore registers gen: subi \$a0,\$a0, # param = n-1 jal fib # compute fib(n-1) move \$s0,\$v # save fib(n-1) sub \$a0,\$a0, # set param to n-2 jal fib # and make recursive call add \$v0, \$v0, \$s # \$v0 = fib(n-2)+fib(n-1) rreg: lw \$a0, 0(\$sp) # restore registers from stack lw \$s0, 4(\$sp) # lw \$ra, 8(\$sp) # addi \$sp, \$sp, # decrease the stack size jr \$ra

Practice, practice, practice!!!
Read Chapter 3 and Appendix A Write many programs and test them Get a thorough understanding of all assembly instructions Study the register conventions carefully