Pesquisar neste blog

31/12/2020

Calculadora em linguagem MIPS Assembly

.data
menu: .asciiz "***** MENU *****\n1 - Somar\n2 - Subtrair\n3 - Multiplicar\n4 - Dividir\n0 - SAIR\nOpção: "
n1: .asciiz "Entre com o primeiro número: "
n2: .asciiz "Entre com o segundo número: "
r: .asciiz "Resultado = "
pula: .asciiz "\n\n"

.macro pula_linha # Macro pula linha
li $v0, 4
la $a0, pula # Carrega a string de pula em $a0
li $v0, 4
la $a0, pula
syscall
.end_macro

.macro menu
li $v0, 4
la $a0, menu
syscall
li $v0, 5 # Prepara para ler um número inteiro
syscall
move $t0, $v0 # Salva o número digitado em $t0
.end_macro

.text # Diretiva de dados
.globl principal # Diretiva global

principal: # Função principal
menu # Chama a macro menu
# Condições
beq $t0, 1, somar # se $t0 for digitado 1 vai para o bloco somar
# Bloco somar
beq $t0, 2, subtrair
# bloco subtrair
beq $t0, 3, multiplicar
# bloco multiplicar
beq $t0, 4, dividir

beq $t0, 0, sair
# bloco sair

somar:
# pede o primeiro número
li $v0, 4
la $a0, n1 # Carrega n1 no registrador $a0
syscall
li $v0, 5
syscall
move $t1, $v0 
# pede o segundo número
li $v0, 4
la $a0, n2 # Carregga n2 no registrador
syscall
li $v0, 5
syscall
move $t2, $v0 # Salva o número digitado
add $t3, $t1 $t2 # SOMA: $t3 = t1 + t2
# Mostra o resultado na tela
li $v0, 4
la $a0, r # Carrega r no registrador $a0
syscall
li $v0, 1 # Imprimi m número
la $a0, ($t3) # Carrega o inteiro de $t3 em $a0
syscall
pula_linha # Executa a macro
j principal # Executa o bloco principal

subtrair: # Bloco subtrair
# pede o primeiro número
li $v0, 4 # Imprimi uma string
la $a0, n1 # Carrega n1 no registrador a0
syscall
li $v0, 5 # Lê um número inteiro
syscall
move $t1, $v0 # Salva o número digitado em $t1
# pede o segundo número
li $v0, 4 # Imprimir uma string
la $a0, n2 # Carrega n2 no registrador
syscall
li $v0, 5
syscall
move $t2, $v0 # Salva o número digitado em $t2
sub $t3, $t1, $t2 # SUBTRAI: t3 = t1 - t2
#MOSTRA o resultado na tela
li $v0, 4 # Imprimi uma string
la $a0, r # Carrega no registrador a0
syscall
li $v0, 1 # Imprimi um número
la $a0, ($t3) # Carrega o inteiro 
syscall
pula_linha # Executa a macro pula linha
j principal # Executa o bloco principal

multiplicar: # Bloco multiplicar:
# Pede o primeiro número
li $v0, 4 # Imprimi uma string
la $a0, n1 # Carrega n1 no registrador 
syscall
li $v0, 5 # Le um número inteiro
syscall
la $a0, ($t3) # Carrega o inteiro 
# Pede o segundo número
move $t1, $v0 # Salva o número digitado em $t1
la $a0, n2 # Carrega n2 no registrador 
syscall
li $v0, 5 # Lê um número inteiro
syscall
move $t2, $v0 # Salva o número digitado em $t2
mul $t3, $t1, $t2 # MULTIPLICA: t3 = t1 * t2
#Mostra o resultado na tela
li $v0, 4 # Imprimi uma string
la $a0, r # Carrega r no registrador $a0
syscall
li $v0, 1 # Imprimi um número inteiro
la $a0, ($t3) # Carrega o número inteiro de $t3 em $a0
syscall # Executa
pula_linha # Executa a macro pula_linha
j principal # Executa o bloco principal

dividir: # bloco dividir
# Pede o primeiro número
li $v0, 4 # Imprimi uma string
la $a0, n1 # Carrega n1 no registrador $a0
syscall
li $v0, 5 # Lê um número inteiro
syscall
move $t1, $v0 # Salva o número digitado em t1
# pede o segundo número
li $v0, 4 # Imprimi uma string
la $a0, n2 # Carrega n2 no registrador $a0
syscall
li $v0, 5 # Le um número inteiro
syscall
move $t2, $v0 # Salva o número digitado em t2
div $t3, $t1, $t2 # DIVIDE: t3 = t1 / t2
# Mostra o resultado
li $v0, 4 # Imprimi uma string
la $a0, r # Carrega no registrador a0
syscall
li $v0, 1 # Imprimi uma string
la $a0, ($t3) # Carrega um inteiro em a0
syscall
pula_linha
j principal
# bloco para sair
sair:
li $v0, 10
syscall



Simulador: MARS 4.5


Nenhum comentário: