ORGANIZAÇÃO E
ARQUITETURA DE
COMPUTADORES I
Aula 05
INTRODUÇÃO
Para que o hardware de um computador funcione, é
necessário que eles falem a mesma linguagem.
Instruções – palavras da linguagem de um computador; Conjunto de instruções – vocabulário de um computador.
Todos os computadores são construídos a partir de
tecnologias
baseadas
em
princípios
básicos
semelhantes e precisam oferecer operações básicas, o
que faz com que as linguagens de computador sejam
semelhantes.
INTRODUÇÃO
Os projetistas de computador possuem um objetivo
comum:
Encontrar uma linguagem que facilite o projeto do hardware
e do compilador enquanto maximiza o desempenho e minimiza o custo.
MIPS
Conjunto de instruções criado desde a época de 1980; Veremos como funciona este conjunto de instruções.
OPERAÇÕES DO HARDWARE DO
COMPUTADOR
Cada instrução aritmética do MIPS realiza apenas uma
operação e sempre precisa ter exatamente três
variáveis.
Exemplos de como é feita a soma de quatro variáveis:
add a, b, c # A soma b + c é colocada em a.
add a, a, d # A soma de b + c + d agora está em a.
add a, a, e # A soma de b + c + d + e agora está em a.
São necessárias três instruções para realizar a soma
OPERAÇÕES DO HARDWARE DO
COMPUTADOR
Cada instrução possuir apenas três operandos faz com
que a filosofia de manter o hardware simples seja
seguida.
Temos agora o primeiro dos quatro princípios básicos
de projeto do hardware:
Princípio de Projeto I: simplicidade favorece a regularidade.
Subtração de duas variáveis no MIPS:
OPERAÇÕES DO HARDWARE DO
COMPUTADOR
Uma instrução mais complexa no MIPS precisa se
desmembrar em várias instruções:
f = (g + h) – (i + j);add t0, g, h add t1, i, j sub f, t0, t1
OPERANDOS DO HARDWARE DO
COMPUTADOR
Os operandos das instruções aritméticas são
embutidos diretamente no hardware e são chamados
de registradores.
Na arquitetura MIPS um registrador tem o tamanho de
32 bits. Cada grupo de 32 bits recebe o nome de
palavra.
Nos computadores atuais, temos 32 registradores.
Cada um dos três operandos das instruções
aritméticas do MIPS precisa ser escolhido a partir de
um dos 32 registradores de 32 bits.
OPERANDOS DO HARDWARE DO
COMPUTADOR
Qual o motivo de termos apenas 32 registradores?
Principio de Projeto 2: menor significa mais rápido.
Uma quantidade muito grande de registradores pode
aumentar o tempo do processamento.
Os projetistas de computador precisam equilibrar o
desejo dos programas por mais registradores com o
desejo do projetista de manter o ciclo de clock rápido.
OPERANDOS DO HARDWARE DO
COMPUTADOR
No MIPS, utilizamos um sinal de cifrão seguido por
dois caracteres para representar um registrador.
Utilizaremos $S0, $S1,..., para registradores que
correspondem às variáveis dos programas e $t0,
$t1,..., para os registradores temporários.
OPERANDOS DO HARDWARE DO
COMPUTADOR
Exemplo:
Como ficaria o exemplo anterior utilizando os conceitos
aprendidos agora? f = (g + h) – (i + j);
As variáveis f, g, h, i e j são associadas agora aos
registradores $s0, $s1, $s2, $s3 e $s4.
O programa compilado é muito semelhante ao anterior:
add $t0, $s1, $s2 add $t1, $s3, $s4 sub $s0, $t0, $t1
OPERANDOS DO HARDWARE DO
COMPUTADOR
Operandos em memória
Estruturas de dados complexas podem conter muito mais
elementos de dados do que a quantidade de registradores em um computador.
Como o processador só pode manter uma pequena
quantidade de dados nos registradores, as estruturas de dados são mantidas na memória.
Instruções de transferência de dados – comando que
move dados entre a memória e os registradores.
Para acessar uma palavra na memória, a instrução precisa
OPERANDOS DO HARDWARE DO
COMPUTADOR
Endereço – valor usado para delinear o local de um
elemento de dados específico dentro de uma seqüência da memória.
O endereço atua como índice de um array, começando de 0.
1
101
10
100
Endereço Dados Processador Memória 3 2 1 0OPERANDOS DO HARDWARE DO
COMPUTADOR
Load – instrução de transferência de dados que copia
dados da memória para um registrador tradicional.
Utiliza os seguintes dados:
Nome da operação (lw)
registrador a ser carregado uma constante
registrador usado para acessar a memória
A soma da parte constante da instrução com o conteúdo do
OPERANDOS DO HARDWARE DO
COMPUTADOR
Exemplo:
A é uma seqüência de 100 words.
O compilador associou as variáveis g e h aos registradores $s1 e
$s2.
O endereço inicial da seqüência, ou endereço base, está em $s3. Como ficaria a seguinte instrução?
g = h + A[8]
Primeiro precisamos transferir A[8] para um registrador:
lw $t0, 8($s3)
Depois pode ser feita a soma utilizando o valor em $t0, pois ele já esta
em um registrador:
add $s1, $s2, $t0
OPERANDOS DO HARDWARE DO
COMPUTADOR
Interface hardware/software
O compilador também pode alocar estruturas de dados em
locais na memória.
Para alocar estruturas de dados, ele coloca o endereço inicial
apropriado nas instruções de transferência de dados.
Como cada byte possui 8 bits, o endereço de uma palavra
combina os endereços dos 4 bytes dentro dela.
Logo, os endereços sequenciais das palavras diferem em
OPERANDOS DO HARDWARE DO
COMPUTADOR
1
101
10
100
Endereço Dados Processador Memória 3 2 1 012
8
4
0
OPERANDOS DO HARDWARE DO
COMPUTADOR
Exemplo
Suponha que a variável h esteja associada ao registrador
$s2, e o endereço base do array A esteja em $s3. Qual é o código do MIPS para a instrução a seguir?
A[12] = h + A[8];
Dois operandos estão na memória, por isso precisaremos de
mais instruções MIPS:
lw $t0, 32($s3) # Registrador temporário $t0 recebe A[8] add $t0, $s2, $t0 # Registrador temporário recebe h + A[8]
OPERANDOS DO HARDWARE DO
COMPUTADOR
Muitos programas possuem mais variáveis do que o número
de registradores disponíveis.
O compilador mantém então as variáveis mais utilizadas nos
registradores e coloca as restantes na memória.
Dados são mais úteis quando estão em registradores.
Acesso a eles é mais rápido;
Uma instrução pode ler dois registradores, atuar sobre eles e
escrever o resultado.
Como evitar então, o uso da instrução load?
Utilizando a instrução addi (add imediato);
Essa instrução é utilizada quando o operando é uma constante; Exemplo:
Para somar 4 ao registrador $s3, simplesmente podemos escrever:
REPRESENTANDO INSTRUÇÕES NO
COMPUTADOR
Toda informação mantida no computador é composta
por dígitos binários (bits).
Instruções também são mantidas como uma série de
bits. Cada parte da instrução é considerada um número
individual e a junção desses números forma a instrução.
É preciso então haver uma convenção para mapear
nomes de registradores em números:
Os registradores $s0 a $s7 são mapeados nos registradores
de 16 a 23;
Os registradores $t0 a $t7 são mapeados nos registradores de
REPRESENTANDO INSTRUÇÕES NO
COMPUTADOR
Exemplo:
Como ficaria a versão da linguagem real do MIPS para a seguinte
instrução?
add $t0, $s1, $s2
A representação decimal é:
- O primeiro e último campos combinados dizem ao computador que
essa instrução realiza uma soma;
- O segundo e o terceiro campos indicam o número dos registradores
que são os operandos da operação;
- O quarto campo contém o número do registrador que deverá receber a
soma;
- O quinto campo não é utilizado nessa instrução e por isso é definido
como 0.
A representação em binário é:
0
17
18
8
0
32
00000
REPRESENTANDO INSTRUÇÕES NO
COMPUTADOR
A versão numérica das instruções é chamada de Linguagem
de máquina.
Note que uma instrução MIPS ocupa exatamente 32 bits – o
mesmo tamanho de uma palavra de dados.
Campos do MIPS
Os campos do MIPS recebem nomes:
op
rs
rt
rd
shamt
funct
REPRESENTANDO INSTRUÇÕES NO
COMPUTADOR
Significado de cada nome:
op: operação básica da instrução, tradicionalmente chamado de
opcode;
rs: o registrador do primeiro operando de origem; rt: o registrador do segundo operando de origem;
rd: o registrador do operando de destino. Recebe o resultado da
operação;
shamt: “Shift amount” (quantidade de delocamento) (veremos mais
adiante como usá-lo);
funct: função. Esse campo seleciona a variante específica da
REPRESENTANDO INSTRUÇÕES NO
COMPUTADOR
Quando uma instrução precisa de campos maiores do que os
mostrados, usamos um formato diferente.
O primeiro formato visto é chamado de tipo-R (de
registrador) ou formato R.
Um segundo tipo de formato é o tipo I (de imediato) ou
formato I. Seus campos são:
6 bits 5 bits 5 bits 16 bits
op
rs
rt
constante
ou
endereço
REPRESENTANDO INSTRUÇÕES NO
COMPUTADOR
Os formatos são diferenciados pelos valores no
primeiro campo:
Instrução Format
o op rs rt rd Shamt Funct endereço
add R 0 reg reg reg 0 3410 n.a.
sub R 0 reg reg reg 0 3210 n.a.
add
immediate I 810 reg reg n.a. n.a. n.a. constante
lw I 3510 reg reg n.a. n.a. n.a. endereço
Sw I 4310 reg reg n.a. n.a. n.a. endereço
“reg” significa um número de registador, “endereço” significa um endereço de 16 bits e “n.a.” indica que o campo não aparece no formato. Nas instruções add e sub, o hardware usa o campo funct para decidir se a operação é de soma ou subtração.
REPRESENTANDO INSTRUÇÕES NO
COMPUTADOR
Exemplo
Veremos agora um exemplo completo daquilo que o
programador escreve até o que o computador executa.
A instrução: A[300] = h + A[300], é compilada para:
lw $t0, 1200($t1) # Reg. Temporário recebe A[300]
add $t0, $s2, $t0 # Reg. Temporário recebe h + A[300]
sw $t0, 1200($t1) # Armazena h + A[300] de volta para A[300]
Qual o código em linguagem de máquina para essas
instruções?
op rs rt rd endereço / shamt funct
35 9 8 1200
0 18 8 8 0 32
OPERAÇÕES LÓGICAS
Podemos utilizar na linguagem MIPS as operações
lógicas que já conhecemos:
Campo shamt
Este campo indica a quantidade de deslocamento que deve ser
feito em uma instrução do tipo sll ou srl.
Operações Lógicas Operadores C Instruções MIPS
Shift à esquerda << sll
Shift à direita >> srl
AND bit a bit & and, andi
OR bit a bit | or, ori
INSTRUÇÕES PARA TOMADA DE
DECISÕES
A tomada de decisão normalmente é representada
nas linguagens de programação usando a instrução if,
às vezes combinadas com instruções go to.
O MIPS possui duas instruções para tomada de
decisões. A primeira é:
beq registrador1, registrador2, L1
Significa ir até a instrução rotulada por L1 se o valor no
registrador1 for igual ao valor no registrador2
A segunda instrução é:
bne registrador1, registrador2, L1
Significa ir até a instrução rotulada por L1 se o valor no
INSTRUÇÕES PARA TOMADA DE
DECISÕES
Exemplo
Qual é o código MIPS compilado para a instrução if em C?
if (i == j) f = g + h; else f = g – h;
A primeira expressão compara a igualdade, por isso
poderíamos querer usar beq, mas o código será mais eficiente se testarmos a condição oposta ao desvio no lugar do código que realiza a parte subsequente do if:
bne $s3, $s4, Else add $s0, $s1, $s2 j Exit
Else: sub $s0, $s1, $s2 Exit:
A instrução j diz que o processador sempre deverá seguir o