CptS 260 Assignment 4
Assigned: Sept. 24, 2007
Due: Oct. 5, 2007, 11:59:59 PM
Turning in your assignment
When finished, submit your file named four.asm using the
the
Project turn-in link
at the left side of the CptS 260 web pages. (Click the link and
follow the directions.) You may turn in the assignment as many times as you like
before the deadline. Only the last will be graded.
The problem: recursive quicksort of a list of numbers
For this problem you will write two functions plus a main routine
to test them. The two functions are
readnums
and
sort
.
Function readnums
takes two arguments: in $a0
the maximum
number of numbers to read and in $a1
the address of a buffer to
hold the numbers. readnums
should assume that the buffer address is a multiple
of 4. readnums
repeatledly uses the sys
instruction to read a
number from the keyboard, stopping when either the buffer is full (the maximum number
of items specified in $a0
have been placed in it), OR the number 0 is entered. When
the number 0 is entered it is NOT placed in the buffer. readnums
returns the
number of entries it placed in the buffer in $v0
. Be sure that readnums
can handle the cases that $a0
is initially 0 and that the user enters 0 as the first
number. In both cases it must return 0 in $v0
. Properly designed code will NOT
need to treat these two cases specially.
Function sort
takes two arguments as well. For this function $a0
is the number entries (4-byte, two's complement numbers) in the buffer pointed to by
$a1
. sort
rearranges the entries in the buffer so that they
appear in increasing order.
You are to implement sort
using the recursive quicksort
algorithm with in-place partitioning.
If you don't remember this from CptS 122, look it up! You should test your
code, at a minimum, on the following cases: $a0==0
, $a0==1
,
input buffer already sorted in increasing order, input buffer sorted in decreasing order.
(To save time in testing you may want to set up some buffers in the .data segment
that contain your test cases so you don't have to repeatedly type in a lot of numbers.)
Your main
function should contain calls to readnums
and sort
to thoroughly test them. We will look at your tests and also apply tests of our own to your
readnums
and sort
functions. Make sure that you preserve all
callee-save registers and that your functions do not write anything in the data segment outside the
buffer provided as a parameter.
Design your code by writing high-level pseudo-code first. Include the pseudo-code as
comments at the heads
of the functions in your program file. Of course, also include comments on the assembler code itself.
The hardest part of this assignment is the in-place partioning step (and even that is not
too bad). Don't try to be fancy in your choice of pivot elements -- using the first array element
is perfectly acceptable in this assignment even though it is not ideal in practice.