Skip to content

Instantly share code, notes, and snippets.

@natanaeljr
Last active October 30, 2019 22:07
Show Gist options
  • Save natanaeljr/3c94844a666a81762f196f58474d2aa9 to your computer and use it in GitHub Desktop.
Save natanaeljr/3c94844a666a81762f196f58474d2aa9 to your computer and use it in GitHub Desktop.
Simple assembly program for MIPS archtecture made in Mars software. Simples programa em assembly para arquitetura MIPS feito no software Mars. Code: binary to gray, print integer bits, 7seg converter, generic counter, etc.
## Copyright 2017 Natanael Rabello ##
# Syscall codes
.eqv SOUT_INT 1
.eqv SOUT_STR 4
.eqv SIN_INT 5
# Imprimi uma string
.macro print_str(%str)
.data
string: .asciiz %str
.text
la $a0, string
li $v0, SOUT_STR
syscall
.end_macro
# Imprimi um inteiro
.macro print_int(%reg)
add $a0, $zero, %reg
li $v0, SOUT_INT
syscall
.end_macro
# Recebe um inteiro
.macro scan_int(%reg)
li $v0, SIN_INT
syscall
add %reg, $zero, $v0
.end_macro
# Regs de A e B
.eqv $A $s0
.eqv $B $s1
# ------------------------------ MAIN -----------------------------------
.text
start: print_str("\nAguardando sinal de start: ")
scan_int($t0)
slti $at, $t0, 1 # seta de for menor que 1
bne $at, $zero, start # Start <= 0
inputA: print_str("Digite o valor de A: ")
scan_int($A) # salva A em $s0
slti $at, $A, 0 # se for menor que zero seta 1
bne $at, $zero, inputA # se == 1, logo menor que zero, entra A novamente
slti $at, $A, 16 # se for menor que 16 seta 1
beq $at, $zero, inputA # se == 0, logo maior que 15, entra A novamente
inputB: print_str("Digite o valor de B: ")
scan_int($B) # salva B em $s1
slti $at, $B, 0 # se for menor que zero seta 1
bne $at, $zero, inputB # se == 1, logo menor que zero, entra B novamente
slti $at, $B, 16 # se for menor que 16 seta 1
beq $at, $zero, inputB # se == 0, logo maior que 15, entra B novamente
displayAB:
print_str("A = ")
add $a0, $zero, $A # parametro para to7seg
jal to7seg # chama conversor para 7seg
print_str(" B = ")
add $a0, $zero, $B # parametro para to7seg
jal to7seg # chama conversor para 7seg
print_str("\n")
count6: print_str("cont: ")
addi $a0, $zero, 6 # parametro para contar ate 6
jal counter # chama contador
if1: slt $at, $B, $A # seta se B < A, mesmo que A > B
bne $at, $zero, subtract # se sim faz subtracao, senao continua para o gray
gray: print_str("gray: ")
print_str("A = ")
add $a0, $zero, $A # parametro do conversor
jal bin2gray # chama o conversor
add $t0, $zero, $v0 # salva em $t0 numero convertido em gray
print_int($t0) # imprime numero convertido em gray
print_str(" (")
add $a0, $zero, $t0 # parametro para to7seg
jal to7seg # chama conversor para 7seg
print_str(") B = ")
add $a0, $zero, $B # parametro do conversor
jal bin2gray # chama o conversor
add $t0, $zero, $v0 # salva em $t0 numero convertido em gray
print_int($t0) # imprimi numero convertido em gray
print_str(" (")
add $a0, $zero, $t0 # parametro para to7seg
jal to7seg # chama conversor para 7seg
print_str(")\n")
j count3 # pula a subtracao
subtract: print_str("subtracao: ")
print_str("A - B = ")
sub $t0, $A, $B # A - B
print_int($t0) # imprimi resultado
print_str(" (")
add $a0, $zero, $t0 # parametro para to7seg
jal to7seg # chama conversor para 7seg
print_str(")\n")
count3: print_str("cont: ")
addi $a0, $zero, 3 # parametro para contar ate 3
jal counter # chama contador
if2: slt $at, $A, $B # seta se A < B
bne $at, $zero, start # se sim, volta para o inicio
done: li $v0, 10 # exit
syscall
# ------------------------------ FUNCTIONS -----------------------------------
.data
to7seg.array:
.byte 0x3F #0 0111111
.byte 0x06 #1 0000110
.byte 0x5B #2 1011011
.byte 0x4F #3 1001111
.byte 0x66 #4 1100110
.byte 0x6D #5 1101101
.byte 0x7D #6 1111101
.byte 0x07 #7 0000111
.byte 0x7F #8 1111111
.byte 0x6F #9 1101111
.byte 0x77 #A 1110111
.byte 0x7C #B 1111100
.word 0x00 #C, D, E, F 0000000
.text
# >> [to7seg] <<
# Converte um numero de 0 ~ 15 para 7 seguimentos e mostra no console
# $a0 -> numero para converter
to7seg: # $t0 index zero do array, $t1 index referente ao numero a converter, $t2 valor convertido, $t3 bit num (loop counter)
la $t0, to7seg.array # endereço 0 do 7seg array
add $t1, $t0, $a0 # mais o numero de entrada
lbu $t2, 0($t1) # load byte unsigned, carrega em $a0 o num em 7seg (parametro para print_bits)
addi $t3, $zero, 7 # inicia loop em 7
to7seg.print: # $t4 bit value
addi $t3, $t3, -1 # decrementa contador do loop
srlv $t4, $t2, $t3 # shifta para direita
andi $t4, $t4, 0x1 # limpar o que nao interessa
print_int($t4) # imprime resultado
slti $at, $t3, 1 # seta se loop counter for menor que 1, chegou no zero -> para
beq $at, $zero, to7seg.print # -> senao, proximo bit para imprimir
jr $ra # volta para quem chamou
# >> [counter] <<
# Conta até um numero maximo
# $a0 -> numero maximo ( > 0)
counter: # $t0 numero maximo, $t1 loop counter
addu $t0, $zero, $a0 # salva numero maximo em $t0
addi $t1, $zero, 1 # inicia contador do loop em 1
counter.loop:
print_int($t1)
print_str(", ")
addi $t1, $t1, 1 # incrementa contador
slt $at, $t0, $t1 # seta se for maior que numero maximo
beq $at, $zero, counter.loop # caso nao é, continua contando
print_str("\n")
jr $ra # volta para quem chamou
# >> [bin2gray] <<
# Converte numero binario para gray
# $a0 -> numero em binario
# $v0 -> numero em gray
bin2gray: # $t0 numero bin >> 1
srl $t0, $a0, 1 # shifta 1 bit para direita
xor $v0, $t0, $a0 # gray = (bin >> 1) ^ bin
jr $ra # volta para que chamou
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment