CS260-010 – Assembly Language Programming (Spring 2015)
Overview
This document encompasses 3 projects which will all be due at the same time, but will be graded independently. You will have until the last day of classes to complete and hand in the code. You may hand in individual files for each part, or a single file that implements all 3 at your discression.
Part 1 Procedures
Convert your existing multiply and divide functions (or use the reference solutions provided on Sakai) into procedures that take arguments and return a value. You may either use the stack to store your arguments and return values like a compiler would, or just use registers to store the inputs and outputs. Your program should first multiply, then divide the two integers, storing the result in two different registers.
Part 2 Output
Extend part 1 by adding output to your program. Instead of just storing the results as a register, display the results to the user. (i.e. 4×2=8, 4/2=2)
Part 3 Input and selection
Modify your program again to take input from the user. Ask the user for two integers and use those as inputs to the multiply and divide procedures
Resources
A discussion of I/O for SPIM can be found here.
http://www.cs.uni.edu/~fienup/cs041f05/lectures/lec17_10-18-05_SPIM_IO.pdf
以下是 part1 括号 提到的 reference solution.text
.globl main
main: li $a0, 10 # Dividend
lui $a1, 7 # Divisor
li $t0, 0x8000 li $t1, 0
lui $s0, 0xffff
lui $t2, 0x8000
intro_loop:
and $a2, $t0, $a0
beq $a2, $t0, Division_loopbeq $a2, 0, Division_shift
Division_shift:
sll $a0, $a0, 1
#Find the significant bit to be 1
addi $t1, $t1, 1j intro_loop
Division_loop:
subu $a0, $a0, $a1
and $a2, $a0, $t2
beq $a2, $t2, Division_undo
beq $a2, $zero, Division_do_subtract
Division_undo:
add $a0, $a0, $a1
sll $a0, $a0, 1
addi $t1, $t1, 1
beq $t1, 16, Division_endj Division_loop
Division_do_subtract:
addi $a0, $a0,1
beq $t1, 16, Division_endj Division_loop
Division_end:
and $a2, $a0, $s0
bge $a2, $a1, LastCheckj endFn
LastCheck:
subu $a0, $a0, $a1addi $a0, $a0, 1
endFn: