Vous êtes sur la page 1sur 4

UFPR Bacharelado em Cincia da Computao

CI210 Projetos Digitais e Microprocessadores


Laboratrio: Programao em Assembly 2014-1

24 de maro de 2014

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.

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.

UFPR, BCC, CI2102014-1

Programa 1: fatorial.s
1
2

# 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

3
4
5
6
7
8

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

vi:
vj:
resp:

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

# a r e a de dados
# a l o c a e s p a c o para v a r i a v e i 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

# a r e a de c o 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

# }

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 ) 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).

UFPR, BCC, CI2102014-1

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. As diretivas aceitas pelo montador do Mars no so as mesmas providas pelo as.
Veja o tutorial ao Mars para a lista das diretivas que este prov.
Programa 2: strcpy.c
1
2
3
4
5
6
7
8

char fte [16]= " abcd - efgh - ijkl - " ;


char dst [16]= { \0 };

// i n i c i a l i z a

v e t o r com \ 0

void main ( void ) {


int i ,f , n ;
i =0;
// 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
while ( ( dst [ i ] = fte [ i ]) != \0 ) // a t r i b u i e e n t a o compara
i ++;
// i n c l u i \ 0 na contagem

9
10
11
12
13
14

// s u a v e r s a o a s s e m b l y de p r i n t f ( ) d e v e t e r um
// numero f i x o de a r g u m e n t o s
printf ( " fonte : % s \ n " , fte );
printf ( " dest : % s \ n " , dst );
printf ( " tam : % d \ n " , i );

15
16
17
18

return (0);

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. Para
este exerccio use os desvios atrasados do MIPS as instrues que seguem os desvios
devem ser instrues teis, ou nops. Para ativar os desvios atrasados ligue o boto Settings
Delayed branching.
Programa 3: Duas verses do fatorial iterativo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

void main ( void ) {


int i ,f , n ;
n =5;
i = f =1;
do {
f = f * i;
i = i + 1;
} while ( i <= n );
printf ( " % d % d \ n " ,n , f );
f =1;
i=n;
while ( i > 0) {
f= f*i;
i = i - 1;

UFPR, BCC, CI2102014-1

}
printf ( " % d % d \ n " ,n , f );

19
20
21
22
23

return (0);
}

Referncias
[PH05] Organizao e Projeto de Computadores - A Interface Hardware/Software, D A Patterson,
J L Hennessy. 3a Ed, Campus Elsevier.
EOF

Vous aimerez peut-être aussi