Académique Documents
Professionnel Documents
Culture Documents
Introduo
Independente da linguagem de programao utilizada,
todo programa ser convertido em um conjunto de
instrues, chamado linguagem de montagem, antes de
ser convertido em cdigo binrio.
Apesar de aparentemente limitadas, as linguagens de
montagem definem todo o conjunto de instrues
reconhecidas e utilizadas em um sistema computacional,
representando uma das caractersticas mais importantes
do projeto de um processador.
A programao em linguagem de montagem requer tanto
conhecimentos de lgica quanto do hardware utilizado.
2
Linguagem de mquina
O que representa
cdigo ao lado?
00100111101111011111111111100000
10101111101111110000000000010100
10101111101001000000000000100000
10101111101001010000000000100100
10101111101000000000000000011000
10101111101000000000000000011100
10001111101011100000000000011100
10001111101110000000000000011000
00000001110011100000000000011001
00100101110010000000000000000001
00101001000000010000000001100101
10101111101010000000000000011100
00000000000000000111100000010010
00000011000011111100100000100001
00010100001000001111111111110111
10101111101110010000000000011000
00111100000001000001000000000000
10001111101001010000000000011000
00001100000100000000000011101100
00100100100001000000010000110000
10001111101111110000000000010100
00100111101111010000000000100000
00000011111000000000000000001000
00000000000000000001000000100001
MIPS
Nas lies a seguir ser adotado o padro da
arquitetura de 32 bits (apesar que tambm
utilizado em arquiteturas de 64 bits, com
adaptaes de endereamento e tamanho de
campos).
A arquitetura MIPS segue os princpios bsicos de
um projeto de hardware. Estes princpios foram
estabelecidos para, na criao de um novo
hardware, que o resultado fosse o mais simples,
eficiente e livre de falhas possvel, com o menor
custo necessrio.
5
Princpio de projeto 1
A simplicidade favorecida pela
regularidade
A representao de instrues em MIPS segue um
formato regular de campos, cada um com uma
funo especfica bem definida.
Por exemplo, a operao de soma em MIPS seria
feita da forma: ADD a, b, c significa somar o
valor das variveis b e c e armazenar o resultado
em a.
6
Prncipio de projeto 1
Como escrever em MIPS a operao a b + c +d +e ?
add a, b, c
add a, a, d
add, a, a, e
# a soma de b e c
armazenada em a
# a soma de b, c e d
armazenada em a
# a soma de b, c, d e e
armazenada em a
Exerccio
Qual o cdigo MIPS correspondente a instruo:
f (g + h) (i + j);
Dica: considere o uso de duas variveis temporrias,
t0 e t1, criadas pelo compilador
Resposta:
add t0, g, h
add t1, i, j
sub f, t0, t1
# a varivel t0 recebe g + h
# a varivel t1 recebe i + j
# a varivel f recebe t0 - t1
Princpio de projeto 2
Quanto menor, mais rpido
No so utilizadas variveis em linguagens de
montagem, pois este conceito s existe em
linguagens de alto nvel.
O MIPS utiliza registradores de 32 bits, cada um
representando uma palavra da arquitetura.
Um grande nmero de registradores no hardware
certamente tornaria maior o ciclo de clock,
tornando o sistema computacional mais lento.
9
Princpio de projeto 2
Registradores existem em quantidades limitadas. No
projeto de uma arquitetura MIPS existem
exatamente 32 registradores, identificados atravs
de um $, seguido de um identificador (que pode
conter uma parte numrica).
Dentre os registradores disponveis ao programador
MIPS esto alguns de propsito geral e outros com
propsito especfico.
Alguns no so utilizados pelo programador, mas
pelo sistema operacional.
10
Registradores do MIPS
Nome
Nmero
Uso
$zero
Constante 0
$at
$v0, $v1
2, 3
$a0,..., $a3
4 ao 7
Argumentos 1 a 4
$t0,..., $t7
8 ao 15
$s0,..., $s7
16 ao 23
$t8, $t9
24, 25
$k0
26
$k1
27
$gp
28
$sp
29
$fp
30
$ra
31
11
Representao de instrues em
MIPS
op
rs
rt
rd
shamt
funct
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
12
Representao de instrues em
MIPS
Rd: registrador que guarda o resultado da operao
(registrador destino).
Shamt: quantidade de bits a serem deslocados (especfico
para instrues de deslocamento; se a instruo no for
deste tipo, conter zero).
Funct: funo. Seleciona uma variao especfica da
operao apontada no campo op, sendo chamado de
cdigo da funo.
Observe que o formato de instruo contm
exatamente 32 bits, o tamanho de uma palavra de
memria e de um dado (princpio de projeto 1).
13
Exemplo
Para a instruo: add $t0, $s1, $s2;
Representao decimal:
17
18
32
Representao binria:
000000
10001
10010
01000
00000
100000
6 bits
5 bits
5 bits
5 bits
5 bits
6 bits
14
Princpio de projeto 3
Um bom projeto demanda
compromisso
Em MIPS todas as instrues so do mesmo tamanho,
mas so utilizados formatos diferentes para tipos
distintos de instrues.
O tipo que vimos anteriormente chamado de tipo R,
ou formato R, sendo o R usado para lembrar o uso de
registradores pela instruo.
16
Instruo do tipo I
O outro tipo chamado de tipo I, ou formato I,
sendo o I utilizado para lembrar que usado em
instrues de transferncia de dados.
O formato de instrues do tipo I o seguinte:
op
rs
rt
endereo
6 bits
5 bits
5 bits
16 bits
17
12
...
Dados
101
10
100
...
19
21
23
25
26
Exemplo:
Sendo A um array de 100 elementos cujo endereobase est em $s3, e as variveis g, h e i esto associadas
aos registradores $s1, $s2 e $s4, qual o cdigo MIPS
para a operao g = h + A[i]?
27
# $t1 recebe 2 * i
# $t1 recebe 4 * i
instruo
formato
op
rs
rt
rd
shamt
funct
endereco
add
reg
reg
reg
32
n/a
sub
reg
reg
reg
34
n/a
lw
35
reg
reg
n/a
n/a
n/a
endereo
sw
43
reg
reg
n/a
n/a
n/a
endereo
Legenda:
reg: nmero de um registrador, entre 0 e 31
endereo: valor de 16 bits
n/a: no se aplica
29
Exerccio
Supondo que $t1 tem o valor-base do array A e que $s2
corresponde a varivel h, diga como fica o comando a
seguir em MIPS e linguagem de montagem:
A[300] = h + A[300];
Soluo:
lw $t0, 1200($t1)
add $t0, $s2, $t0
sw $t0, 1200($t1)
30
Exerccio
Op
Rs
Rt
35
18
43
Op
Rs
Rt
100011
01001
01000
000000
10010
01000
101011
01001
01000
Rd
Endereo/
shamt
funct
1200
8
32
1200
Rd
Endereo/
shamt
funct
0000010010110000
01000
00000
100000
0000010010110000
31
Instrues de desvio
As linguagens de programao de alto nvel geralmente
implementam o comando de tomada de deciso atravs
do comando if.
O MIPS possui duas instrues de desvio:
beq r1, r2, L1 se os valores de r1 e r2 so iguais, desvia
para a linha identificada pelo label L1.
bne r1, r2, L1 se os valores de r1 e r2 so diferentes, desvia
para a linha identificada pelo label L1.
OBS: beq: branch if equal
bne: branch if not equal
32
Instrues de desvio
O label apenas um identificador de linha, inserido
no comeo e separado da instruo por :
Exemplo:
if (i == j) go to L1;
f = g + h;
L1: f = f i;
Supondo que as variveis f, g, h, i e j correspondem aos registradores
de $s0 a $s4, escreva o cdigo MIPS correspondente
33
Instrues de desvio
Soluo:
beq $s3, $s4, L1
add $s0, $s1, $s2
L1: sub $s0, $s0, $s3
34
Instrues de desvio
Os desvios feitos at agora se basearam no resultado de
um teste de comparao. possvel ainda fazer desvios
incondicionais, isto , que sempre sero tomados, atravs
da instruo j (jump).
Exemplo: if-then-else usando desvios em MIPS:
if (i == j)
f = g + h;
else
f = g h;
Novamente, estamos supondo que as variveis f, g, h, i e j
correspondem aos registradores de $s0 a $s4
35
Instrues de desvio
bne $s3, $s4, Else
add $s0, $s1, $s2
j Exit
Else: sub $s0, $s1, $s2
Exit:
36
Instrues de desvio
possvel utilizar uma variao do jump, conhecida
como jump register (jr), que realiza um desvio
incondicional para um registrador especificado na
instruo.
jr $t1
37
Instrues de repetio
Desvios condicionais em MIPS podem ser utilizados
para a implementao de estruturas de repetio,
como um loop de instrues, por exemplo:
Loop: g = g + A[i];
i = i + j;
if (i != h) go to Loop;
Instrues de repetio
Loop: add $t1, $s3, $s3
add $t1, $t1, $t1
add $t1, $t1, $s5
lw $t0, 0($t1)
add $s1, $s1, $t0
add $s3, $s3, $s4
bne $s3, $s2, Loop
39
Instrues de repetio
Repetio com o comando while
Os loops de repetio de comandos so
implementados em linguagens de alto nvel mais
frequentemente atravs do comando while, por
exemplo:
while (save[i] ==k)
i= i + j;
Instrues de repetio
Loop: add $t1, $s3, $s3
add $t1, $t1, $t1
add $t1, $t1, $s6
lw $t0, 0($t1)
bne $t0, $s5, Exit
add $s3, $s3, $s4
j Loop
Exit:
43
op
rs
rt
imediato
16 bits
45
Princpio de projeto 4
Torne o caso comum mais
rpido
A utilizao de operandos imediatos ocorre com
tanta frequncia em linguagens de montagem que
a melhor deciso de projeto trat-los como um
caso comum, e no como instrues especiais.
46
47
# $sp = $sp + 4
29
29
op
rs
rt
imediato
001000
11101
11101
0000000000000100
48
49
Exerccios
1.
finish:
52
Exerccios
2.
Exerccios
3.
a.
while (a!=0) {
c = a + b;
a = a--;
}
for (i=0, i !=10, i++) {
c = a + b;
b.
54
56
Manipulao de pilhas
Duas operaes podem ser realizadas em uma pilha: a
operao push, onde um dado colocado no topo da
pilha, e a operao pop, que retira o elemento que
encontra-se no topo da pilha. Estas operaes existem
em linguagens de alto nvel, no no MIPS.
O endereo de memria que indica qual a posio
ocupada pelo topo da pilha (e consequentemente, o
elemento que encontra-se no topo), fica armazenado
no registrador $sp, tambm chamado de apontador
de pilha (stack point).
59
Manipulao de pilhas
Observe que, tradicionalmente, as pilhas crescem
dos endereos de memria mais altos para os mais
baixos; quando um item empilhado, o valor do
apontador de pilha ($sp) deve diminuir.
60
Exemplo de procedimento
Converta para MIPS o seguinte trecho de cdigo que
representa um procedimento:
int funcao_f (int g, int h, int i, int j)
{
int f;
f = (g+h) (i + j);
return f;
}
As variveis g, h, i e j correspondem aos registradores
$a0, $a1, $a2 e $a3; o resultado da varivel f
corresponde ao registrador $s0.
61
Exemplo de procedimento
Inicialmente, deve-se salvar em algum espao da
memria o contedo das variveis que sero
utilizadas na operao.
J fizemos essa operao antes, lembra (l no slide
8)? Foram utilizados dois registradores
temporrios, ento necessrio reservar uma rea
de memria para eles e para o resultado (a varivel
de retorno f).
O procedimento comea com um label, que neste
exemplo ser chamado de funcao_f:
62
Exemplo de procedimento
Exemplo de procedimento
Com os valores de $t1, $t0 e $s1 empilhados na
memria, estes registradores podem ser utilizados
por outras operaes do programa.
Uma vez carregados, podemos fazer as operaes:
add $t0, $a0, $a1
add $t1, $a2, $a3
sub $s0, $t0, $t1
add $v0, $s0, $zero
64
Exemplo de procedimento
No final das operaes, os valores originais dos
registradores sero desempilhados, com os comandos:
lw $s0, 0($sp)
lw $t0, 4($sp)
lw $t1, 8($sp)
add $sp, $sp, 12
jr $ra
65
Valor
Endereo
Valor
184
12
184
78
185
34
185
56
186
56
186
34
187
78
187
12
67