Você está na página 1de 4

UFPR Bacharelado em Cincia da Computao

CI210 Projetos Digitais e Microprocessadores


Laboratrio: Programao em Assembly 2016-1

15 de janeiro de 2016

Programao em Assembly do MIPS

Objetivos: So dois os objetivos deste laboratrio: (i) aprender usar o simulador MARS; e
(ii) escrever e testar um programa completo em assembly.
Preparao: Veja MARS_Tutorial.pdf e MARS_features.pdf em
http://www.inf.ufpr.br/roberto/ci210/assembly .

5.1

Programa que Computa a Srie de Fibonacci

Para executar o simulador MARS diga:


java -jar /home/soft/linux/mips/Mars.jar
Possivelmente, seria uma boa ideia acrescentar ao seu ~/.bashrc a funo que contenha esta
linha de comando. Edite ~/.bashrc e acrescente o seguinte, preferencialmente no final do
arquivo:
function mars() { java -jar /home/soft/linux/mips/Mars.jar "$@" ; }
Isso feito, diga source ~/.bashrc e ento invoque o simulador dizendo apenas mars .
Copie http://www.inf.ufpr.br/roberto/ci210/assembly/fibonacci.s para a sua rea
de trabalho e siga as instrues em MARS_Tutorial.pdf.

UFPR, BCC, CI2102016-1

5.2

Programa que Computa o Fatorial

Copie http://www.inf.ufpr.br/roberto/ci210/assembly/fatorial.s para a sua rea de


trabalho e verifique se o programa produz resultados corretos. Se encontrar algum erro,
corrija-o e verifique sua soluo.
Programa 1: fatorial.s
# v o i d main ( v o i d ) { // f a t o r i a l i t e r a t i v o
#
vi:
vj:
resp:

int i , j ;
.data
.word 1
.word 1

# r e a de dados
# a l o c a e s p a o para v a r s g l o b a i s
# apenas como e x e m p l o . . .

. a s c i i z " f a t o r i a l de 5 = "
.text
. g l o b l main

# constante tipo string

# r e a de c d i g o
# d e f i n e main como nome g l o b a l

main:
#

j =1;
ad di $t1 , $ z e r o , 1

f o r ( i =1; i <= n ; i ++)


ad di $t4 , $ z e r o , 1

for:

s l t i $t7 , $t4 , 6
beq $t7 , $ z e r o , f i m f o r

# n < 6

fat (5)

j = ji ;
mult $t1 , $ t 4
mflo $ t 4
ad di $t4 , $t4 , 1
j for

f i m f o r : ad di $v0 , $ z e r o , 4
l a $a0 , r e s p
syscall
ad di $v0 , $ z e r o , 1
addu $a0 , $ z e r o , $ t 1
syscall
#

# }

return ( 0 ) ;
l i $v0 , 10
syscall

# imprime r e s p o s t a
# s y s c a l l ( 4 ) = imprime s t r i n g

# imprime i n t e i r o
# s y s c a l l ( 1 ) = imprime i n t e i r o

# t e r m i n a programa
# s y s c a l l ( 1 0 ) = t e r m i n a programa

UFPR, BCC, CI2102016-1

5.3

Programa para Copiar Strings

Traduza o Programa 2 para assembly do MIPS e verifique sua corretude com MARS. Use o
cdigo que imprime inteiros em fibonacci.s como modelo para o printf, alterando o tipo
de sada de inteiro para string.
Os cdigos das syscalls esto definidos em Help MIPS Syscalls.
A instruo lb rt , desl ( rs ) carrega o byte apontado por ( extSinal ( desl )+rs) no registrador rt .
A instruo lbu rt , desl ( rs ) similar lb mas no estende o sinal do byte carregado.
A instruo sb rt , desl ( rs ) armazena o byte menos significativo em rt no endereo apontado
por ( extSinal ( desl )+rs).
Para alocar as strings em memria use a linha 8 do Programa 1 como exemplo. A diretiva
.asciiz aloca uma string incluindo o \0, enquanto que .ascii aloca uma string sem
o \0. Veja o tutorial ao Mars para a lista das diretivas que este prov.
As diretivas aceitas pelo montador do Mars no so as mesmas providas pelo mips-as.
Programa 2: strcpy.c
char f t e [ 1 6 ] = " abcde f g h i j k l " ;
char d s t [ 1 6 ] = { \0 } ;

// i n i c i a l i z a com \ 0

v o i d main ( v o i d ) {
int i , f , n ;
i =1;
// i n c l u i \ 0 na contagem
// c o p i a e computa tamanho da c a d e i a , i n c l u s i v e \ 0
w h i l e ( ( d s t [ i ] = f t e [ i ] ) != \0 ) // a t r i b u i e e n t o compara
i ++;
d s t [ i ] = \0 ;
// sua v e r s o assembly de p r i n t f ( ) deve t e r um
// nmero f i x o de argumentos
p r i n t f ( " f o n t e : %s \n " , f t e ) ;
p r i n t f ( " d e s t : %s \n " , d s t ) ;
p r i n t f ( " tam : %d \n " , i ) ;
return ( 0 ) ;
}

UFPR, BCC, CI2102016-1

5.4

Mais do Fatorial

Este exerccio para aqueles que j utilizaram o Mars em outras disciplinas, e que chegaram
a esta tarefa com tempo disponvel. Para aqueles que utilizam Mars pela primeira vez, este
exerccio deve ser tentado fora do horrio de aula.
Traduza o Programa 3 para assembly do MIPS e verifique sua corretude com MARS.
Programa 3: Duas verses do fatorial iterativo
v o i d main ( v o i d ) {
int i , f , n ;
n =5;
i=f =1;
do {
f = f i;
i = i + 1;
} w h i l e ( i <= n ) ;
p r i n t f ( "%d%d\n " , n , f ) ;
f =1;
i=n ;
while ( i > 0) {
f= f i ;
i = i 1;
}
p r i n t f ( "%d%d\n " , n , f ) ;
return ( 0 ) ;
}

Referncias
[RH14] CI064 Software Bsico, Roberto A Hexsel, 2014, http://www.inf.ufpr.br/roberto/
ci064/swbas.pdf
EOF