Skip to content

Instantly share code, notes, and snippets.

@giuscri
Created June 29, 2017 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save giuscri/ec0c7d3ca05798dd47a0c0d740c7eedf to your computer and use it in GitHub Desktop.
Save giuscri/ec0c7d3ca05798dd47a0c0d740c7eedf to your computer and use it in GitHub Desktop.
.globl main
.globl insert
.globl delete
.globl defrag
.globl find_zero
.globl print_list
.globl fail
.data
list: .space 12
end_of_list:
head: .word 0
something_went_wrong: .asciiz "*** Something went wrong.\n"
.text
main:
sub $sp, $sp, 4
sw $ra, 0($sp)
sub $sp, $sp, 4
sw $fp, 0($sp)
move $fp, $sp
# head = list + 12
la $t0, list
add $t0, $t0, 12
sw $t0, head
sub $sp, $sp, 4
li $t0, 42
sw $t0, 0($sp)
jal insert
add $sp, $sp, 4
sub $sp, $sp, 4
li $t0, 43
sw $t0, 0($sp)
jal insert
add $sp, $sp, 4
sub $sp, $sp, 4
li $t0, 44
sw $t0, 0($sp)
jal insert
add $sp, $sp, 4
jal print_list
sub $sp, $sp, 4
li $t0, 43
sw $t0, 0($sp)
jal delete
add $sp, $sp, 4
jal print_list
move $sp, $fp
lw $fp, 0($sp)
add $sp, $sp, 4
lw $ra, 0($sp)
add $sp, $sp, 4
jr $ra
defrag:
sub $sp, $sp, 4
sw $ra, 0($sp)
sub $sp, $sp, 4
sw $fp, 0($sp)
move $fp, $sp
jal find_zero
move $t0, $v0 # l := <location of 0>
beqz $t0, return_defrag
defrag_loop:
lw $t1, head
beq $t0, $t1, end_defrag_loop
sub $t0, $t0, 4
lw $t1, 0($t0)
add $t0, $t0, 4
sw $t1, 0($t0)
sub $t0, $t0, 4
j defrag_loop
end_defrag_loop:
sw $zero, 0($t0)
add $t0, $t0, 4
sw $t0, head
return_defrag:
move $sp, $fp
lw $fp, 0($sp)
add $sp, $sp, 4
lw $ra, 0($sp)
add $sp, $sp, 4
jr $ra
insert:
# void -> void
sub $sp, $sp, 4
sw $ra, 0($sp)
sub $sp, $sp, 4
sw $fp, 0($sp)
move $fp, $sp
lw $t0, head
la $t1, list
beq $t0, $t1, fail # if there's no room, fail
sub $t0, $t0, 4
lw $t1, 8($fp)
sw $t1, 0($t0)
sw $t0, head
move $sp, $fp
lw $fp, 0($sp)
add $sp, $sp, 4
lw $ra, 0($sp)
add $sp, $sp, 4
jr $ra
delete:
# x -> <success>
sub $sp, $sp, 4
sw $ra, 0($sp)
sub $sp, $sp, 4
sw $fp, 0($sp)
move $fp, $sp
li $v0, -1
lw $t0, head
lw $t1, 8($fp)
delete_loop:
la $t2, end_of_list
beq $t0, $t2, end_delete_loop
lw $t2, 0($t0)
beq $t1, $t2, set_to_zero
add $t0, $t0, 4
j delete_loop
set_to_zero:
sw $zero, 0($t0)
jal defrag # defrag before returning
li $v0, 0
end_delete_loop:
move $sp, $fp
lw $fp, 0($sp)
add $sp, $sp, 4
lw $ra, 0($sp)
add $sp, $sp, 4
jr $ra
find_zero:
# void -> <location of the 0 in list>
sub $sp, $sp, 4
sw $ra, 0($sp)
sub $sp, $sp, 4
sw $fp, 0($sp)
move $fp, $sp
lw $v0, head
find_zero_loop:
la $t0, end_of_list
beq $v0, $t0, end_find_zero_loop
lw $t0, 0($v0)
beqz $t0, end_find_zero_loop
add $v0, $v0, 4
j find_zero_loop
end_find_zero_loop:
la $t0, end_of_list
bne $v0, $t0, zero_found
li $v0, 0
zero_found:
# Nothing, v0 is already loaded correctly.
move $sp, $fp
lw $fp, 0($sp)
add $sp, $sp, 4
lw $ra, 0($sp)
add $sp, $sp, 4
jr $ra
print_list:
sub $sp, $sp, 4
sw $ra, 0($sp)
sub $sp, $sp, 4
sw $fp, 0($sp)
move $fp, $sp
li $a0, 0x5b
li $v0, 11
syscall
lw $t0, head
print_list_loop:
la $t1, end_of_list
beq $t0, $t1, end_print_list_loop
lw $a0, 0($t0)
li $v0, 1
syscall
li $a0, 0x20
li $v0, 11
syscall
add $t0, $t0, 4
j print_list_loop
end_print_list_loop:
li $a0, 0x08
li $v0, 11
syscall
li $a0, 0x5d
li $v0, 11
syscall
li $a0, 0x0a
li $v0, 11
syscall
move $sp, $fp
lw $fp, 0($sp)
add $sp, $sp, 4
lw $ra, 0($sp)
add $sp, $sp, 4
jr $ra
fail:
la $a0, something_went_wrong
li $v0, 4
syscall
li $a0, -1
li $v0, 17 # exit(-1)
syscall
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment