Skip to content

Instantly share code, notes, and snippets.

@jfbueno
Created May 23, 2017 19:20
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 jfbueno/86bae29048bdd61d99c521facdbc4863 to your computer and use it in GitHub Desktop.
Save jfbueno/86bae29048bdd61d99c521facdbc4863 to your computer and use it in GitHub Desktop.
li $s0, 2 # Carregar o valor de A
li $s1, 14 # Carregar o valor de B
main:
move $a1, $s0 # Fazer com que $a1 receba o valor de A, para usar na função
jal converter # Chamar a função que converte pra 7 segmentos
move $a1, $s1 # Mesma coisa que acima, só que usando o B
jal converter # --
contar1:
li $a1, 6 # Carregar parâmetro para fazer a contagem
jal fn_contar # Chamar a função de contar
ble $s0, $s1, gray # Se A <= B converter os dois valores pra gray
nop
sub $t0, $s0, $s1 # resultado da subtração de $s0 e $s1
# Se for para o A receber o resultado da subtração, é só trocar o $s3 por $s0.
move $s0, $t0
move $a1, $t0 # Fazer o $a1 receber o resultado da subtração
jal converter # Chamar a função de converter p/ 7-seg e mostrar
b contar2 # Pular para a segunda contagem (contar até 3)
gray:
move $t0, $s0 # $t0 recebe A
move $t1, $s1 # $t1 recebe B
srl $t2, $t0, 1 # $t2 recebe A shiftado um bit para a direira
srl $t3, $t1, 1 # $t3 recebe B shiftado um bit para a direira
# Agora $t2 e $t3 são A e B shiftados um bit pra direita
xor $t5, $t0, $t2 # Valor do A em Gray - XOR(A, A >> 1)
xor $t6, $t1, $t3 # Valor do B em Gray - XOR(B, B >> 1)
move $s0, $t5
move $s1, $t6
move $a1, $t5 # $a1 recebe o valor em Gray do A
jal converter # Mostrar no display
move $a1, $t6 # $a1 recebe o valor em Gray do B
jal converter # Mostrar no display
contar2:
li, $a1, 3 # Pârametro para a função de contar (limite)
jal fn_contar # Chamar a função de contar
bgt $s0, $s1, main # Se A < B, voltar ao início
j finish # Terminar execução
# Função para contar até determinado número
# Parâmetros:
# $a1: limite da contagem
fn_contar:
li $t0, 0 # Inicializar contador
move $t1, $a1 # $t1 recebe o valor do parametro (limite da contagem)
loop:
beq $t0, $t1, done_fn # Checa se contador = ao limite (passado como parâmetro)
addi $t0, $t0, 1 # Incrementar o contador em 1
move $t9, $ra # Salva o valor do $ra em $t9 (pra poder entrar em outra função)
move $a0, $t0 # $a0 recebe o valor de t0, para mostrar no console
li $a1, 1 # $a1 recebe qual o tipo a ser impresso (1 - inteiros)
jal .print # Chama a função de printar
move $ra, $t9 # Restora o valor de $t9
j loop # Segue o baile - loop
done_fn:
jr $ra
converter:
move $t0, $a1 # Mover o valor recebido para um temporário ($t0)
li $a1, 4 # $a1 recebe o valor do syscall que será chamado posteriormente
beq $t0, 0, .L0
beq $t0, 1, .L1
beq $t0, 2, .L2
beq $t0, 3, .L3
beq $t0, 4, .L4
beq $t0, 5, .L5
beq $t0, 6, .L6
beq $t0, 7, .L7
beq $t0, 8, .L8
beq $t0, 9, .L9
beq $t0, 10, .L10
beq $t0, 11, .L11
beq $t0, 12, .L12
beq $t0, 13, .L13
beq $t0, 14, .L14
beq $t0, 15, .L15
.L0: la $a0, seg0
j .print
.L1: la $a0, seg1
j .print
.L2: la $a0, seg2
j .print
.L3: la $a0, seg3
j .print
.L4: la $a0, seg4
j .print
.L5: la $a0, seg5
j .print
.L6: la $a0, seg6
j .print
.L7: la $a0, seg7
j .print
.L8: la $a0, seg8
j .print
.L9: la $a0, seg9
j .print
.L10: la $a0, sega
j .print
.L11: la $a0, segb
j .print
.L12: la $a0, segc
j .print
.L13: la $a0, segd
j .print
.L14: la $a0, sege
j .print
.L15: la $a0, segf
j .print
# Função para imprimir algum valor na tela
# Parâmetros
# $a0: Valor a ser impresso (ou endereço de memória - se for string)
# $a1: Syscall a ser chamado (1 para números inteiros, 4 para strings)
.print:
move $v0, $a1 # $v0 recebe a operação a ser executada
syscall
la $a0, strcr # Carriage Return (\n)
li $v0, 4 # Carregar a operação (imprimir string)
syscall
jr $ra # Voltar
finish:
# Tabela de strings utlizadas pelo algoritmo
.data
buffer: .space 20
strcr: .asciiz "\n"
seg0: .asciiz "1111110" # 0 - 0x0
seg1: .asciiz "0110000" # 1 - 0x1
seg2: .asciiz "1101101" # 2 - 0x2
seg3: .asciiz "1111001" # 3 - 0x3
seg4: .asciiz "0110011" # 4 - 0x4
seg5: .asciiz "1011011" # 5 - 0x5
seg6: .asciiz "1011111" # 6 - 0x6
seg7: .asciiz "1110000" # 7 - 0x7
seg8: .asciiz "1111111" # 8 - 0x8
seg9: .asciiz "1111011" # 9 - 0x9
sega: .asciiz "1110111" # 10 - 0xa
segb: .asciiz "0011111" # 11 - 0xb
segc: .asciiz "1001110" # 12 - 0xc
segd: .asciiz "0111101" # 13 - 0xd
sege: .asciiz "1001111" # 14 - 0xe
segf: .asciiz "1000111" # 15 - 0xf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment