5 Programação em Assembly do MIPS

Download Report

Transcript 5 Programação em Assembly do MIPS

UFPR – Bacharelado em Ciência da Computação
CI210 – Projetos Digitais e Microprocessadores
Laboratório: Programação em Assembly — 2014-1
5
24 de março de 2014
Programação em Assembly do MIPS
Objetivos:
São dois os objetivos deste laboratório: (i) aprender usar o simulador
MARS; e (ii) escrever e testar um programa completo em assembly.
Preparação: Veja MARS_Tutorial.pdf e MARS_features.pdf em
http://www.inf.ufpr.br/roberto/ci210/assembly .
5.1
Programa que Computa a Série 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 função 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 então 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 instruções 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 solução.
UFPR, BCC, CI210–2014-1
2
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 = j∗i ;
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 código que imprime inteiros em fibonacci.s como modelo para o printf, alterando
o tipo de saída de inteiro para string. Os códigos das syscalls estão definidos em Help
→ MIPS → Syscalls.
A instrução lb rt , desl ( rs ) carrega o byte apontado por ( extSinal ( desl )+rs) no registrador rt . A instrução lbu rt , desl ( rs ) não estende o sinal do byte carregado. A instrução sb rt , desl ( rs ) armazena o byte menos significativo em rt no endereço apontado por
( extSinal ( desl )+rs).
UFPR, BCC, CI210–2014-1
3
Para alocar as strings em memória 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 não são 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 exercício é para aqueles que já utilizaram o Mars em outras disciplinas, e que chegaram
a esta tarefa com tempo disponível. Para aqueles que utilizam Mars pela primeira vez,
este exercício deve ser tentado fora do horário de aula.
Traduza o Programa 3 para assembly do MIPS e verifique sua corretude com MARS. Para
este exercício use os “desvios atrasados” do MIPS – as instruções que seguem os desvios
devem ser instruções úteis, ou nops. Para ativar os desvios atrasados ligue o botão Settings
→ Delayed branching.
Programa 3: Duas versões 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, CI210–2014-1
}
printf ( " % d ␣ % d \ n " ,n , f );
19
20
21
22
23
4
return (0);
}
Referências
[PH05] Organização e Projeto de Computadores - A Interface Hardware/Software, D A Patterson,
J L Hennessy. 3a Ed, Campus Elsevier.
EOF