The University of New South Wales
Term 2, 2023
COMP1521: Computer Systems Fundamentals
20t2 Final Exam
— Tuesday 22 August 2023 —
10 questions — 100 marks
10 minutes reading; 3 hours working
Examination Information
Examination Instructions and Conditions
You can start reading the text of this examination when instructed to do so by your invigilator.
You can start working on examination questions when instructed to do so by your invigilator.
You must stop working on examination questions immediately when instructed to do so by your invigilator.
Only submissions made before this time will be marked.
For students with approved examination extensions from UNSW Equitable Learning Services,
You should continue working until your extended working time expires.Your invigilator will tell you when this time expires.
You must not communicate with any person during the examination
except for COMP1521 Course Staff and Exam Invigilators.You are not permitted to talk, email, telephone, message , etc. all
except to COMP1521 Course Staff and Exam Invigilators.You must not get help from anyone during this exam,
except from COMP1521 Course Staff and Exam Invigilators.You must not communicate (email, message, post, ...) your exam answers to anyone, even after the exam has finished.
There are two sessions, so other students may still be taking the exam after you have finished.
Additionally Some students have extended time to complete the exam.
And some students may be taking the exam on a different day.
Communicating your answers to other students, even after the exam, may be academic misconduct.
You must ensure that, during and after the examination, no other person can access your work.
You must not use code-synthesis tools, such as GitHub Copilot, during this exam.
Your zPass should not be disclosed to any other person. If you have disclosed your zPass, you should change it immediately.
This is a closed-book examination.
You are not permitted to access papers, books, or any other written materials.
You are not permitted to access files on your computer or other computers, except the files provided by the exam.
You are not permitted to access web pages or other Internet resources, except the web pages provided by the exam, and the online language documentation linked below.
Deliberate violation of exam conditions is academic misconduct,
and will be referred to the UNSW Student Conduct and Integrity Unit.
Examination Structure
This examination has 9 questions,
worth a total of 90 marks.
This exam originally had 11 questions, but two questions have been removed from this past paper.
Questions are worth equal marks.All 9 questions are practical questions.
Not all questions may provide files. You should create any files needed for submission if they are not provided.
You must answer each question in a separate file. Each question specifies the name of the file to use. Make sure you use exactly this file name.
When you finish working on a question, you should submit your files using the give command specified in the question. You should not wait until the submission deadline to submit your answers. Running autotests does not automatically submit your code.
You do not receive additional time for submitting your answers.
You must submit all questions before the end of the 3 hour exam period.
Failing to logout immediately at the end of the exam period is academic misconduct.
You may submit as many times as you like; only the last submission will be marked.
You can verify what submissions you have made with
1521 classrun -check
Available Resources: Language Documentation
You may access this language documentation while attempting this test:
manual entries, via the man(1) command.
Texinfo pages, via the info(1) command.
Troubleshooting
If you are having issues working on the exam:
Immediately inform your invigilator.
Fit-to-Sit
This exam is covered by UNSW's Fit-to-Sit policy. That means that, by sitting this exam, you are declaring yourself well enough to do so. You will be unable to apply for special consideration after the exam for circumstances affecting you before it began.
Getting Started
All provided files for this exam are located in your home directory.
simply open a terminal or text editor in your home directory and you will be able to access all the files.
If you make a mistake and need a new copy of a particular file, you can do the following:
rm broken-file 1521 fetch exam_20t2final
Only files that don't exist will be recreated. All other files will remain untouched.
Question 1 (10 marks)
You have been given practice_q1.s
, a MIPS assembler program that reads one number and then prints it.
Add code to practice_q1.s
to make it equivalent to this C program:
// print the sum of two integers
#include <stdio.h>
int main(void) {
int x, y;
scanf("%d", &x);
scanf("%d", &y);
printf("%d\n", x + y);
return 0;
}
In other words, it should read 2 numbers and print their sum.
For example:
1521 mipsy practice_q1.s 5 8 13 1521 mipsy practice_q1.s 118 26 144 1521 mipsy practice_q1.s 42 42 84
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q1
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q1 practice_q1.s
To verify your submissions for this activity:
1521 classrun -check 20t2final_q1
Question 2 (10 marks)
Your task is to add code to this function in practice_q2.c:
// given a uint32_t value,
// return 1 iff the least significant (bottom) byte
// is equal to the 2nd least significant byte; and
// return 0 otherwise
int practice_q2(uint32_t value) {
// PUT YOUR CODE HERE
return 42;
}
Add code to the function practice_q2
so that,
given a uint32_t
value,
it returns 1
iff the least significant (bottom) byte of value
is equal to the second least significant byte.
practice_q2
should return 0 otherwise.
For example, given the hexadecimal value 0x12345678,
practice_q2
should return 0,
because the least significant byte, 0x78,
is not equal to the second least significant byte, 0x56.
Similarly, given the hexadecimal value 0x12345656,
practice_q2
should return 1,
because the least significant byte, 0x56,
is equal to the second least significant byte, 0x56.
You must use bitwise operators to implement practice_q2
.
For example:
dcc practice_q2.c test_practice_q2.c -o practice_q2 ./practice_q2 0x00000000 practice_q2(0x00000000) returned 1 ./practice_q2 0x00000001 practice_q2(0x00000001) returned 0 ./practice_q2 0x00000100 practice_q2(0x00000100) returned 0 ./practice_q2 0x00000101 practice_q2(0x00000101) returned 1 ./practice_q2 0x00001212 practice_q2(0x00001212) returned 1 ./practice_q2 0x00001213 practice_q2(0x00001213) returned 0 ./practice_q2 0x12345678 practice_q2(0x12345678) returned 0 ./practice_q2 0x12345656 practice_q2(0x12345656) returned 1 ./practice_q2 0x12345634 practice_q2(0x12345634) returned 0 ./practice_q2 0x12345666 practice_q2(0x12345666) returned 0 ./practice_q2 0x12121212 practice_q2(0x12121212) returned 1 ./practice_q2 0x37861212 practice_q2(0x37861212) returned 1 ./practice_q2 0x12121221 practice_q2(0x12121221) returned 0
You can also use make(1) to build your code:
make practice_q2
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q2
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q2 practice_q2.c
To verify your submissions for this activity:
1521 classrun -check 20t2final_q2
Question 3 (10 marks)
You have been given practice_q3.s
,
a MIPS assembler program that reads an integer value and then prints it.
Add code to the file practice_q3.s
so that it prints 1
iff the least significant (bottom) byte of value
is equal to the second least significant byte,
and prints 0 otherwise.
For example, given the decimal value 305419896,
which is hexadecimal 0x12345678,
practice_q3.s
should print 0,
because the least significant byte, 0x78,
is not equal to the second least significant byte, 0x56.
Similarly, given the decimal value 305419862,
which is hexadecimal 0x12345656,
practice_q3.s
should print 1,
because the least significant byte, 0x56,
is equal to the second least significant byte, 0x56.
For example:
1521 mipsy practice_q3.s 0 1 1521 mipsy practice_q3.s 1 0 1521 mipsy practice_q3.s 256 0 1521 mipsy practice_q3.s 257 1 1521 mipsy practice_q3.s 4626 1 1521 mipsy practice_q3.s 4627 0 1521 mipsy practice_q3.s 305419896 0 1521 mipsy practice_q3.s 305419862 1
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q3
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q3 practice_q3.s
To verify your submissions for this activity:
1521 classrun -check 20t2final_q3
Question 4 (10 marks)
You have been given practice_q4.s
,
a MIPS assembler program that reads 1 number and then prints it.
Add code to practice_q4.s
to make it equivalent to this C program:
// read numbers until their sum is >= 42, print their sum
#include <stdio.h>
int main(void) {
int sum = 0;
while (sum < 42) {
int x;
scanf("%d", &x);
sum = sum + x;
}
printf("%d\n", sum);
return 0;
}
In other words, it should read numbers until their sum is ≥ 42 and then print their sum.
For example:
1521 mipsy practice_q4.s 10 20 25 55 1521 mipsy practice_q4.s 20 22 42 1521 mipsy practice_q4.s 100 100 1521 mipsy practice_q4.s 10 10 10 10 10 50
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q4
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q4 practice_q4.s
To verify your submissions for this activity:
1521 classrun -check 20t2final_q4
Question 5 (10 marks)
Write a C program, practice_q5.c
,
which takes two names of environment variables as arguments.
It should print 1
iff both environment variables are set to the same value.
Otherwise,
if the environment variables differ in value,
or either environment variable is not set,
it should print 0.
The shell command export
sets an environment variable to a value;
the shell command unset
unsets an environment variable.
In the following example,
export
is used to set the environment variables
VAR1
, VAR2
and VAR3
, and
unset
is used to ensure environment variables VAR4
and VAR5
are unset.
export VAR1=hello export VAR2=good-bye export VAR3=hello unset VAR4 unset VAR5 ./practice_q5 VAR1 VAR2 0 ./practice_q5 VAR3 VAR1 1 ./practice_q5 VAR2 VAR4 0 ./practice_q5 VAR4 VAR5 0
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q5
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q5 practice_q5.c
To verify your submissions for this activity:
1521 classrun -check 20t2final_q5
Question 6 (10 marks)
We need to count the number of ASCII bytes in files.
Write a C program, practice_q6.c
,
which takes a single filename as its argument,
counts the number of bytes in the named file which are valid ASCII,
and prints one line of output containing that count.
Assume a byte is valid ASCII iff it contains a value between 0 and 127 inclusive.
- You must match the output format in the example below exactly.
dcc practice_q6.c -o practice_q6 echo hello world >file1 ./practice_q6 file1 file1 contains 12 ASCII bytes echo -e 'hello\xBAworld' >file2 ./practice_q6 file2 file2 contains 11 ASCII bytes echo -n -e '\x80\x81' >file3 ./practice_q6 file3 file3 contains 0 ASCII bytes
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q6
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q6 practice_q6.c
To verify your submissions for this activity:
1521 classrun -check 20t2final_q6
Question 7 (10 marks)
You have been given practice_q7.s
,
a MIPS assembler program that reads 1 number and then prints it.
Add code to practice_q7.s
to make it equivalent to this C program:
// Read numbers into an array until their sum is >= 42
// then print the numbers in reverse order
#include <stdio.h>
int numbers[1000];
int main(void) {
int i = 0;
int sum = 0;
while (sum < 42) {
int x;
scanf("%d", &x);
numbers[i] = x;
i++;
sum += x;
}
while (i > 0) {
i--;
printf("%d\n", numbers[i]);
}
}
In other words, it should read numbers until their sum is ≥ 42, and then print the numbers read in reverse order.
For example:
1521 mipsy practice_q7.s 11 17 3 19 19 3 17 11 1521 mipsy practice_q7.s 10 20 30 30 20 10 1521 mipsy practice_q7.s 42 42
No error checking is required.
Your program can assume its input contains only integers.
Your program can assume these integers sum to ≥ 42.
Your program can assume that it will have to read no more than 1000 integers before their sum is ≥ 42.
You can assume the value of the expression can be represented as a signed 32 bit value. In other words, you can assume overflow/underflow does not occur.
Your solution must be in MIPS assembler only.
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q7
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q7 practice_q7.s
To verify your submissions for this activity:
1521 classrun -check 20t2final_q7
Question 8 (10 marks)
We need to count the number of UTF-8 characters in a file, and check that the file contains only valid UTF-8.
Write a C program, practice_q8.c
,
which takes a single filename as its argument,
counts the number of UTF-8 characters in the named file,
and prints one line of output containing that count.
Use the same format as the example below.
dcc practice_q8.c -o practice_q8 echo hello world >file1 ./practice_q8 file1 file1: 12 UTF-8 characters echo -e -n '\xF0\x90\x8D\x88' >file2 ./practice_q8 file2 file2: 1 UTF-8 characters echo -e -n '\x24\xC2\xA2\xE0\xA4\xB9' >file3 ./practice_q8 file3 file3: 3 UTF-8 characters ./practice_q8 utf8.html utf8.html: 7943 UTF-8 characters
If practice_q8.c
reads a byte which is not valid UTF-8,
it should stop and print an error message
in the same format as the example below.
Note the error message includes
how many valid UTF-8 characters have been previously read.
echo -e -n '\x24\xC2\xA2\xE0\xA4\x09' >file4 ./practice_q8 file4 file4: invalid UTF-8 after 2 valid UTF-8 characters
If the end of file is reached
before the completion of a UTF-8 character,
practice_q8.c
should also print an error message;
for example:
echo -e -n '\x24\xC2\xA2\xE0\xA4' >file5 ./practice_q8 file5 file5: invalid UTF-8 after 2 valid UTF-8 characters
A reminder of how UTF-8 is encoded:
#bytes | #bits | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
---|---|---|---|---|---|
1 | 7 | 0xxxxxxx |
- | - | - |
2 | 11 | 110xxxxx |
10xxxxxx |
- | - |
3 | 16 | 1110xxxx |
10xxxxxx |
10xxxxxx |
- |
4 | 21 | 11110xxx |
10xxxxxx |
10xxxxxx |
10xxxxxx |
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q8
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q8 practice_q8.c
To verify your submissions for this activity:
1521 classrun -check 20t2final_q8
Question 10 (10 marks)
We need a program which will save an entire directory tree as a single file. The directory tree may consist of many directories and files.
Write a C program, practice_q10
,
which is given either 1 or 2 arguments.
If practice_q10
is given 2 arguments,
the first argument will be the pathname of a file it should create
and the second argument will be the pathname of a directory.
practice_q10
should then save
the entire contents of the specified directory tree
in the specified file.
If practice_q10
is given 1 argument,
that argument will be the pathname of a file
in which a directory tree has been saved.
practice_q10
should re-create
all the directories and files in the directory tree.
For example, these commands create a directory tree named a:
mkdir -p a/b/c echo hello andrew >a/file1 echo bye andrew >a/b/file2 echo 1 >a/b/c/one echo 2 >a/b/c/two ls -lR a a: total 8 drwxr-xr-x 3 z1234567 z1234567 4096 Aug 19 20:38 b -rw-r--r-- 1 z1234567 z1234567 13 Aug 19 20:38 file1 a/b: total 8 drwxr-xr-x 2 z1234567 z1234567 4096 Aug 19 20:38 c -rw-r--r-- 1 z1234567 z1234567 11 Aug 19 20:38 file2 a/b/c: total 8 -rw-r--r-- 1 z1234567 z1234567 2 Aug 19 20:38 one -rw-r--r-- 1 z1234567 z1234567 2 Aug 19 20:38 two cat a/file1 hello andrew cat a/b/file2 bye andrew
In this example, practice_q10
saves the contents of the directory tree a
into a file named data:
dcc practice_q10.c -o practice_q10 ./practice_q10 data a ls -l data -rw-r--r-- 1 z1234567 z1234567 4567 Aug 19 20:38 data
This example shows practice_q10
restoring the contents of the directory tree a
after it has been removed:
rm -rf a ls -lR a ls: cannot access 'a': No such file or directory cat a/file1 cat: a/file1: No such file or directory ./practice_q10 data ls -lR a a: total 8 drwxr-xr-x 3 z1234567 z1234567 4096 Aug 19 20:38 b -rw-r--r-- 1 z1234567 z1234567 13 Aug 19 20:38 file1 a/b: total 8 drwxr-xr-x 2 z1234567 z1234567 4096 Aug 19 20:38 c -rw-r--r-- 1 z1234567 z1234567 11 Aug 19 20:38 file2 a/b/c: total 8 -rw-r--r-- 1 z1234567 z1234567 2 Aug 19 20:38 one -rw-r--r-- 1 z1234567 z1234567 2 Aug 19 20:38 two cat a/file1 hello andrew cat a/b/file2 bye andrew
This example shows practice_q10
restoring the contents of the directory tree a
in a different directory:
mkdir new_directory cd new_directory ../practice_q10 ../data cat a/file1 hello andrew cat a/b/file2 bye andrew
When you think your program is working, you can run some simple automated tests:
1521 autotest 20t2final_q10
When you are finished working on this activity, you must submit your work by running give:
give cs1521 20t2final_q10 practice_q10.c
To verify your submissions for this activity:
1521 classrun -check 20t2final_q10
Submission
When you are finished working on a question, submit your work by running give.
You can run give multiple times. Only your last submission will be marked.
Don't submit any questions you haven't attempted.
Do not leave it to the deadline to submit your answers.
Submit each question when you finish working on it.
Running autotests does not automatically submit your code.
— End of examination. —