Last active
October 30, 2019 22:07
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## 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