Escolar Documentos
Profissional Documentos
Cultura Documentos
Guia Mips PDF
Guia Mips PDF
2004 / 2005
Introduo ao
Assembly usando o
Simulador SPIM
Guia dos Laboratrios
Pedro F. Campos
Departamento de Matemtica e Engenharias
Universidade da Madeira
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
3
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
4
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
5
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
6
1
Introduo ao Assembly e ao
Simulador SPIM
There are three reasons to program in Assembly: speed, speed and speed.
In The Art of Assembly
O objectivo desta aula a familiarizao com a ferramenta que ser utilizada ao longo
de todo o semestre: o simulador SPIM, que simula um processador MIPS R2000. Ire-
mos aprender tambm a estrutura bsica de um programa em linguagem Assembly, e
tentaremos compreend-lo usando as ferramentas de depurao do simulador.
Introduo ao Assembly
A linguagem Assembly no mais do que uma representao simblica da codifica-
o binria de um computador: a linguagem mquina. A linguagem mquina com-
posta por micro-instrues que indicam que operao digital deve o computador
fazer. Cada instruo mquina composta por um conjunto ordenado de zeros e uns,
estruturado em campos. Cada campo contm a informao que se complementa para
indicar ao processador que aco realizar.
A linguagem Assembly oferece uma representao mais prxima do programador, o
que simplifica a leitura e escrita dos programas. Cada instruo em linguagem
Assembly corresponde a uma instruo de linguagem mquina, mas, em vez de ser
especificada em termos de zeros e uns, especificada utilizando mnemnicas e nomes
simblicos. Por exemplo, a instruo que soma dois nmeros guardados nos registos
R0 e R1 e colocar o resultado em R0 poder ser codificada como ADD R0,R1 . Para ns,
humanos, muito mais fcil memorizar esta instruo do que o seu equivalente em
linguagem mquina.
1
Este tipo de computadores so designados por computadores embebidos (do ingls embedded
computers.
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
A ideia geral
A linguagem Assembly uma linguagem de programao. A principal diferena entre
esta linguagem e as linguagens de alto nvel (como C, C++ ou Java) est no facto de s
disponibilizar ao programador poucas e simples instrues e tipos de dados. Os pro-
gramas em Assembly no especificam o tipo de dados de uma varivel (e.g. float ou
int) e tem tambm de ser o programador a implementar tudo o que tenha a ver com
controlo de fluxo, isto , ciclos, saltos etc...
Estes factores fazem com que a programao em Assembly seja mais propcia a erros e
mais difcil de entender do que o habitual, da a necessidade de um forte rigor e disci-
plina ao desenvolver programas nesta linguagem.
8
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
O simulador SPIM
O SPIM S20 um simulador que corre programas para as arquitecturas MIPS R2000 e
R3000. O simulador pode carregar e executar programas em linguagem Assembly des-
tas arquitecturas. O processo atravs do qual um ficheiro fonte em linguagem
Assembly traduzido num ficheiro executvel compreende duas etapas:
assembling, implementada pelo assemblador
linking, implementada pelo linker
O assemblador realiza a traduo de um mdulo de linguagem Assembly em cdigo
mquina. Um programa pode conter diversos mdulos, cada um deles parte do pro-
grama. Isto acontece usualmente, quando se constri uma aplicao a partir de vrios
ficheiros.
A sada do assemblador um mdulo objecto para cada mdulo fonte. Os mdulos
objecto contm cdigo mquina. A traduo de um mdulo no fica completa caso o
mdulo utilize um smbolo (um label) que definido num mdulo diferente ou parte
de uma biblioteca.
aqui que entra o linker. O seu objectivo principal resolver referncias externas. Por
outras palavras, o linker ir emparelhar um smbolo utilizado no mdulo fonte com a
sua definio encontrada num outro mdulo ou numa biblioteca. A sada do linker
um ficheiro executvel.
O SPIM simula o funcionamento do processador MIPS R2000. A vantagem de utilizar
um simulador provm do facto de este fornecer ferramentas de visualizao e depura-
o dos programas que facilitam a tarefa sem prejuzo da aprendizagem desta lingua-
gem. Alm disso, o uso de um simulador torna-o independente da mquina (ou seja,
no necessrio comprar um processador MIPS e podemos utilizar o simulador numa
variedade de plataformas, e.g. Windows, Mac, UNIX...).
A janela do SPIM encontra-se dividida em 4 painis:
Painel dos Registos. Actualizado sempre que o programa pra de correr. Mostra o
contedo de todos os registos do MIPS (CPU e FPU).
Painel de Mensagens. Mostra as mensagens de erro, sucesso, etc.
Segmento de Dados. Mostra os endereos e contedos das palavras em memria.
Segmento de Texto. Mostra as instrues do nosso programa e tambm as instrues
do ncleo (kernel) do MIPS. Cada instruo apresentada numa linha:
[0x00400000] 0x8fa40000 lw $4,0($29) ; 89: lw $a0, 0($sp)
9
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
.text
.globl main
# No interior do main existem algumas chamadas (syscalls) que
# iro alterar o valor do registo $ra o qual contm inicialmente o
# endereo de retorno do main. Este necessita de ser guardado.
main: addu $s0, $ra, $0 # guardar o registo $31 em $16
li $v0, 4 # chamada sistema print_str
la $a0, msg1 # endereo da string a imprimir
syscall
O contedo do registo $ra guardado noutro registo. O registo $ra (utilizado para o
mecanismo de chamada/retorno) tem de ser salvo entrada do main apenas no caso
de se utilizar rotinas de sistema (usando syscall) ou no caso de se chamar as nossas
prprias rotinas. A gesto das rotinas ser mais tarde explicada em pormenor.
Guardar o contedo de $ra em $s0 (ou em qualquer outro registo com esse fim) ape-
nas funciona se s houver um nvel de chamada (ou seja, caso no haja chamadas re-
cursivas da rotina) e se as rotinas no alterarem o registo usado para guardar o
endereo de retorno.
Q1.3. Tente descobrir o que faz o programa anterior.
Q1.4. Crie um novo programa alterando a primeira linha que comea com a etiqueta
main para:
label1: li $v0, 4 # chamada sistema print_int
Para cada smbolo, o simulador mostra o endereo de memria onde a instruo eti-
quetada est armazenada. Qual a dimenso de uma instruo (em bytes)?
Q1.5. Usando o step do simulador, preencha a seguinte tabela:
Etiqueta Endereo (PC) Instruo Nativa Instruo Fonte
10
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Agora iremos aprender a colocar breakpoints no programa. Vamos supor que quere-
mos parar a execuo do programa na instruo
[0x00400040] sll $t0,$t0,2
Verifique o endereo onde esta instruo reside e adicione um breakpoint nesse endere-
o. Corra o programa.
O programa inseriu um break antes de executar a referida instruo. Tome nota do
valor do registo $t0 antes da execuo da instruo sll. Agora faa step. Qual o novo
valor do registo $t0?
11
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
12
2
Gesto dos Dados em Memria
"The struggle of man against power is the struggle of memory against forgetting."
Milan Kundera
A directiva .data [end] indica o incio da zona designada por segmento de dados. Se
no especificarmos o endereo [end] ento o SPIM utilizar, por omisso, o endereo
0x10010000.
Q2.12. Que intervalo de posies foram reservadas para a varivel espaco? Quantos
bytes foram reservados no total? E quantas palavras?
14
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Q2.13. Que intervalo de posies de memria foram reservadas para a varivel espa-
co? A partir de que endereos se inicializaram byte1 e byte2? E a partir de que endere-
o se inicializou pal? Porqu?
Faa agora a seguinte alterao:
.data
byte1: .byte 0x10
.align 2
espaco: .space 4
byte2: .byte 0x20
pal: .word 10
Q2.15. Consulte o manual para descobrir o que faz a instruo lui. Carregue o pro-
grama e anote o contedo do registo $s0. Qual a dimenso total (em bits) dos registos?
Agora faa a seguinte alterao:
.text
main: lui $s0,0x98765432
15
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
A instruo sw armazena a palavra contida num registo para uma posio de mem-
ria. O endereo dessa posio , tal como anteriormente, obtido somando o contedo
de um registo com o deslocamento especificado na instruo (identificador).
Q2.22. Verifique o efeito deste programa. De seguida, altere o programa para:
.data
pal1: .word 0x10203040
pal2: .space 4
pal3: .word 0xffffffff
.text
main: lw $s0,pal1
sw $s0,pal2
sw $s0,pal3+0
16
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
1 Trabalho de Laboratrio
17
3
Operaes Aritmticas e Lgicas e
Avaliao de Condies
Arithmetic is where the answer is right and everything is nice and you can look out of the
window and see the blue sky - or the answer is wrong and you have to start over and try again
and see how it comes out this time.
Carl Sandburg
Operaes Aritmticas
Crie um ficheiro com o seguinte programa:
.data
numero: .word 2147483647
.text
main: lw $t0,numero($0)
addiu $t1,$t0,1
lw $t1,num2($0)
subu $t0,$t0,$t1
lw $t1,num3($0)
subu $t0,$t0,$t1
sw $t0,num1($0)
Q3.3. O que faz este programa? O resultado que fica armazenado no endereo num3 o
resultado correcto? Porqu?
Q3.4. O que acontece se alterarmos as instrues subu por sub?
Q3.5. Escreva um programa em Assembly do MIPS que armazene um vector de intei-
ros V=[1 2 3] e armazene o resultado da soma dos seus trs elementos na posio de
memria cujo endereo o primeiro endereo aps o fim do vector.
Q3.6. Escreva um programa em Assembly que realize a seguinte operao:
f=(g-h)+(i-j)
Este programa declara duas variveis num1 e num2, carrega-as para os registos $t0 e $t1
respectivamente e armazena o resultado da multiplicao nas palavras que vm
depois dessas variveis (a directiva .space reserva espao para essas duas palavras).
Que resultado se obtm aps executar este programa? Porque fica o resultado arma-
zenado em duas palavras de memria?
Q3.8. Modifique o cdigo anterior para que num1 e num2 sejam respectivamente 10 e 3.
Escreva cdigo para dividir num1 por num2 e coloque o quociente e resto nas posies
que vm a seguir a num1 e num2.
Operaes Lgicas
As operaes lgicas de deslocamento(shifts) permitem deslocar bits dentro duma
palavra, shift left para a esquerda e shift rightpara a direita.
Outra classe de operaes lgicas so o AND, OR e XOR, que operam entre duas
palavras, numa correspondncia unvoca, e operam bit a bit.
Por exemplo, para colocar o bit 2 de uma palavra de 32 bits a 1:
addi $t0,$0,0x000055aa # t0 = 0000 0000 0000 0000 0101 0101 1010 1010
19
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Operaes de Rotao
Q3.11. Escreva um programa em Assembly que receba da consola um nmero inteiro,
divida esse nmero por 4 (utilizando um operador de rotao) e escreva o nmero
outra vez na consola.
Q3.12. Escreva um programa que inverta os bits de um nmero.
20
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Q3.14. Modifique o cdigo anterior para avaliar a condio: res fica a 1 no caso de
var1=var2.
21
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
22
4
Estruturas de controlo condicional
Would you tell me, please, which way I ought to go from here?
That depends a good deal on where you want to get to. said the Cat.
I don't much care where said Alice.
Then it doesn't matter which way you go. said the Cat.
so long as I get somewhere. Alice added as an explanation.
Lewis Carroll, Alice's Adventures in Wonderland
No captulo anterior vimos como realizar comparaes entre variveis. Estas compa-
raes servem para introduzirmos a implementao de estruturas de controlo do fluxo
do programa.
O seguinte programa implementa uma estrutura de controlo condicional do tipo se...
ento:
.data
var1: .word 40
var2: .word 30
res: .space 4
.text
main: lw $t0,var1($0) # carrega var1 em t0
lw $t1,var2($0) # carrega var2 em t1
and $t2,$t2,$0 # t2 = 0
se: beq $t1,$0,fimse # se t1 = 0, salta para fim do se
entao: div $t0,$t1 # t0/t1
mflo $t2 # armazenar LO em $t2
fimsem: add $t3,$t0,$t1 # t3 = t0 + t1
add $t2,$t3,$t2 # t2 = t3 + t2
sw $t2,res($0) # guardar t2 em res
O programa dever reservar espao em memria para trs variveis designadas por
var1, var2 e var3 (do tamanho de uma palavra) e os valores iniciais dessas variveis
sero, respectivamente, o primeiro e ltimo dgitos do seu B.I. Var3 ser inicializada
com 2003.
Note que tmp uma varivel temporria, pelo que dever utilizar qualquer um dos
registos $t0 a $t9.
24
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
E em seguida leia o inteiro para uma posio de memria etiquetada por inteiro. O
programa dever ento verificar se o valor introduzido menor do que 1000. Se for, o
programa imprime o resultado de multiplicar o inteiro lido por 200, seguido da men-
sagem fim. Se no for, o programa exibe a seguinte mensagem de erro e termina:
Introduziu um inteiro maior que 1000.
Teste o seu programa com uma gama de valores de teste para verificar a sua correo.
2 Trabalho de Laboratrio
25
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Q4.5. Comprove o efeito deste programa carregando-o no SPIM. Que valor fica arma-
zenado na varivel n?
Q4.6. Implemente o seguinte programa escrito em pseudo-cdigo:
variveis:
string cadeia1 = AC-Uma;
string cadeia2 = Labs;
int n;
incio: {
i = 0;
n = 0;
enquanto (cadeia1[i] != 0) e (cadeia2[i] != 0) fazer {
n = n + 1;
i = i + 1;
}
}
26
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
A descrio em pseudo-cdigo deste programa Assembly pode ser vista como uma
estrutura do tipo Enquanto:
variveis:
int vector[] = {1,2,3,4,5,6};
int res;
incio: {
res = 0;
i = 0;
enquanto (i <= 6) fazer {
res = res + vector[i];
i = i + 1;
}
}
Mas tambm pode ser vista como uma estrutura do tipo Para (semelhante ao for
do C, disponvel tambm em muitas outras linguagens de alto nvel como Java, Pascal,
etc.):
variveis:
int vector[] = {1,2,3,4,5,6};
int res;
incio: {
res = 0;
i = 0;
para i de 0 at 5 fazer {
res = res + vector[i];
i = i + 1;
}
}
27
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Um Exemplo
Como exemplo, sigamos o seguinte programa, que implementa o programa em C
equivalente (em comentrio):
.data # declara segmento de dados
str: .asciiz AC-Uma # uma string arbitrria terminada por nulo
#
# Princpio do Segmento de Texto
#
.text # declara segmento de cdigo
main:
add $t1,$0,$0 # inicializa apontador (index)
# Este cdigo SPIM implementa o seguinte programa em C:
#
# int t1;
# t1=0;
# while (str[t1] != '\0')
# t1++;
# return t1;
#
# Neste loop do SPIM, o valor de $t1 assume o papel da varivel i (em C)
ciclo: lb $t5,str($t1) # carrega byte (ler um caracter)
beq $t5,$0,fim # termina se for caracter sentinela ('\0')
addi $t1,$t1,1 # incrementa offset (por 1, no 4; porqu?)
j ciclo # repete
28
5
Procedimentos e Gesto de Subrotinas
Wait a minute, Doc. Are you telling me you built a time machine out of a DeLorean?
Marty McFly para o Dr. Brown no filme de 1985, Back to the future
Esta instruo guarda no registo $ra o endereo da instruo que surge imediatamente
aps o jal (endereo de retorno) e salta para o procedimento cuja etiqueta se especifica.
Esta instruo implementa os passos 1. e 2. Para o retorno (passo 4), utiliza-se a instru-
o
jr $ra
a qual salta para o endereo armazenado no registo $ra. Durante a execuo o conte-
do de $ra substitui o contedo do registo PC. A instruo jr tambm pode ser utiliza-
da conjuntamente com outros registos e no necessrio que seja usada apenas para a
implementao do procedimento de retorno, por exemplo,
lui $t0, 0x50 # t0 <- 0x00500000
jr $t0 # o fecth da prxima instruo ser a partir do endereo
# 0x00500000
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Gesto da Pilha
A instruo jal guarda o endereo de retorno no registo $ra. Vamos assumir agora
que um procedimento pretende chamar um procedimento. Ento, o programador tem
de guardar o registo $ra porque seno o novo jal ir escrever por cima do seu valor.
Uma vez que o nmero de chamadas embebidas no tem limite (procedimentos
podem chamar outros procedimentos que tambm chamam procedimentos etc.) no
podemos utilizar uma localizao fixa (seja ela um registo ou uma posio de mem-
ria) para guardar o registo.
Em vez disso, necessitamos de uma estrutura dinmica, qualquer coisa que nos permi-
ta armazenar dados mas sem escrever por cima de dados previamente guardados.
Como no podemos utilizar o DeLorean do Dr. Brown, e como sabemos que o ltimo
dado guardado ser o primeiro que iremos querer utilizar (o ltimo valor de $ra
guardado ser o primeiro a ser utilizado aquando do retorno), utilizamos uma estru-
tura que designamos por pilha (stack).
A arquitectura do MIPS descreve uma pilha cujo topo comea por ter um valor eleva-
do (0x7fff ffff) na memria principal e que cresce para baixo, isto , sempre que se
coloca alguma coisa na pilha operao designada por push o endereo do topo do
stack decresce. O registo $sp (stack pointer) aponta sempre se o programa estiver cor-
recto para o topo da pilha, isto , para a primeira posio vazia na pilha.
Uma vez que a pilha apenas uma seco da memria principal, iremos aced-la
usando as mesmas intrues de load/store que usamos para aceder ao segmento de
dados. Por exemplo, para guardar o valor de um registo na pilha, faz-se
add $sp,$sp,-4 # primeiro actualizar o stack pointer
sw $ra, 4($sp) # push do $ra para o stack
Comeamos por subtrair a quantidade correcta ao endereo do stack pointer, uma vez
que a pilha vai aumentando para baixo (na memria principal). Neste exemplo sub-
trai-se 4 porque queremos guardar uma palavra (4 bytes) que est no registo $ra.
Depois fazemos o armazenamento (store) usando um deslocamento positivo: 4($sp)
significa o endereo contido em $sp + 4, a fim de apontarmos para a posio de
memria vazia para onde o $sp apontava antes de o modificarmos.
Esta operao designa-se por push. Ento e como fazer para recuperar um valor pre-
viamente salvaguardado na pilha de volta para o seu registo? Esta operao a inver-
sa do push, e designa-se por pop:
lw $ra,4($sp) # recupera-se o dado da pilha
add $sp,$sp,4 # actualiza-se o $sp: encolhe-se o stack uma palavra
30
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Passagem de Parmetros
Existem duas formas de passar parmetros a um procedimento: pelos registos e pela
pilha. A conveno de utilizao dos registos no MIPS especifica que os 4 primeiros
argumentos de um procedimento so passados por registos ($a0-$a3). Os restantes so
passados pela pilha.
Passar parmetros pelos registos eficiente porque evita acessos memria. Se o pro-
cedimento chamar outros procedimentos, ento os registos que contiverem parme-
tros tm de ser salvaguardados ($a0-$a3 no so preservados ao longo das chamadas).
Essa salvaguarda pode ser realizada
- Nos registos que so preservados ao longo das chamadas ($s0-$s7);
- Na pilha.
Chamando um Procedimento
O caller (procedimento que chama, ou procedimento chamante) realiza o seguinte an-
tes de chamar outro procedimento:
1. Guarda quaisquer registos que no so preservados ao longo de chamadas
(i., $a0-$a3 e $t0-$t9) e que se espera que sejam usados aps a realizao da
chamada.
2. Passa os parmetros: os 4 primeiros so passados em $a0-$a3, os restantes so
passados pela pilha.
3. Salta para o procedimento usando a instruo jal.
4. Aps a chamada, ajusta o $sp para apontar acima dos argumentos passados
na pilha (isto equivalente a fazer um pop, s que nada lido da pilha).
O callee (procedimento chamado) faz o seguinte:
1. Guarda o $ra se o procedimento for chamar outro procedimento.
2. Guarda quaisquer registos $s0-$s7 que o procedimento modifique.
3. Realiza o que tem que realizar.
4. No caso de retornar um valor, coloca esse valor no registo $v0.
5. Restaura todos os registos previamente guardados (pop da pilha).
6. Retorna, executando jr $ra.
Exemplo
O seguinte programa constitui um procedimento que copia uma string x para uma
string y:
# Arquitectura de Computadores
# Programa que copia uma string y para uma string x
.data
str1: .asciiz "origem "
str2: .asciiz "copia "
.text
main: addi $sp, $sp, -4 # reserva uma posio no stack
sw $ra, 0($sp) # guarda o endereo de retorno
jal strcpy
lw $ra, 0($sp) # recupera endereo de retorno
31
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
3 Trabalho de Laboratrio
32
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Procedimentos Recursivos
Um procedimento recursivo um procedimento que se chama a si mesmo. Contudo
um procedimento recursivo tem eventualmente que terminar. Logo, um ingrediente
essencial de um procedimento recursivo a condio de paragem, a qual especifica
quando deve um procedimento recursivo parar de se chamar a si mesmo.
Um outro ponto a ter em conta o facto de o procedimento chamar-se a si mesmo de
cada vez com argumentos (parmetros) diferentes, caso contrrio a computao no
acaba.
Vamos comear por utilizar o clssico exemplo da funo factorial. A sua definio
indutiva a seguinte:
- Base: 0! = 1
- Induo: N! = (N 1)! N , para N 1
Esta definio traduz-se simplesmente no programa recursivo que se segue:
int factorial(int num) {
int fact;
if (num == 0) return 1; /* condio de paragem */
fact = factorial(num-1); /* chamada recursiva */
return fact;
}
Q5.2. Baseando-se no exemplo anterior, crie um novo programa com as seguintes alte-
raes:
- No main pede ao utilizador que introduza um inteiro; armazene-o em $t0;
33
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
34
6
Gesto das Entradas/Sadas por Con-
sulta de Estado
Nunca h tempo para fazer todo o nada que se quer.
Calvin, em Calvin&Hobbes de Bill Watterson
E no SPIM?
No SPIM, para a entrada de dados a partir do teclado, utiliza-se o porto de dados cujo
endereo o 0xffff0004. O porto de controlo situa-se no endereo 0xffff0000 (sendo o
bit 0 o bit de estado, o qual indica que o controlador possui um caracter digitado no
teclado.
Para a sada de dados para a consola, o porto de dados mora no endereo 0xffff000c e
o porto de controlo no endereo 0xffff0008 (sendo o bit 0 o bit de estado que indica
que se pode escrever um caracter para a consola).
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
36
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
.data 0x10010000
cadeia: .asciiz Agora sim, sai bem!
.data 0xffff0008
cout: .space 1 # Porto de controlo da consola
.data 0xffff000c
out: .space 1 # Porto de escrita da consola
.text
.globl main
main: la $a0,cadeia # carrega endereo da cadeia
la $a1,out # carrega endereo de sada
lb $s0,0($a0) # l o caracter (byte) da cadeia
la $a2,cout # carrega endereo de controlo da sada
############# ciclo de consulta de estado ##########
ctr1:
####################################################
sb $s0, 0($a1) # escreve na consola
addi $a0,$a0,1 # incrementa apontador para a cadeia
lb $s0, 0($a0) # l o caracter (byte) seguinte
bne $s0,$0,ctr1 # controlo de fim de cadeia (0)
############ ciclo de consulta de estado ##########
ctr2:
####################################################
sb $0, 0($a1) # escreve na consola fim de cadeia (0)
jr $ra # regressa rotina principal
Entrada/Sada
Vamos agora estudar um exemplo: este programa permite ler os caracteres teclados
(at um total de 10) e mostr-los na consola:
.data
long: .word 10 # tamanho do buffer
.data 0xffff0000
37
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
cin: .space 1
.data 0xffff0004
in: .space 1
.data 0xffff0008
cout: .space 1
.data 0xffff000c
out: .space 1
.text
main: addi $sp,$sp,-4
sw $ra,0($sp)
lw $s0,long
addi $s0,$s0,-1
li $t6,0x0a # return
la $t1, in # carrega endereo in
la $t2, cin # carrega endereo de controlo do teclado
la $t3, out # carrega endereo out
la $t4, cout # carrega endereo de controlo da sada
ctri: jal wi
lb $t7, 0($t1) # leio do teclado
jal wo
sb $t7, 0($t3) # escrevo na consola
addi $s0,$s0,-1
beq $t7,$t6, fim # controlo fim de linha
bne $s0,$0, ctri # controlo de fim de cadeia
j zero
fim: li $t7, 0x0a
jal wo
sb $t7, 0($t3) # escrevo na consola
zero: andi $t7,$t7,0
jal wo
sb $t7, 0($t3) # escrevo na consola
lw $ra, 0($sp)
addi $sp,$sp,4
jr $ra
############ Consulta de estado da entrada #########
wi:
####################################################
############ Consulta de estado da sada ##########
wo:
####################################################
4 Trabalho de Laboratrio
38
7
Gesto das E/S por Interrupes
Never interrupt your enemy when he is making a mistake.
Napoleo Bonaparte
Isto significa que o interrupt handler pode usar estes registos sem primeiro ter de os
salvar. Um programa escrito para o MIPS que use estes registos pode encontr-los
subitamente alterados (da serem considerados como registos reservados).
O registo BadVAddr
Este registo, cujo nome vem de Bad Virtual Address, contm o endereo de memria
onde ocorreu a excepo. Um acesso desalinhado memria, por exemplo, ir gerar
uma excepo e o endereo onde o acesso foi tentado ser guardado em BadVAddr.
40
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
O registo Cause
O registo Cause fornece informao sobre quais as interrupes pendentes (bits 10 a
15) e a causa da excepo. O cdigo da excepo armazenado como um inteiro sem
sinal usando os bits 5-2 no registo Cause. A figura seguinte representa este registo:
O bit i do grupo de bits Pending Interrupts fica a 1 se uma interrupo ocorre no nvel i
e est pendente (diz-se que ainda no foi servida).
O cdigo da excepo indica o que causou a excepo:
Cdigo Nome Descrio
0 INT Interrupo.
4 ADDRL Load a partir de um endereo ilegal.
5 ADDRS Store para um endereo ilegal.
6 IBUS Erro do bus ao efectuar fetch de uma instruo.
7 DBUS Erro do bus numa referncia a dados.
8 SYSCALL Instruo syscall executada.
9 BKPT Instruo break executada.
10 RI Instruo reservada.
12 OVF Overflow aritmtico.
O cdigo 0 indica que uma interrupo ocorreu. Olhando para os bits Pending Inter-
rupts individuais, o processador pode saber que interrupo especfica que ocorreu.
O registo Status
O registo Status contm uma mscara de interrupes nos bits 5-10 e informao de
estado nos bits 5-0. O esquema do registo o seguinte:
Se o bit Interrupt mask i estiver a 1, ento as interrupes do nvel i esto activas (ena-
bled). Caso contrrio esto inactivas (disabled).
O bit 1 no registo indica se o programa est a correr no modo utilizador (=1) ou kernel
(=0). O bit 3, indica se o processador estava a correr no modo kernel (=0) ou utilizador
na altura em que ocorreu a ltima excepo. Esta informao importante porque ao
retornar do exception handler, o processador tem de estar no mesmo estado em que
estava antes de ocorrer a excepo.
41
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Os bits 5-0 no registo Status implementam ento uma pilha de trs nveis com infor-
mao acerca de excepes anteriores. Quando uma excepo ocorre, o estado previous
(bits 3 e 2) guardado como o estado old e o estado current guardado como estado
previous. O estado old perdido. Os bits do estado current so ambos postos a zero
(modo kernel com interrupes inactivas). Ao retornar do exception handler (executan-
do uma instruo que j veremos, designada por rfe) o estado previous torna-se o
estado current e o estado old torna-se em previous. O estado old no alterado.
Os bits de activao de interrupes (Interrupt Enable), indicam se as interrupes
esto activas (ou habilitadas, ou permitidas), caso em que esto a 1, ou inactivas, caso
em que esto a 0, no respectivo estado. Por exemplo, se o bit 0 zero, ento o proces-
sador est a correr actualmente com as interrupes inactivas.
O registo EPC
Quando um procedimento chamado usando jal, duas coisas acontecem:
- O controlo transferido para o endereo fornecido pela instruo.
- O endereo de retorno guardado no registo $ra.
No caso de uma excepo, no h uma chamada explcita. No MIPS, o controlo
transferido para uma localizao fixa, 0x80000080, quando uma excepo ocorre. O ex-
ception handler tem de ficar nesse endereo.
O endereo de retorno no pode ser salvo em $ra, uma vez que pode escrever por
cima de um endereo de retorno que tenha eventualmente sido colocado nesse registo
antes da excepo. O registo EPC (Exception Program Counter) usado para armazenar
o endereo da instruo que estava sendo executada quando a excepo foi gerada.
42
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
.data 0xffff0000
cin: .space 1 # controlo de leitura
.data 0xffff0004
43
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
.kdata
inter: .asciiz " int " # mensagem que aparece quando o processador
# atende a interrupo
sgt $v0 $k0 0x44 # Se for uma interrupo externa, salta para a
# rotina de tratamento!
bgtz $v0 ext
addu $0 $0 0
li $v0 4 # syscall 4 (print_str)
la $a0 __m1_
syscall
44
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
ok_pc:
li $v0 4 # syscall 4 (print_str)
la $a0 __m2_
syscall
mtc0 $0, $13 # Clear Cause register
bnez $v0, ret
########################################################################
# Rotina (nossa) de servio interrupo:
########################################################################
ext:
li $v0 4
la $a0 inter
syscall
li $v0 1
lb $a0 in
syscall
sb $a0 lido($0)
li $v0 1
lb $a0 lido($0)
syscall
li $v0,105 # tecla i
beq $a0,$v0,ok
bne $a0,$v0,continua
ok:
li $v0 4
la $a0 caracter
syscall
continua:
mtc0 $0, $13 # Limpar o registo Cause
45
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
.set at
rfe # Return from exception handler
addiu $k0 $k0 4 # Return to next instruction
jr $k0
haz:
addi $t1,$0,10000
wat:
addi $t1,$t1,-1
bnez $t1,wat
addi $s0,$s0,1
bnez $s0,haz
lw $ra,0($sp)
addi $sp,$sp,4
jr $ra
O programa anterior inclui, por um lado, o cdigo necessrio para que a entrada de
dados se possa gerir perante interrupes e, por outro lado, as aces que se devem
executar para cada uma das excepes que se produzem no sistema.
Compare este ficheiro com o ficheiro trap.handler original.
Escreva o ficheiro anterior a partir do ficheiro que contm o cdigo standard para tra-
tamento das excepes (trap.handler). Carregue-o e execute-o no simulador SPIM com
as opes Mapped I/O e sem a opo Load Trap File.
Q7.1. O que faz este programa? O que ocorre quando se carrega numa tecla?
Q7.2. Modifique o programa anterior para imprimir o caracter teclado.
46
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Q7.3. Um exception handler necessita de salvar todos os registos que possa modificar.
Isto poder ser feito no stack, usando o $sp? Explique.
Q7.4. O trap handler imprime um mensagem de erro para cada excepo usando o
cdigo da excepo (que se encontra no registo Cause) como ndice de uma tabela que
contm os endereos das mensagens.
Identifique essa tabela e mostre algumas das suas entradas, preenchendo a tabela que
se segue. Na coluna Etiqueta, a primeira linha ser a etiqueta onde a tabela comea.
Na coluna Comentrio indique qual o contedo armazenado em cada um dos ende-
reos da coluna Endereos.
Etiqueta Endereo Contedo Comentrio
5 Trabalho de Laboratrio
47
8
Introduo Micro-Programao
Calvin: Queres ver uma coisa estranha? Repara, colocas po nesta ranhura e carregas no boto
para baixo. Esperas alguns minutos, e zs! Sai uma tosta!
Hobbes: Uau! Para onde foi o po?
Calvin: No fao a mnima ideia. No esquisito?
Calvin, em Calvin & Hobbes de Bill Watterson
Tal como o Calvin, temos estado a programar (at agora) em Assembly, sem saber o
que se passa no interior da nossa torradeira que o MIPS. Sabemos que o Assembly
uma linguagem de programao de baixo nvel e que constitui uma representao
simblica da codificao binria de um computador: a linguagem mquina (ver Cap-
tulo 1).
Ora, a linguagem mquina composta por micro-instrues que indicam que opera-
o digital deve o computador fazer. Cada instruo mquina composta por um con-
junto ordenado de zeros e uns, estruturado em campos. Cada campo contm a infor-
mao que se complementa para indicar ao processador que aco realizar.
Vamos ento neste captulo observar alguns exemplos dos programas em linguagem
mquina correspondentes a alguns dos troos de programas Assembly que temos
vindo a estudar. E ficaremos a perceber o que se passa dentro do processador.
Na adio com overflow, a instruo codificada em seis campos. Cada campo tem
uma largura (em termos de nmero de bits) indicada sob o respectivo campo. Esta ins-
truo comea com um grupo a zeros (6 bits a zero, esquerda). Este grupo de bits o
opcode (cdigo da instruo).
Os registos so especificados por rs, rt e rd. Portanto o campo seguinte especifica um
registo chamado rs (de register source). Este registo o segundo operando da instruo.
Outro campo comum designado imm16, que especifica um nmero imediato de 16
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
49
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Sabendo que a primeira instruo tem como endereo 0x400028, traduza este troo de
cdigo para linguagem mquina MIPS e escreva o contedo de cada instruo em
binrio e hexadecimal numa tabela com o seguinte aspecto:
Resoluo:
(h que ter em ateno que a instruo la uma instruo que se expande em duas
neste caso, uma vez que o endereo de palavra tem de ser calculado).
50
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Questo: qual o formato da instruo bne? Porque que o ltimo campo tem o valor
12 (= 3*4)?
51
Exerccios Resolvidos
palavra2: 0x10010004
Nota: tambm foram aceites as respostas que se referiram ao valor armazenado nas
posies de memria (13 e 0x15), ou os seus equivalentes em hexadecimal/decimal,
embora a resposta correcta seja a que consta desta resoluo.
2.(0,5 val.) Considere o seguinte programa em Assembly do MIPS:
.data
var1: .word 30
var2: .word -50
res: .space 1
.text
main: lw $t8,var1($0)
lw $t9,var2($0)
and $t1,$t1,$0
and $t0,$t0,$0
beq $t8,$0,haz
ori $t0,$0,1
haz: slt $t1,$t9,$t8
wat: and $t0,$t0,$t1
sb $t0,res($0)
byte2: 0x10010003
53
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
lw $ra,4($sp)
addi $sp,$sp,4
beq $v0,$t0,certo # resultado em v0
errado:
la $a0,string_errado
li $v0,4
syscall
j fim
certo:
la $a0,string_certo
li $v0,4
syscall
fim:
lw $ra,4($sp)
addi $sp,$sp,4
jr $ra
54
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
.data 0x10000000
vector: .word 10,11,12,13,14
fim: li $v0,1
move $a0,$t1
syscall # chamada sistema print_int
addi $v0,$0,10 # $v0=10 (para retornar o controlo ao SPIM)
syscall
Para a cadeia de caracteres AC-Uma, declarada na memria como .asciiz, que nme-
ro aparece na consola quando este programa executado? O que faz este programa?
Conta o nmero de caracteres numa dada string. Para a string AC-Uma, aparece na
consola 6.
3. (1 val.) Suponha que num determinado protocolo de comunicao de dados,
necessrio introduzir caracteres de controlo (#,/,%).
Por exemplo, se o texto a transmitir :
Calvin: A realidade continua a arruinar a minha vida.
no destino chega:
55
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Pretende-se desenvolver uma rotina que no computador destino suprima estes carac-
teres do texto, de forma a obter de novo o texto original. Parta do seguinte cabealho:
.data 0xffff8888 # declara zona de memria partilhada
mensagem:
.space 128
.data 0x10010000 # declara segmento de dados
resultado:
#
# Princpio do Segmento de Texto
#
.text # declara segmento de cdigo
main:
li $v0 1
lb $a0 in
syscall
sb $a0 lido($0)
continua:
mtc0 $0, $13 # Limpar o registo Cause
56
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
5. a) O que acontece quando ocorre uma interrupo vinda do teclado? Uma rotina de
servio interrupo deve ser curta? Porqu?
5. b) Considere que a etiqueta in est associada ao porto de leitura do teclado. O que
faz a instruo lb $a0 in?
57
Enunciados de Projectos
Enunciado do Projecto:
Um Controlador para o Robot Shakeaspira
Introduo
Voc e o seu colega trabalham como consultores jniores na empresa de consultadoria
B., Anha & DAkobra2, uma empresa especializada no desenvolvimento de sistemas
embebidos em tempo real (e.g. controladores industriais) para os quais frequente
programar em Assembly.
Foram ambos destacados pelo gestor de projecto para o desenvolvimento de um con-
trolador para um robot chamado Shakeaspira. O Shakeaspira um robot aspirador
automtico para a casa: movimenta-se automaticamente num quarto, evitando objec-
tos e quaisquer obstculos (nomeadamente as paredes) ao mesmo tempo que limpa o
p do quarto.
Figura 1: Robot aspirador para a casa com movimentao automtica (modelo experimental3).
No topo esquerdo, o robot encontra-se na estao de recarga da bateria.
O Shakeaspira possui incorporada uma bateria, que torna o robot autnomo, sem pre-
cisar de manuteno. A bateria vai descarregando ao longo do tempo, e quando atinge
um determinado valor limite, o Shakeaspira dirige-se para uma localizao pr-
definida onde existe o carregador da sua bateria.
O problema que o prazo para o desenvolvimento curto, uma vez que a concorrn-
cia uma empresa japonesa j est em vias de comercializar um robot semelhante,
actualmente em fase experimental (ver Figura 1). Por isso voc ter de ser eficaz, cria-
tivo e inovador.
2
Nome fictcio, obviamente.
3
Para mais informaes sobre o robot (real) da concorrncia, visite:
http://www.i4u.com/japanreleases/hitachirobot.htm
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
59
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Sempre que o robot avana, a bateria (representada como uma varivel inteira na
memria) decrementada uma unidade. Quando o valor da bateria atinge um deter-
minado nvel mnimo, o robot imprime a mensagem Bateria Baixa!, e tem de retor-
nar posio base da bateria (0,0) onde recarrega a sua bateria para o valor do nvel
mximo (500). Cabe a si determinar um valor plausvel para o nvel mnimo. O robot
termina a sua tarefa automtica quando todo o lixo tiver sido recolhido.
O exemplo seguinte ilustra a forma como o programa dever funcionar no modo
automtico:
Shakeaspira> Introduza o tamanho do quarto (4x4...8x8): 6
Shakeaspira> Introduza quantidade de objectos (2...6): 4
Shakeaspira> Introduza quantidade de lixo (2...6): 4
Shakeaspira> Introduza a bateria inicial (10...500): 100
0 1 2 3 4 5
0C O
1 R
2
3 O L O
4 O
5 L L
Shakeaspira> Lixo recolhido=1 Bateria=97
4
Sempre que o utilizador pressionar a tecla 2, seguida de Enter, o programa termina.
60
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
Neste exemplo, o robot recolheu 1 lixo na posio (4,1). O lixo (L) dessa posio desa-
parece. O programa termina quando o lixo recolhido for igual ao lixo inicialmente
introduzido. O robot no pode executar saltos! Isto , s avana entre posies cont-
guas, em cada uma das direces norte,sul,este,oeste.
No modo manual, o funcionamento semelhante, excepto no facto de o robot ficar
parado espera que o utilizador pressione uma das teclas direccionais j referidas.
Neste modo, o Shakeaspira operado pelo teclado, usando as teclas i,j,k,l para espe-
cificar a direco do seu movimento (i=norte, k=sul, j=este, l=oeste).
Para implementar este modo no pode usar a chamada de sistema syscall, j que esta
pede sempre um Enter e mostra no cran a tecla digitada. Em vez disso, deve criar
um novo ficheiro a partir do trap.handler onde associa uma rotina de tratamento das
interrupes do teclado a uma rotina que move o robot numa dada direco. Desta
maneira, pode-se teclar vontade que apenas surge na consola a imagem actualiza-
da do quarto do robot.
No necessrio, neste modo, introduzir um valor de bateria, visto que esta no uti-
lizada. Tambm no necessrio verificar se estamos a mover o robot contra uma das
paredes (essa funcionalidade d direito, contudo, a crdito extra).
Funcionalidades j implementadas
O seu gestor de projecto possui dois ficheiros que sero, provavelmente, do seu inte-
resse, pelo que deve contact-lo para obt-los: um deles um gerador de nmeros
aleatrios, que servir para testar o Shakeaspira num quarto dispondo o lixo e os obs-
tculos aleatoriamente (a localizao da bateria fixa e pode assumir que o robot a
conhece).
O outro uma rotina de tratamento de interrupes adaptada da rotina original do
ncleo do Sistema Operativo simulado pelo SPIM. Servir como ponto de partida para
codificar o modo de operao manual do Shakeaspira. Lembre-se que pode (e deve)
reaproveitar o cdigo do modo automtico para implementar o modo manual.
61
Arquitectura de Computadores Guia dos Laboratrios Pedro F. Campos
5
Ainda por confirmar.
62