Week 05 Laboratory Exercises
Objectives
- understanding how array indices are calculated
- practicing using MIPS control instructions (branch)
- learning how MIPS memory access works (lw/sw)
- practicing running MIPS programs with spim, xspim or qtspim
Preparation
Before the lab you should re-read the relevant lecture slides and their accompanying examples.
Getting Started
Create a new directory for this lab called lab05
,
change to this directory, and fetch the provided code for this week
by running these commands:
mkdir lab05 cd lab05 1521 fetch lab05
Or, if you're not working on CSE, you can download the provided code as a zip file or a tar file.
Exercise — in pairs:
Bigger MIPS
In the files for this lab, you have been given
print_bigger.s
, a MIPS assembler program that reads 10 numbers and then prints
them:
cat numbers1.txt 12086 24363 47363 64268 34001 6800 60742 48867 26002 54999 1521 spim -f print_bigger.s <numbers1.txt Loaded: /home/cs1521/share/spim/exceptions.s 12086 24363 47363 64268 34001 6800 60742 48867 26002 54999
Add code to print_bigger.s
to make it equivalent to this C program:
// Read 10 numbers into an array
// then print the numbers which are
// larger than the last number read.
#include <stdio.h>
int main(void) {
int i, last_number;
int numbers[10] = { 0 };
i = 0;
while (i < 10) {
scanf("%d", &numbers[i]);
last_number = numbers[i];
i++;
}
i = 0;
while (i < 10) {
if (numbers[i] >= last_number) {
printf("%d\n", numbers[i]);
}
i++;
}
}
For example:
1521 spim -f print_bigger.s <numbers1.txt Loaded: /home/cs1521/share/spim/exceptions.s 64268 60742 54999 cat numbers2.txt 53906 9064 40906 4504 4774 7892 15334 45515 55387 5681 1521 spim -f print_bigger.s <numbers2.txt Loaded: /home/cs1521/share/spim/exceptions.s 53906 9064 40906 7892 15334 45515 55387 5681
When you think your program is working, you can use
autotest
to run some simple automated tests:
1521 autotest print_bigger
When you are finished working on this exercise, you and your lab
partner must both submit your work by running give
:
give cs1521 lab05_print_bigger print_bigger.s
Note, even though this is a pair exercise, you both must run
give
from your own account before
Wednesday 01 January 00:00
to obtain the marks for this lab exercise.
Exercise — in pairs:
MIPS Order Checking
In the files for this lab, you have been given
unordered.s
, a MIPS assembler program that reads 10 numbers and then prints
42:
Add code to unordered.s
to make it equivalent to this C program:
// Read 10 numbers into an array
// print 0 if they are in non-decreasing order
// print 1 otherwise
#include <stdio.h>
int main(void) {
int i;
int numbers[10] = { 0 };
i = 0;
while (i < 10) {
scanf("%d", &numbers[i]);
i++;
}
int swapped = 0;
i = 1;
while (i < 10) {
int x = numbers[i];
int y = numbers[i - 1];
if (x < y) {
swapped = 1;
}
i++;
}
printf("%d\n", swapped);
}
For example:
cat numbers1.txt 12086 24363 47363 64268 34001 6800 60742 48867 26002 54999 1521 spim -f unordered.s <numbers1.txt Loaded: /home/cs1521/share/spim/exceptions.s 1 cat sorted.txt 1 2 3 4 5 6 7 8 9 10 1521 spim -f unordered.s <sorted.txt Loaded: /home/cs1521/share/spim/exceptions.s 0
When you think your program is working, you can use
autotest
to run some simple automated tests:
1521 autotest unordered
When you are finished working on this exercise, you and your lab
partner must both submit your work by running give
:
give cs1521 lab05_unordered unordered.s
Note, even though this is a pair exercise, you both must run
give
from your own account before
Wednesday 01 January 00:00
to obtain the marks for this lab exercise.
Exercise — in pairs:
MIPS Swapping
In the files for this lab, you have been given
swap_numbers.s
, a MIPS assembler program that reads 10 numbers and then prints
them:
Add code to swap_numbers.s
to make it equivalent to this C program:
// Read 10 numbers into an array
// swap any pair of numbers which are out of order
// then print the array
#include <stdio.h>
int main(void) {
int i;
int numbers[10] = { 0 };
i = 0;
while (i < 10) {
scanf("%d", &numbers[i]);
i++;
}
i = 1;
while (i < 10) {
int x = numbers[i];
int y = numbers[i - 1];
if (x < y) {
numbers[i] = y;
numbers[i - 1] = x;
}
i++;
}
i = 0;
while (i < 10) {
printf("%d\n", numbers[i]);
i++;
}
}
For example:
1521 spim -f swap_numbers.s <numbers1.txt Loaded: /home/cs1521/share/spim/exceptions.s 12086 24363 47363 34001 6800 60742 48867 26002 54999 64268 1521 spim -f swap_numbers.s <numbers2.txt Loaded: /home/cs1521/share/spim/exceptions.s 9064 40906 4504 4774 7892 15334 45515 53906 5681 55387
When you think your program is working, you can use
autotest
to run some simple automated tests:
1521 autotest swap_numbers
When you are finished working on this exercise, you and your lab
partner must both submit your work by running give
:
give cs1521 lab05_swap_numbers swap_numbers.s
Note, even though this is a pair exercise, you both must run
give
from your own account before
Wednesday 01 January 00:00
to obtain the marks for this lab exercise.
Exercise — in pairs:
MIPS Bubbles
In the files for this lab, you have been given
bubblesort.s
, a MIPS assembler program that reads 10 numbers and then prints
them:
Add code to bubblesort.s
to make it equivalent to this C program:
// Read 10 numbers into an array
// bubblesort them
// then print them
#include <stdio.h>
int main(void) {
int i;
int numbers[10] = { 0 };
i = 0;
while (i < 10) {
scanf("%d", &numbers[i]);
i++;
}
int swapped = 1;
while (swapped) {
swapped = 0;
i = 1;
while (i < 10) {
int x = numbers[i];
int y = numbers[i - 1];
if (x < y) {
numbers[i] = y;
numbers[i - 1] = x;
swapped = 1;
}
i++;
}
}
i = 0;
while (i < 10) {
printf("%d\n", numbers[i]);
i++;
}
}
For example:
1521 spim -f bubblesort.s <numbers1.txt Loaded: /home/cs1521/share/spim/exceptions.s 6800 12086 24363 26002 34001 47363 48867 54999 60742 64268 1521 spim -f bubblesort.s <numbers2.txt Loaded: /home/cs1521/share/spim/exceptions.s 4504 4774 5681 7892 9064 15334 40906 45515 53906 55387
When you think your program is working, you can use
autotest
to run some simple automated tests:
1521 autotest bubblesort
When you are finished working on this exercise, you and your lab
partner must both submit your work by running give
:
give cs1521 lab05_bubblesort bubblesort.s
Note, even though this is a pair exercise, you both must run
give
from your own account before
Wednesday 01 January 00:00
to obtain the marks for this lab exercise.
Challenge Exercise — individual:
MIPS NUXI
We have two 32 bit values which the bytes have placed in an unknown order.
Fortunately we know the 4 bytes of the first value contains the ASCII values "UNIX"
Write a MIPS program nuxi.s which read the two values and prints the second value with its bytes correctly ordered.
For example:
1521 spim -f nuxi.s Loaded: /home/cs1521/share/spim/exceptions.s 1481199189 -2023406815 -2023406815 1521 spim -f nuxi.s Loaded: /home/cs1521/share/spim/exceptions.s 1431193944 -2023406815 558065031 1521 spim -f nuxi.s Loaded: /home/cs1521/share/spim/exceptions.s 1230525774 -559038737 -1377898562 1521 spim -f nuxi.s Loaded: /home/cs1521/share/spim/exceptions.s 1229871189 305419896 878056056
When you think your program is working, you can use
autotest
to run some simple automated tests:
1521 autotest nuxi
When you are finished working on this exercise, you must submit your
work by running give
:
give cs1521 lab05_nuxi nuxi.s
You must run give
before Wednesday 01 January 00:00 to obtain the
marks for this lab exercise. Note that this is an individual
exercise, the work you submit with give
must be
entirely your own.
Submission
give
.
You can run give
multiple times. Only your last
submission will be marked.
Don't submit any exercises you haven't attempted.
If you are working at home, you may find it more convenient to upload your work via give's web interface.
Remember you have until Wednesday 01 January 00:00 to submit your work.
You cannot obtain marks by e-mailing your code to tutors or lecturers.
You check the files you have submitted here.
Automarking will be run by the lecturer several days after the
submission deadline, using test cases different to those
autotest
runs for you. (Hint: do your own testing as
well as runningautotest
.)
After automarking is run by the lecturer you can view your results here. The resulting mark will also be available via give's web interface.
Lab Marks
When all components of a lab are automarked you should be able to view the the marks via give's web interface or by running this command on a CSE machine:
1521 classrun -sturec