Assembler em mips–parte 3
novembro 29, 2010 Deixe um comentário
Boa diaConforme combinado estou colocando um exemplo de calculadora em MIPS e explicando o que cada operação faz
#Calculadora Básica # #Desenvolvido por: Diego Henrique da Silva # #data: 16/11/2010 21:23 # ######################################################################################### #Projeto de calculadora para a disciplina de Fundamentos de Hardware II # #Objetivo: Construir uma calculadora para processadores MIPS de 32bits em assembler # #Tendo como opções soma,subtração, divisão e multiplicação, logo após deverão obter os # #termos e imprimir na tela o resultado, o programa está em loop para no fim de cada # #execução perguntar se quer realizar uma nova operação. # ######################################################################################### .data # prompt1: .asciiz "Digite a operação pedida:\n1 - Soma\n2 – Subtração" # prompt2: .asciiz "\n3 – Multiplicação\n4 – Divisão\n5 - Sair\n" # termo1l: .asciiz "Digite o 1º termo\n" # termo2l: .asciiz "Digite o 2º termo\n" # erro: .asciiz "Número inválido, tente novamente.\n\n" # final: .asciiz "Obrigado por usar este software!" # resultadol: .asciiz "O resultado é: " # pulalinha: .asciiz "\n\n" # diveerr: .asciiz "O divisor não pode ser 0.\n\n" # ######################################################################################### .text # main: # pr: li $v0, 4 #Especifica o serviço de impressão£o (4 na tela) # la $a0, prompt1 #carregando o endereço prompt para o registrador # syscall #imprime a string de prompt1 # li $v0, 4 #Especifica o serviço de impressão (4 na tela) # la $a0, prompt2 #carregando o endereço prompt para o registrador # syscall #imprime a string de prompt2 # li $v0, 5 #Especifica o serviço de leitura de inteiros(cód: 5) # syscall #Lê o numero, ele estará armazenado em $v0 #- beq $v0, 5, fim #seleção 5 vai para fim de execução #
bge $v0, 6, err #se for maior que 6 vai para rotina de erro # ble $v0, 0, err #se for menor que 0 vai para rotina de erro # move $t7,$v0 #salva informação de operador informado pelo usuário # #Obtem o primeiro termo################################################################## li $v0, 4 #Especifica o serviço de impressão (4 na tela) # la $a0, termo1l #carregando o endereço prompt para o registrador # syscall #imprime a string de prompt # li $v0, 6 #Especifica o serviço de leitura de inteiros(cód: 5) # syscall #Lê o numero, ele estará armazenado em $v0 # mov.s $f1,$f0 #armazena o valor inserido pelo usuário # #Obtem o segundo termo################################################################### term2: li $v0, 4 #Especifica o serviço de impressão (4 na tela) # la $a0, termo2l #carregando o endereço prompt para o registrador # syscall #imprime a string de prompt # li $v0, 6 #Especifica o serviço de leitura de inteiros(cód: 5) # syscall #Lê o numero, ele estará armazenado em $v0 # mov.s $f3,$f0 # armazena o valor inserido pelo usuário # #determina a operação#################################################################### beq $t7, 1, soma #redireciona para sub-rotina de soma # beq $t7, 2, subt #redireciona para sub-rotina de subtração # beq $t7, 3, multi #redireciona para sub-rotina de multiplicação # beq $t7, 4, divi #redireciona para sub-rotina de divisão # soma: add.s $f5,$f3,$f1 #realiza a soma armazena em resultado # jal print #pula para impressão do resultado # subt: sub.s $f5, $f3,$f1 #armazena em $t2 o resultado de $t0 - $t1 # jal print #pula para impressão do resultado # multi: mul.s $f5, $f3, $f1 #armazena em $t2 o resultado de $t0 * $t1 # jal print #pula para impressão do resultado # divi: c.eq.s $f3,$f10 #se $f3=$f10 então flag 0 do coproc1 true # bc1t errdiv # pula caso flag 0 do coproc1 seja true # div.s $f5, $f3, $f1 #armazena em $t2 o resultado de $t0 / $t1 # jal print #pula para impressão do resultado # #Fim de Rotina########################################################################### #impressão na tela do resultado########################################################## print: li $v0,31 #parametro para a execução de som MIDI # la $a0, 70 #Carrega a nota musical no registrador # la $a1, 1000 #Tempo em milissegundos # la $a2, 0 #código do instrumento # la $a3, 127 #volume # syscall #executa o som # li $v0,4 #Especifica o serviço de impressão (4) # la $a0, resultadol #carrega a String no registrador # syscall #faz a chamada do sistema # li $v0,2 #Especifica o serviço de impressão de inteiro (3) # mov.s $f12, $f5 #carrega no registrador o numero a ser exibido # syscall #faz a chamada no sistema # li $v0,4 #Especificando o serviço de impressão de String # la $a0, pulalinha #Carrega a String para o registrado # syscall #faz a chamada de sistema # jal pr #vai para a rotina de prompt de menu # #Fim da Sub-rotina####################################################################### #Sub-rotina de erro de dividendo =0###################################################### errdiv: li $v0,31 #parametro para a execução de som MIDI # la $a0, 61 #Carrega a nota musical no registrador # la $a1, 1000 #Tempo em milissegundos # la $a2, 7 #código do instrumento # la $a3, 127 #volume # syscall #executa o som # li $v0, 4 #Especifica o serviço de impressão (4) # la $a0, diveerr #carregando o endereço final para o registrador # syscall #imprime a string de prompt # jal term2 #retorna a pedir o segundo termo da divisão # #Sub-Rotina de erro de inserção########################################################## err: li $v0,31 #parametro para a execução de som MIDI # la $a0, 61 #Carrega a nota musical no registrador # la $a1, 1000 #Tempo em milissegundos # la $a2, 7 #código do instrumento # la $a3, 127 #volume # syscall #executa o som # li $v0, 4 #Especifica o serviço de impressão (4 na tela) # la $a0, erro #carregando o endereço prompt para o registrador # syscall #imprime a string de prompt # jal pr #retorna para pr: # #Fim Sub-Rotina Err###################################################################### #Sub-Rotina de Finalização de execução################################################### fim: li $v0, 4 #Especifica o serviço de impressão (4) # la $a0, final #carregando o endereço final para o registrador # syscall #imprime a string de prompt # li $v0, 10 #Carrega o serviço de finalização de execução (10) # syscall #Fim de execução # #Fim da Sub-rotina#######################################################################