Buscar

Trabalho em MIPS

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

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando