Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
######################### Estruturas usadas no programa ####################################### # struct cliente{ # int Id; 0 # cliente *proximo; 4 # Char Nome[50]; 8 # fatura *faturas; 58 # }Total 62 de espaço para a estrutura # # struct fatura{ # fatura Id, Mes, ano; 0-8 # float valor; 12 # char status; Status da fatura, 0 = pago, 1 = Não pago. 16 # fatura *proximo; 17 # }Total 21 de espaço para a estrutura # .data Lista.Cliente.Raiz : .word 0 # raiz da lista. Lista.Cliente.Ultimo : .word 0 # Ultimo cliente adicionado. .text ######################### Alerta e textos do programa ######################################### .data Cliente.Msg.Print.Id : .asciiz "Codigo: " Cliente.Msg.Print.Nome : .asciiz ", Nome: " Cliente.Msg.Request.Id : .asciiz "Informe o Id do cliente" Cliente.Msg.Request.Nome: .asciiz "Informe o Nome do Cliente" Msg.Error.NotInt: .asciiz "O valor informado não e valido, digite apenas caracteres de 0-9" Msg.Error.IsNull: .asciiz "O valor não pode ser vazio" Msg.Error.Overflow: .asciiz "Nome informado não pode passar de 50 digitos" Msg.Error.MesInvalido: .asciiz "Mes deve ter o valor entre 1-12" Fatura.Msg.Request.Id: .asciiz "Informe o Id da fatura" Fatura.Msg.Request.Mes: .asciiz "Informe o Mês da fatura" Fatura.Msg.Request.Ano: .asciiz "Informe o Ano da fatura" Fatura.Msg.Request.Valor: .asciiz "Informe o total da fatura" Fatura.Msg.Request.Status: .asciiz "A fatura foi paga ?" Main.Loop: .asciiz "Deseja Adicionar outro cliente ?" .text ######################## Tela Principal ##################################################### Main: la $a0, Main.Loop # Mensage na tela li $v0, 50 # Syscall para ler um inteiro da tela. syscall beqz $a0,Cliente.Novo j Lista.Cliente.PrintAll #sub rotina para adicionar uma nova conta ao cliente, $a0 codigo do cliente, #sub rotina para criar uma fatura Fatura.Novo: li $a0, 21 # $v0 = Malloc(sizeof(Fatura)); li $v0, 9 # Syscall para o "malloc" syscall move $t3, $v0 #$t3 = &NovaFatura #pegando o Id da fatura. Fatura.Novo.RequestId: la $a0, Fatura.Msg.Request.Id # Mensage na tela li $v0, 51 # Syscall para ler um inteiro da tela. syscall jal Fatura.Valida.Id # Verifica o valor informado ###Pegando o Nome do Cliente Fatura.Novo.RequestMes: la $a0, Fatura.Msg.Request.Mes # Mensage na tela li $v0, 51 # Syscall para ler um inteiro da tela. syscall jal Fatura.Valida.Mes # Verifica o valor informado Fatura.Novo.RequestAno: la $a0, Fatura.Msg.Request.Ano # Mensage na tela li $v0, 51 # Syscall para ler um inteiro da tela. syscall jal Fatura.Valida.Ano # Verifica o valor informado Fatura.Novo.RequestValor: la $a0, Fatura.Msg.Request.Valor # Mensage na tela li $v0, 52 # Syscall para ler um float da tela. syscall jal Fatura.Valida.Valor # Verifica o valor informado Fatura.Novo.RequestStatus: la $a0, Fatura.Msg.Request.Status # Mensage na tela li $v0, 50 # Syscall para ler uma string da tela syscall jal Fatura.Valida.Status # Verifica o valor informado ############################## Sub rotinas para os dados da Fatura ##################################### Fatura.Valida.Id : bnez $a1, Fatura.Error.Id # verifica se o Id informado esta OK. sw $a0, 0($t3) # Salva o Id da fatura no registro. jr $ra Fatura.Error.Id: beq $a1, -1, Fatura.Error.Id.NotInt beq $a1, -3, Fatura.Error.Id.IsNull beq $a1, -2, Fatura.Error.Cancel Fatura.Error.Id.NotInt: la $a0, Msg.Error.NotInt li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestId Fatura.Error.Id.IsNull: la $a0, Msg.Error.IsNull li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestId Fatura.Valida.Mes : bnez $a1, Fatura.Error.Mes # verifica se o valor informado e um inteiro. li $t0, 12 bgt $a1, $t0 Fatura.Error.MesInvalido #if(mes > 12) blez $a1, Fatura.Error.MesInvalido #if(mes < 1) sw $a0, 4($t3) # Salva o mes da fatura no registro. jr $ra Fatura.Error.Mes: beq $a1, -1, Fatura.Error.Mes.NotInt beq $a1, -3, Fatura.Error.Mes.IsNull beq $a1, -2, Fatura.Error.Cancel Fatura.Error.Mes.NotInt: la $a0, Msg.Error.NotInt li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestMes Fatura.Error.Mes.IsNull: la $a0, Msg.Error.IsNull li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestMes Fatura.Erro.MesInvalido: la $a0, Msg.Error.MesInvalido li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestMes Fatura.Valida.Ano : bnez $a0, Fatura.Error.Ano # verifica se o valor informado e um inteiro. sw $a0, 8($t3) # Salva o mes da fatura no registro. jr $ra Fatura.Error.Ano: beq $a1, -1, Fatura.Error.Ano.NotInt beq $a1, -3, Fatura.Error.Ano.IsNull beq $a1, -2, Fatura.Error.Cancel Fatura.Error.Ano.NotInt: la $a0, Msg.Error.NotInt li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestAno Fatura.Error.Ano.IsNull: la $a0, Msg.Error.IsNull li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestAno Fatura.Valida.Valor : bnez $a0, Fatura.Error.Valor # verifica se o valor informado e um float. sw $a0, 12($t3) # Salva o mes da fatura no registro. jr $ra Fatura.Error.Valor: beq $a1, -1, Fatura.Error.Valor.NotInt beq $a1, -3, Fatura.Error.Valor.IsNull beq $a1, -2, Fatura.Error.Cancel Fatura.Error.Valor.NotInt: la $a0, Msg.Error.NotInt li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestValor Fatura.Error.Valor.IsNull: la $a0, Msg.Error.IsNull li $a1, 0 li $v0, 55 syscall j Fatura.Novo.RequestValor Fatura.Valida.Status: li $t0, 2 beq $a1,$t0, Fatura.Error.Cancel sw $a0, 16($t3) jr $ra Fatura.Error.Cancel: #Não funciona D: #li $a0, 21 # free(NovaFatura) #li $v0, 9 # Syscall para o "free" #syscall j Main ############################## sub rotinas para Validar os Dados do Cliente ############################ Cliente.Valida.Id : bnez $a1, Cliente.Error.Id # verifica se o Id informado esta OK. sw $a0, 0($t3) # Salva o Id do cliente no registro. jr $ra Cliente.Error.Id: beq $a1, -1, Cliente.Error.Id.NotInt beq $a1, -3, Cliente.Error.Id.IsNull beq $a1, -2, Cliente.Error.Cancel Cliente.Error.Id.NotInt: la $a0, Msg.Error.NotInt li $a1, 0 li $v0, 55 syscall j Cliente.Novo.RequestId Cliente.Error.Id.IsNull: la $a0, Msg.Error.IsNull li $a1, 0 li $v0, 55 syscall j Cliente.Novo.RequestId Cliente.Valida.Nome: bnez $a1, Cliente.Error.Nome # verifica se o Nome informado esta OK. jr $ra Cliente.Error.Nome: beq $a1, -3, Cliente.Error.Nome.IsNull beq $a1, -4, Cliente.Error.Nome.OverFlow beq $a1, -2, Cliente.Error.Cancel Cliente.Error.Nome.IsNull: la $a0, Msg.Error.IsNull li $a1, 0 li $v0, 55 syscall j Cliente.Novo.RequestNome Cliente.Error.Nome.OverFlow: la $a0, Msg.Error.Overflow li $a1, 0 li $v0, 55 syscall j Cliente.Novo.RequestNome Cliente.Error.Cancel: #Não achei nenhuma função que libere memoria :( j Main ####################### Rotina para Criar um novo cliente na Heap. ############################## Cliente.Novo: li $a0, 62 # $v0 = Malloc(sizeof(Cliente)); li $v0, 9 # Syscall para o "malloc" syscall move $t3, $v0 #$t3 = &NovoCliente #requisitando o Id do Cliente Cliente.Novo.RequestId: la $a0, Cliente.Msg.Request.Id # Mensage na tela li $v0, 51 # Syscall para ler um inteiro da tela. syscall jal Cliente.Valida.Id # Verifica o valor informado ###Pegando o Nome do Cliente Cliente.Novo.RequestNome: la $a0, Cliente.Msg.Request.Nome # Mensage na tela addi $a1, $t3, 8 li $a2, 50 # tamanho do buffer li $v0, 54 # Syscall para ler uma string da tela syscall jal Cliente.Valida.Nome #valida o valor informado j Lista.Cliente.Add ############################## Rotina para exibir os cliente os Dados do Cliente ############################ Lista.Cliente.PrintAll: lw $t0, Lista.Cliente.Raiz Lista.Cliente.PrintAll.Loop: beqz $t0, Lista.Cliente.PrintAll.LoopEnd la $a0, Cliente.Msg.Print.Id li $v0,4 syscall lw $a0, 0($t0) li $v0,1 syscall la $a0, Cliente.Msg.Print.Nome li $v0,4 syscall la $a0, 8($t0) li $v0, 4 syscall lw $t0, 4($t0) # Carrega o proximo. j Lista.Cliente.PrintAll.Loop Lista.Cliente.PrintAll.LoopEnd: j Main #Sub rotina para adicionar registro na lista encadeada, recebe o endereço do novo registro em $t3 Lista.Cliente.Add: lw $t5, Lista.Cliente.Ultimo beqz $t5, Lista.Cliente.Add.ListIsNull # if(Ultimo == 0)Go to ListIsNull; sw $t3, 4($t5) # UltimoCliente->Proximo = &NovoCliente; Esta variavel esta na "HEAP" não no .data la $t5, Lista.Cliente.Ultimo sw $t3,0($t5) # Lista->Ultimo = &NovoCliente; # Esta variavel esta no .data não na "HEAP" j Main Lista.Cliente.Add.ListIsNull: la $t5, Lista.Cliente.Ultimo la $t7, Lista.Cliente.Raiz sw $t3, 0($t5) #Lista->Ultimo = &NovoCliente; #Esta variavel esta no .data não na "HEAP" sw $t3, 0($t7) #Raiz = &NovoCliente; #Esta variavel esta no .data não na "HEAP" j Main ######################### Saida do programa ######################### Saida: #addi $a0, $t3, 16 #li $a1, 1 #li $v0, 55 #syscall
Compartilhar