# Emilio Francesquini e.francesquini@ufabc.edu.br # 2020.Q1 # Declara a função main como uma global .globl main # Seção de dados .data pi_single: .float 3.141516 # Valor float e_double: .double 2.7182818284590 # Valor double ola_mundo: .asciiz "Ola mundo!" # String com \0 no final digite_inteiro: .asciiz "Digite um inteiro: " digite_float: .asciiz "Digite um float: " digite_double: .asciiz "Digite um double: " # Todo o código do programa fica na seção de texto .text .macro print_quebra li $a0,'\n' li $v0, 11 # 11 é o código para imprimir um caractere syscall .end_macro # imprime inteiro em $a0 .macro print_int li $v0, 1 # 1 é o código para imprimir um inteiro syscall print_quebra .end_macro # imprime float em $f12 .macro print_float li $v0, 2 # 2 é o código para imprimir um float syscall print_quebra .end_macro # imprime double em $f12 .macro print_double li $v0, 3 # 3 é o código para imprimir um double syscall print_quebra .end_macro # imprime string apontada por $a0 .macro print_str li $v0, 4 # 4 é o código para imprimir uma string syscall print_quebra .end_macro # inteiro lido em $v0 .macro read_int li $v0, 5 # 5 é o código para ler um inteiro syscall .end_macro # float lido em $f0 .macro read_float li $v0, 6 # 6 é o código para ler um float syscall .end_macro # double lido em $f0 .macro read_double li $v0, 7 # 7 é o código para ler um double syscall .end_macro # $a0 = endereco do buffer $a1 = tamanho do buffer .macro read_str li $v0, 8 # 8 é o código para imprimir uma string syscall .end_macro # Função principal main: # Imprime Olá mundo la $a0, ola_mundo # coloca em a0 o parâmetro da chamada a syscall print_str #Le uma string addi $sp, $sp, -32 # aloca 32 bytes (caracteres) na pilha (31 uteis + \0) move $a0, $sp # indica endereco onde string deverá ser lida li $a1, 32 # indica tamanho do buffer read_str print_str addi $sp, $sp, 32 # libera memória # Imprime um inteiro li $a0, 42 print_int # Le inteiro la $a0, digite_inteiro print_str read_int move $a0, $v0 print_int # Imprime um float lwc1 $f12, pi_single print_float # Le float la $a0, digite_float print_str read_float mov.s $f12, $f0 print_float # Imprime um double ldc1 $f12, e_double print_double # Le um double la $a0, digite_double print_str read_double mov.d $f12, $f0 print_double # Sai do programa addi $v0, $zero, 10 # exit syscall code = 10 syscall