Created
May 23, 2017 19:20
-
-
Save jfbueno/86bae29048bdd61d99c521facdbc4863 to your computer and use it in GitHub Desktop.
This file contains 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
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