Skip to content

Instantly share code, notes, and snippets.

@icchy
Created June 27, 2014 06:04
Show Gist options
  • Save icchy/80f2a521796f7b3469e6 to your computer and use it in GitHub Desktop.
Save icchy/80f2a521796f7b3469e6 to your computer and use it in GitHub Desktop.
# Data Segment
.data
input: .asciiz "Input numbers\n"
msg_a: .asciiz "a: "
msg_b: .asciiz "b: "
vline: .asciiz "|"
minus: .asciiz "-"
plus: .asciiz "+"
index: .asciiz "a\b"
space: .asciiz " "
nl: .asciiz "\n"
# Text Segment
.text
.globl main
# $s0: a
# $s1: b
# $s2: length of a*b
# $s3: length of a
# $s4: length of b
# $s5: width
# $s6: index_space
# $t0: tmp
# $t0: for calc : a
# $t1: for calc : b
printNum:
# a0: num
# a1: length
# t9: num of space
# t8: num length
# t7: backup num
move $t9, $a1
move $t7, $a0
### $t8 = getLength($a0)
# set argument
move $a0, $a0
# call func
addi $sp, $sp, -4
sw $ra, 0($sp)
jal getLength
lw $ra, 0($sp)
addi $sp, $sp, 4
# store value
move $t8, $v0
# $t9 = $a1 - $t8
sub $t9, $a1, $t8
# store $a0
addi $sp, $sp, -4
sw $a0, 0($sp)
# print space
li $v0, 4
la $a0, space
blez $t9, printNum_break
printNum_loop:
syscall
addi $t9, $t9, -1
bgtz $t9, printNum_loop
printNum_break:
# print num
li $v0, 1
move $a0, $t7
syscall
# restore $a0
lw $a0, 0($sp)
addi $sp, $sp, 4
jr $ra
getLength:
# t9: for calc
# t8: ten
# a0: num
# v0: length of num
# init
move $t9, $a0
li $t8, 10
li $v0, 0
loop_getLength:
div $t9, $t9, $t8
addi $v0, $v0, 1
bgtz $t9, loop_getLength
jr $ra
printFrame:
# no arguments
addi $sp, $sp, -4
sw $a0, 0($sp)
li $v0, 4
la $a0, plus
syscall
move $t0, $s6
main_indexframe:
la $a0, minus
syscall
addi $t0, $t0, -1
bgtz $t0, main_indexframe
la $a0, plus
syscall
move $t1, $s5
addi $t1, $t1, -3
sub $t1, $t1, $s6
main_printframe:
la $a0, minus
syscall
addi $t1, $t1, -1
bgtz $t1, main_printframe
la $a0, plus
syscall
la $a0, nl
syscall
# restore \$a0
lw $a0, 0($sp)
addi $sp, $sp, 4
jr $ra
main:
# print inputmsg
li $v0, 4
la $a0, input
syscall
# input a, b to $t0, $t1
li $v0, 4
la $a0, msg_a
syscall
li $v0, 5
syscall
move $s0, $v0
li $v0, 4
la $a0, msg_b
syscall
li $v0, 5
syscall
move $s1, $v0
mul $t0, $s0, $s1 # $t0 = a * b
### $s2 = getLength(a * b) ###
# set argument
move $a0, $t0
# call func
addi $sp, $sp, -4
sw $ra, 0($sp)
jal getLength
lw $ra, 0($sp)
addi $sp, $sp, 4
# store value
move $s2, $v0
### $s3 = getLength(a) ###
# set argument
move $a0, $s0
# call func
addi $sp, $sp, -4
sw $ra, 0($sp)
jal getLength
lw $ra, 0($sp)
addi $sp, $sp, 4
# store value
move $s3, $v0
### $s4 = getLength(b) ###
# set argument
move $a0, $s1
# call func
addi $sp, $sp, -4
sw $ra, 0($sp)
jal getLength
lw $ra, 0($sp)
addi $sp, $sp, 4
# store value
move $s4, $v0
### index_space($s6) = max($s6, $s3) ###
li $t0, 3 # for compare
li $s6, 3
bgt $t0, $s3, index_space
move $s6, $s3
index_space:
### width($s5) = 1+$s6+1+($s2+1)*b ###
li $s5, 0
li $t0, 0
addi $t0, $s2, 1
mul $t0, $t0, $s1
add $s5, $t0, $s6
addi $s5, $s5, 2
# call printFrame
addi $sp, $sp, -4
sw $ra, 0($ra)
jal printFrame
lw $ra, 0($sp)
addi $sp, $sp, 4
### printf("|a\\b|"); for(int i=1; i<=b; i++) {printf("%*d|", $s2, i);} printf("\n"); ###
li $v0, 4
la $a0, vline
syscall
move $t1, $s6
addi $t1, $t1, -3
blez $t1, main_noexpand
main_indexspace:
li $v0, 4
la $a0, space
syscall
addi $t1, $t1, -1
bgez $t1, main_indexspace
main_noexpand:
la $a0, index
syscall
la $a0, vline
syscall
li $t3, 1
main_printindex:
move $a0, $t3
move $a1, $s2
# call func
addi $sp, $sp, -4
sw $ra, 0($sp)
jal printNum
lw $ra, 0($sp)
addi $sp, $sp, 4
li $v0, 4
la $a0, vline
syscall
addi $t3, $t3, 1
ble $t3, $s1, main_printindex
li $v0, 4
la $a0, nl
syscall
# call printFrame
addi $sp, $sp, -4
sw $ra, 0($ra)
jal printFrame
lw $ra, 0($sp)
addi $sp, $sp, 4
### for (int i = 1; i <= a; i++) {
### printf("|%*d|", $s3, i);
### for (int j = 1; j <= b; j++) {
### printf("%*d|", $s5, j);
### }
### printf("\n");
### }
li $t0, 1
main_loop_a:
li $t1, 1
li $v0, 4
la $a0, vline
syscall
# set arguments
move $a0, $t0
move $a1, $s6
# call func
addi $sp, $sp, -4
sw $ra, 0($sp)
jal printNum
lw $ra, 0($sp)
addi $sp, $sp, 4
li $v0, 4
la $a0, vline
syscall
main_loop_b:
# set arguments
mul $t3, $t0, $t1
move $a0, $t3
move $a1, $s2
# call func
addi $sp, $sp, -4
sw $ra, 0($sp)
jal printNum
lw $ra, 0($sp)
addi $sp, $sp, 4
beq $t1, $s1, main_break
li $v0, 4
la $a0, space
syscall
addi $t1, $t1, 1
ble $t1, $s1, main_loop_b
main_break:
li $v0, 4
la $a0, vline
syscall
la $a0, nl
syscall
addi $t0, $t0, 1
ble $t0, $s0, main_loop_a
# call printFrame
addi $sp, $sp, -4
sw $ra, 0($ra)
jal printFrame
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment