Week 03 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 mipsy and mipsy-web
Preparation
Before the lab you should re-read the relevant lecture slides and their accompanying examples.
Getting Started
lab03
and changing to this directory.
mkdir lab03 cd lab03
There are some provided files for this lab which you can fetch with this command:
1521 fetch lab03
If you're not working at CSE, you can download the provided files as a zip file or a tar file.
Exercise — individual:
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 mipsy print_bigger.s <numbers1.txt 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 final number read.
#include <stdio.h>
#define ARRAY_LEN 10
int main(void) {
int i, final_number;
int numbers[ARRAY_LEN] = { 0 };
i = 0;
while (i < ARRAY_LEN) {
scanf("%d", &numbers[i]);
final_number = numbers[i];
i++;
}
i = 0;
while (i < ARRAY_LEN) {
if (numbers[i] >= final_number) {
printf("%d\n", numbers[i]);
}
i++;
}
}
For example:
1521 mipsy print_bigger.s <numbers1.txt 64268 60742 54999 cat numbers2.txt 53906 9064 40906 4504 4774 7892 15334 45515 55387 5681 1521 mipsy print_bigger.s <numbers2.txt 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 must
submit your work by running give
:
give cs1521 lab03_print_bigger print_bigger.s
You must run give
before Monday 04 March 12:00 (midday) (2024-03-04 12: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.
Exercise — individual:
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>
#define ARRAY_LEN 10
int main(void) {
int i;
int numbers[ARRAY_LEN] = { 0 };
i = 0;
while (i < ARRAY_LEN) {
scanf("%d", &numbers[i]);
i++;
}
int swapped = 0;
i = 1;
while (i < ARRAY_LEN) {
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 mipsy unordered.s <numbers1.txt 1 cat sorted.txt 1 2 3 4 5 6 7 8 9 10 1521 mipsy unordered.s <sorted.txt 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 must
submit your work by running give
:
give cs1521 lab03_unordered unordered.s
You must run give
before Monday 04 March 12:00 (midday) (2024-03-04 12: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.
Exercise — individual:
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>
#define ARRAY_LEN 10
int main(void) {
int i;
int numbers[ARRAY_LEN] = { 0 };
i = 0;
while (i < ARRAY_LEN) {
scanf("%d", &numbers[i]);
i++;
}
i = 1;
while (i < ARRAY_LEN) {
int x = numbers[i];
int y = numbers[i - 1];
if (x < y) {
numbers[i] = y;
numbers[i - 1] = x;
}
i++;
}
i = 0;
while (i < ARRAY_LEN) {
printf("%d\n", numbers[i]);
i++;
}
}
For example:
1521 mipsy swap_numbers.s <numbers1.txt 12086 24363 47363 34001 6800 60742 48867 26002 54999 64268 1521 mipsy swap_numbers.s <numbers2.txt 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 must
submit your work by running give
:
give cs1521 lab03_swap_numbers swap_numbers.s
You must run give
before Monday 04 March 12:00 (midday) (2024-03-04 12: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.
Challenge Exercise — individual:
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:
// Reads 10 numbers into an array, bubblesorts them
// and then prints the 10 numbers
// then print them
#include <stdio.h>
#define ARRAY_LEN 10
int main(void) {
int i;
int numbers[ARRAY_LEN] = { 0 };
i = 0;
while (i < ARRAY_LEN) {
scanf("%d", &numbers[i]);
i++;
}
int swapped = 1;
while (swapped) {
swapped = 0;
i = 1;
while (i < ARRAY_LEN) {
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 < ARRAY_LEN) {
printf("%d\n", numbers[i]);
i++;
}
}
For example:
1521 mipsy bubblesort.s <numbers1.txt 6800 12086 24363 26002 34001 47363 48867 54999 60742 64268 1521 mipsy bubblesort.s <numbers2.txt 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 must
submit your work by running give
:
give cs1521 lab03_bubblesort bubblesort.s
You must run give
before Monday 04 March 12:00 (midday) (2024-03-04 12: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.
Challenge Exercise — individual:
Reversing MIPS
In most of the previous lab exercises involving MIPS assembly you have
been given a C program and your task has been to write an equivalent
MIPS assembly program. In this challenge exercise you will do the
opposite: you have been given a MIPS program
unmips.s
,
and you must write an equivalent C program in unmips.c
.
Deciphering the behaviour of an assembly program can be a very useful skill in a variety of situations, such as during reverse engineering, when examining compiler output, or when attempting to exploit certain security vulnerabilities.
unmips.s
does not have any comments, and its label names are
extremely bad. This is typical of compiler output and the output of
disassemblers,
and hopefully also demonstrates the importance of good style in human
written assembly.
You may assume that the input to unmips.c
will consist of three lines (with
each line followed by a newline character):
- The first line will consist of 70 characters, each either a
0
or1
. - The second line will be a positive integer less than 1000.
- The third line will be an integer greater than or equal to 0 and less than 1000.
For example:
make unmips ./unmips 0111011110000111111100001101001111111101110011101100101000011001101011 22 22 @ @ @ @ @ @@@ @@ @@@ @@ @ @@ @ @@ @@@@@@ @@@@@@ @ @ @ @ @ @@@@@ @ @@@ @ @ @ @ @@ @@@ @@@@@@ @@@ @ @@@ @ @@@ @@@ @@@ @@@ @ @ @ @@ @ @@@ @ @ @@@ @ @@ @ @ @ @@@ @@@ @@@ @ @ @@@@ @ @@@ @@@@ @@ @ @ @@@@@@ @@@ @ @ @ @ @ @ @@@@@ @ @@ @ @@@@ @ @ @@ @@@@@@ @@@@@@ @@@@ @ @@ @ @@@ @ @ @@@ @@@ @ @ @@@ @ @ @@@ @ @ @@@ @@@ @ @@@@ @@@ @ @@@@ @ @@@ @@ @ @@ @ @@@ @ @ @ @@ @ @ @@@ @ @@ @ @ @@ @ @@@ @@@ @@@ @ @@@@ @@@@ @@ @@@@ @ @@@ @ @@ @ @ @@@@@ @@ @ @ @ @ @ @@@@ @@ @ @ @@@ @@@ @ @ @ @ @@@@@@@@@ @@@ @@ @ @ @@@@ @ @ @@ @@@@@@@@@@ @ @ @@ @ @@@@@@ @ @ @@@ @@@ @ @ @ @ @@@ @@ @ @@@@ @ @@ @@@@ @ @ @@@@@@ @@ @@@ @ @ @@@ @@ @ @@ @ @@@ @@@ @ @ @ @ @@@ @@ @ @ @ @ @@@@ @ @@ @ @ @@ @@@ @@@ @@@ @ @@@ @@@ @@@@@@ @ @@@@@ @ @@ @@ @ @ @ @ @ @@ @ @@ @ @@@@@ @@@@@@@ @@@ @@@@@@ @ @ @@ @ @@@@ @ @ @ @ @ @ @@@@@@ @ @@@@ @ @@@ @@@ @@@ @@ @@ @@@ @ @
You can find more examples in the provided
unmips_examples.txt
.
When you think your program is working,
you can use autotest
to run some simple automated tests:
1521 autotest unmips
When you are finished working on this exercise,
you must
submit your work by running give
:
give cs1521 lab03_unmips unmips.c
You must run give
before Monday 04 March 12:00 (midday) (2024-03-04 12: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 Week 4 Monday 12:00:00 (midday) to submit your work without receiving a late penalty.
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 running autotest
.)
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