There are two uploads for this homework.

- By 11:00 PM on 6 November, upload with a compressed (ZIP or tar.gz) copy of the MPLABX project you are using to work on this project to the Homework 10A moodle drop off.
- By 11:00 PM on 16 November, upload your PIC32 assembly solution file bubblepass.s to the Homework 10B moodle drop off.

And then there is the hints page.

## The Problem

This is your one-and-only assembly language programming project. Write a function that completes one pass of the notorious bubble sort. The function returns the number of elements that were swapped during the pass.

#include "bubblepass.h" int bubblePass(int V[], int n) { int i ; int swappedCount = 0 ; for (i=0; i < n-1; ++i) { if (V[i] > V[i+1]) { int tmpSwapVar; tmpSwapVar = V[i] ; V[i] = V[i+1] ; V[i+1] = tmpSwapVar ; swappedCount++ ; } } return swappedCount ; }

## Testing

You can test your routine using the following main routine.

#include <stdio.h> #include <stdlib.h> #include "bubblepass.h" void bubbleSort(int *V, int n) { int num2Sort = n ; while (bubblePass(V, num2Sort)) { --num2Sort ; } } void printSorted(int *V, int n) { int i ; int sorted = 1 ; char *ans ; for (i=0; i<n; ++i) { printf(" [%2d] is %6d\n", i, V[i]) ; } for (i=0; i<n-1 && sorted; ++i) { sorted = sorted && V[i] < V[i+1] ; } if (sorted) { printf("Sorted!\n") ; } else { printf("Unsorted!!!!!!\n") ; } } int main(int argc, char** argv) { int U[] = {255, -3, 5, 70, -101, 30 } ; int V[] = {} ; int L[] = {2, 3, 5, 7, 11, 13, 17, 19, 23} ; int N[] = {-2, -3, -5, -7, -11, -13, -17, -19, -23} ; bubbleSort(U, sizeof U/sizeof(int)) ; printSorted(U, sizeof U/sizeof(int)) ; bubbleSort(V, 0) ; printSorted(V, 0) ; bubbleSort(L, sizeof L/sizeof(int)) ; printSorted(L, sizeof L/sizeof(int)) ; bubbleSort(N, sizeof N/sizeof(int)) ; printSorted(N, sizeof N/sizeof(int)) ; return (EXIT_SUCCESS); }

Use following prototype to compile the main routine. Save it in the file bubblepass.h.

#ifndef BUBBLEPASS_H #define BUBBLEPASS_H int bubblePass(int *, int) ; #endif /* BUBBLEPASS_H /*

## Getting started

You can download a an incomplete project for MPLAB X to get started (and thus ignore all of that information above about how to set up the project). It has a file bubblepass.s that is the start of the MIPS assembly code.

If you would like to see how it runs in C, you can download a working C implementation as a NetBeans project to check your results.

## How hard is this?

Well, not that hard, but you do need to be careful.
First of all, since this is a *leaf* procedure, you don’t
need to implement a stack frame.

My initial implementation used 23 instructions. Two of those were the
return instructions

` jr $ra`

` nop`

There were also three other `nop`

instructions.
That’s only 18 non-`nop`

instructions.

You can get the implementation down to 18 instructions with two
`nop`

instructions. But that requires a little more work.

## Hints

Every few days, I will post hints on the Homework 10 hints page.

Read these to keep on schedule.