Baixe o app para aproveitar ainda mais
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
Compartilhar