Computer Systems Fundamentals
Course Resources
Administrivia: | Course Outline | COMP1521 Handbook |
Administrivia: | Course Timetable | Help Sessions |
Meet the Team: | Our Team |
Platforms: | Lecture Recordings | Online Tut-Labs and Help Sessions (via BbCollaborate) | Course Forum |
Style Guides: | COMP1521 C Style Guide | Assembly Style Guide |
MIPS Resources: | MIPS Documentation | Text Editors for Assembly |
mipsy: | mipsy-web | mipsy source code | Debugging with mipsy (video) |
Revision: | Linux Cheatsheet | C Reference |
Assessment: | Autotests, Submissions, Marks | Give online: submission | Give online: sturec |
Course Content Week-by-Week
- Tutorial
- Laboratory
- Monday Week 1 Lecture Topics
- Wednesday Week 1 Lecture Topics
Course Content Topic-by-Topic
.text
main:
li $v0, 4 # syscall 4: print_string
la $a0, hello_world_msg #
syscall # printf("Hello world\n");
li $v0, 0
jr $ra # return 0;
.data
hello_world_msg:
.asciiz "Hello world\n"
Perform some basic arithmetic.
#include <stdio.h>
int main(void) {
int x = 17;
int y = 25;
printf("%d\n", 2 * (x + y));
return 0;
}
Perform some basic arithmetic.
#include <stdio.h>
int main(void) {
int x = 17;
int y = 25;
int z = x + y;
z = 2 * z;
printf("%d", z);
putchar('\n');
return 0;
}
Do some basic arithmetic in MIPS.
main:
# Locals:
# - $t0: int x
# - $t1: int y
# - $t2: int z
li $t0, 17 # int x = 17;
li $t1, 25 # int y = 25;
add $t2, $t0, $t1 # int z = x + y;
mul $t2, $t2, 2 # z = z * 2;
li $v0, 1 # syscall 1: print_int
move $a0, $t2 #
syscall # printf("%d", z);
li $v0, 11 # syscall 11: print_char
li $a0, '\n' #
syscall # putchar('\n');
li $v0, 0
jr $ra # return 0;
Do some basic arithmetic in MIPS, but with one less register.
main:
# Locals:
# - $t0: int x
# - $t1: int y
li $t0, 17 # int x = 17;
li $t1, 25 # int y = 25;
li $v0, 1 # syscall 1: print_int
add $a0, $t0, $t1 # (x + y)
mul $a0, $a0, 2 # * 2
syscall # printf("%d", 2 * (x + y));
li $v0, 11 # syscall 11: print_char
li $a0, '\n' #
syscall # putchar('\n');
li $v0, 0
jr $ra # return 0;
Square two numbers and sum their squares.
#include <stdio.h>
int main(void) {
int a, b;
printf("Enter a number: ");
scanf("%d", &a);
printf("Enter another number: ");
scanf("%d", &b);
printf("The sum of the squares of %d and %d is %d\n", a, b, a*a + b*b);
return 0;
}
Square two numbers and sum their squares.
#include <stdio.h>
int main(void) {
int a, b;
printf("Enter a number: ");
scanf("%d", &a);
printf("Enter another number: ");
scanf("%d", &b);
printf("The sum of the squares of ");
printf("%d", a);
printf(" and ");
printf("%d", b);
printf(" is ");
a = a * a;
b = b * b;
printf("%d", a + b);
putchar('\n');
return 0;
}
Square and add two numbers and print the result.
.text
main:
# Locals:
# - $t0: int a
# - $t1: int b
li $v0, 4 # syscall 4: print_string
la $a0, prompt1_msg #
syscall # printf("Enter a number: ");
li $v0, 5 # syscall 5: read_int
syscall #
move $t0, $v0 # scanf("%d", &a);
li $v0, 4 # syscall 4: print_string
la $a0, prompt2_msg #
syscall # printf("Enter another number: ");
li $v0, 5 # syscall 5: read_int
syscall #
move $t1, $v0 # scanf("%d", &b);
li $v0, 4 # syscall 4: print_string
la $a0, result_msg_1 #
syscall # printf("The sum of the squares of ");
li $v0, 1 # syscall 1: print_int
move $a0, $t0 #
syscall # printf("%d", a);
li $v0, 4 # syscall 4: print_string
la $a0, result_msg_2 #
syscall # printf(" and ");
li $v0, 1 # syscall 1: print_int
move $a0, $t1 #
syscall # printf("%d", b);
li $v0, 4 # syscall 4: print_string
la $a0, result_msg_3 #
syscall # printf(" is ");
mul $t0, $t0, $t0 # a = a * a;
mul $t1, $t1, $t1 # b = b * b;
li $v0, 1 # syscall 1: print_int
add $a0, $t0, $t1 #
syscall # printf("%d", a + b);
li $v0, 11 # syscall 11: print_char
la $a0, '\n' #
syscall # putchar('\n');
li $v0, 0
jr $ra # return 0;
.data
prompt1_msg:
.asciiz "Enter a number: "
prompt2_msg:
.asciiz "Enter another number: "
result_msg_1:
.asciiz "The sum of the squares of "
result_msg_2:
.asciiz " and "
result_msg_3:
.asciiz " is "
Print a message only if a number is even.
#include <stdio.h>
int main(void) {
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (n % 2 == 0) {
printf("even\n");
}
return 0;
}
Print a message only if a number is even.
#include <stdio.h>
int main(void) {
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (n % 2 != 0) goto epilogue;
printf("even\n");
epilogue:
return 0;
}
Calculate 1*1 + 2*2 + ... + 99*99 + 100*100
#include <stdio.h>
int main(void) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i * i;
}
printf("%d\n", sum);
return 0;
}
Calculate 1*1 + 2*2 + ... + 99*99 + 100*100.
#define UPPER_BOUND 100
#include <stdio.h>
int main(void) {
int sum = 0;
loop_i_to_100__init:;
int i = 0;
loop_i_to_100__cond:
if (i > UPPER_BOUND) goto loop_i_to_100__end;
loop_i_to_100__body:
sum += i * i;
loop_i_to_100__step:
i++;
goto loop_i_to_100__cond;
loop_i_to_100__end:
printf("%d", sum);
putchar('\n');
return 0;
}
Calculate 1*1 + 2*2 + ... + 99*99 + 100*100
UPPER_BOUND = 100
.text
main:
# Locals:
# - $t0: int sum
# - $t1: int i
# - $t2: temporary value
li $t0, 0 # int sum = 0;
loop_i_to_100__init:
li $t1, 1 # int i = 0;
loop_i_to_100__cond:
bgt $t1, UPPER_BOUND, loop_i_to_100__end # while (i < UPPER_BOUND) {
loop_i_to_100__body:
mul $t2, $t1, $t1 # sum = (i * i) +
add $t0, $t0, $t2 # sum;
loop_i_to_100__step:
addi $t0, $t0, 1 # i++;
b loop_i_to_100__cond # }
loop_i_to_100__end:
li $v0, 1 # syscall 1: print_int
move $a0, $t0 #
syscall # printf("%d", sum);
li $v0, 11 # syscall 11: print_char
li $a0, '\n' #
syscall # putchar('\n');
li $v0, 0
jr $ra # return 0;
Print hello world in MIPS.