Buscar

Trabalho 2015 2

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Trabalho pratico 2015_2.docx
GCC117 – Arquitetura de Computadores I
2o semestre de 2015
Trabalho Prático
Professor: Demóstenes Zegarra Rodríguez
O objetivo desse trabalho é desenvolver habilidades de programação em Linguagem Assembly considerando a arquitetura do conjunto de instruções do MIPS. Para desenvolvimento e execução dos programas deve ser utilizado o simulador MARS rls 4.5.
O trabalho pode ser feito em grupo de até 3 estudantes.
Cada grupo deve implementar um programa na Linguagem Assembly para resolver cada um dos 6 problemas apresentados a seguir. Todos os programas devem conter instruções par entrada e saída dos dados (de acordo com cada problema).
Um único arquivo ZIP deve ser gerado com o código fonte dos programas. Esse arquivo deve ser enviado por e-mail (demostenes.zegarra@dcc.ufla.br. Ou no site do moodle. O prazo é uma semana antes da segunda prova (data a ser definida)
Basta um membro submeter a solução em favor do grupo. Coloque os nomes dos membros do grupo que participaram em cada código fonte .asm (parte incial do código).
Problemas:
Dado um número inteiro positivo n, calcular a soma dos n primeiros números inteiros positivos.
Dado um número inteiro positivo n, calcular o fatorial de n. Neste caso, a multiplicação deve ser implementada como um procedimento.
Dados três números inteiros positivos diferentes, mostrar qual é o maior entre eles. Os números devem ser ingresados pelo usuário e o resultado apresentado na tela.
Implementar o algoritmo Bubble Sort para ordenação de vetores de números inteiros com 5 elementos. O programa deve receber como entrada 5 números inteiros e mostrar os números ordenados. A troca de valores entre duas posições do vetor deve ser implementada como um procedimento. (Ver Seção 2.13 do livro-texto, página 119).
Dados três números naturais, verificar se eles formam os lados de um triângulo retângulo. Os números devem ser ingresados pelo usuário (ingresse primeiro número, ...) e o resultado apresentado na tela (menagem tipo: “São os lados de um trianfulo retângulo” ou “não são os lados de um triangulo retangulo”).
Implemente um programa em MIPS que tenha como saida um arquivo .txt. O conteudo desse arquivo deve ser ingresado de duas formas : (i) diretamente no programa (em variavel) e (ii) pelo usuário. Para ambos os casos o número de carateres de entrada deve ser limitado para 45. Para (i) salvar o arquivo com o nome arq1.txt e para (ii) com o nome arq2.txt.
1
ex1.asm
# Lucas Vicente Leite - 201110007
.data
mns1:	.asciiz	"Digite o Numero: "
mns2:	.asciiz	"\nSoma = "
.text
.globl	main
main:
	# Mostra a primeira mensagem
	li	$v0,4		
	la	$a0, mns1	
	syscall
	# Recebe o número do usuário
	li	$v0,5		
	syscall
	move	$t0,$v0		
	#A soma dos números inteiros positivos é dado pela fórmula n(n+1)/2
	# Inicializa os registros
	addi	$t1, $t0, 0	# t1 igual número n
	li	$t2, 0		# soma total
	addi $t1, $t1, 1	#n+1
	mul $t2, $t0, $t1	#n(n+1)
	div $t2, $t2, 2		#n(n+1)/2
	# Exit - imprime a mensagem 2
	li	$v0, 4		
	la	$a0, mns2
	syscall
	# Imprime a soma
	li	$v0,1		
	move	$a0, $t2
	syscall
	li	$v0,10		
	syscall
ex2.asm
# Lucas Vicente Leite - 201110007
.data
msgNumero:	.asciiz "\nEntre o numero para calcular o fatorial: "
msgResultado:	.asciiz "\nResultado: "
resultado:	.word 0
.text 
.globl	main
main:
	#primeira mensagem
	li $v0, 4 
	la $a0, msgNumero 
	syscall
	#lê número N
	li $v0, 5 
	syscall
	move $t0, $v0		#copia o número para $t0
	move $t1, $v0 		# inicializa o $t1 com o numero digitado para impressao do resultado final
loop: 
	blt $t0, $t1, sair	# se N < 1 então, sair...
	move $a0, $t0		# copia N no $a0
	jal fatorial		# senão chama o fatorial
	sw $v0, resultado
	li $v0, 4		# Imprime msgResultado
	la $a0, msgResultado
	syscall
	li $v0, 1		# Imprime resultado
	lw $a0, resultado
	syscall
	sub $t0, $t0, 1 # N = N - 1
	j loop
sair:
	li $v0, 10
	syscall
.globl fatorial
fatorial:
	subu $sp, $sp, 8
	sw $ra, ($sp)
	sw $s0, 4($sp)
	li $v0, 1 
	beq $a0, 0, fim_fatorial
	move $s0, $a0 
	sub $a0, $a0, 1
	jal fatorial
	mul $v0, $s0, $v0 
fim_fatorial:
	lw $ra ($sp)
	lw $s0, 4($sp)
	addu $sp,$sp, 8
	jr $ra
ex3.asm
# Lucas Vicente Leite - 201110007
.data 
num1:		.asciiz "Digite o primeiro numero: " 
num2:		.asciiz "Digite o segundo numero: " 
num3:		.asciiz "Digite o terceiro numero: " 
resultado:	.asciiz "O maior numero é: "
.text
.globl main 
main:
	#lê primeiro número e armazena t0
	li $v0, 4 
	la $a0, num1 
	syscall 
	li $v0, 5
	syscall 
	move $t0,$v0
	#lê segundo número e armazena t1
	li $v0, 4 
	la $a0, num2 
	syscall 
	li $v0, 5 
	syscall 
	move $t1,$v0
	#lê terceiro número e armazena t2
	li $v0, 4 
	la $a0, num3 
	syscall 
	li $v0, 5
	syscall 
	move $t2,$v0
	bge $t1, $t0, CMP 
	move $t1, $t0	# Se o $t0 for maior, move para o $t1
CMP:
	bge $t1, $t2, FIM 
	move $t1, $t2	# Se o $t2 for maior, move para o $t1
FIM:
	#imprimi o resultado
	li $v0, 4
	la $a0, resultado 
	syscall
	li $v0, 1
	move $a0, $t1
	syscall
	
	li $v0, 10
	syscall
ex4.asm
# Lucas Vicente Leite - 201110007
.data
msg1: .asciiz "\nDigite 5 números inteiros (pressione enter para cada número): "
msg2: .asciiz "\nA lista foi ordenada\n"
msgExtra1: .asciiz ", "
msgExtra2: .asciiz "\n"
.text
.globl main
main:
	move $s0,$gp		
	addi $t0, $t0, 1	
	add $t1,$zero,$zero	
	add $t2,$zero,$zero	
	add $t3,$zero,$zero	
	add $t6,$zero,$zero 
	add $t4,$zero,$zero 
	add $t7, $t7, 5		#maximo de numeros no array (5)
	
	li $v0,4		
	la $a0, msg1
	syscall
	
	add $s1,$s0,$zero	
	
digitaValores:
	beq $t7, 0 ,bubblesort # Se $t7 for 0, realisa o bubble sort, senão continua
	
	li $v0, 5
	syscall
	sb $v0,0($s1)	 # Coloca o valor no indice $s1
	addi $s1, $s1, 1 # Incrementa o indice
	add $t5,$s1,$zero 
	
	sub $t7, $t7, 1 #subtrai 1 de $t7 para continuar ou não o loop acima
	
	j digitaValores
	
bubblesort:
	add $t4,$s0,$zero
	addi $t6, $t6, 1
	#s1-1 -> s0
	sub $s1,$s1,$t0
	beq $s1,$s0,finaliza 	# se tudo certo, finaliza
	#s0 -> s1
	add $s2,$s0,$zero
	
loop:
	lb $t1,0($s2)		# primeiro elemento
	lb $t2,1($s2)		# segundo elemento
	slt $t3,$t2,$t1		
	beq $t3,$zero,proximo	
	sb $t2,0($s2)		
	sb $t1,1($s2)				
	
proximo:
	addi $s2, $s2, 1
	bne $s2,$s1,loop 
	
	li $v0,4
	la $a0,msgExtra2	# \n
	syscall
imprimir: #imprimir o array na sequencia atual
	li $v0,1
	lb $a0,0($t4)
	syscall
	
	li $v0,4
	la $a0,msgExtra1
	syscall		
	
	addi $t4, $t4, 1
	bne $t4, $t5, imprimir
	jal bubblesort
finaliza:
	li $v0,4
	la $a0,msg2
	syscall	
	li $v0,5
	syscall
ex5.asm
# Lucas Vicente Leite - 201110007
.data
lado1:		.asciiz "\nDigite o primeiro numero: "
lado2:		.asciiz "\nDigite o segundo numero: "
lado3:		.asciiz "\nDigite o terceiro numero: "
triangulo:		.asciiz "\nE um Triangulo!"
errado:		.asciiz "\nNao e um Triangulo!"
.text 
.globl	main
main:
	#lê lado 1 e armazena t1
	li $v0, 4 
	la $a0, lado1 
	syscall 
	li $v0, 5
	syscall 
	move $t1,$v0
	#lê lado 2 e armazena t2
	li $v0, 4 
	la $a0, lado2 
	syscall 
	li $v0, 5 
	syscall 
	move $t2,$v0
	#lê lado 3 e armazena t3
	li $v0, 4 
	la $a0, lado3
	syscall
	li $v0, 5
	syscall 
	move $t3,$v0
	#Verificação se a soma de dois lados é maior do que o terceiro lado
	add $t4, $t1, $t2
	bge $t3, $t4, naoTriangulo
	add $t4, $t1, $t3
	bge $t2, $t4, naoTriangulo
	add $t4, $t2, $t3
	bge $t1, $t4, naoTriangulo
	
	#Passou todos os testes
	li $v0, 4 
	la $a0, triangulo
	syscall
	j exit
	
naoTriangulo:
	li $v0, 4
	la $a0, errado
	syscall
exit:
	li	$v0,10		
	syscall
	
ex6.asm
# Lucas Vicente Leite - 201110007

Teste o Premium para desbloquear

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

Continue navegando