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

When you are finished each exercises make sure you submit your work by running 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