Instrucoes
-
Upload
marcelle-guine -
Category
Documents
-
view
722 -
download
0
description
Transcript of Instrucoes
Projeto de InstruçõesProjeto de Instruções
Com o que vimos até aqui, não foi possível ter uma noção do quanto o formato das instruções pode variar de máquina para máquina
Por exemplo, o formato das instruções lidas por um processador de celular é, em geral, totalmente diferente do formato das instruções entendidas por um processador de um PC
1
Imagine que um novo processador para PCs(personal computers) seja lançado, e é muito mais rápido e muito maisbarato que todos osoutros. Tentador, é claro
Porém, o novo processador possui uma linguagem diferente, isto é, entende instruções diferentes dos outros processadores
2
O resultado é que este processador será basicamente inútil, mesmo com tantas vantagens
É claro que é possível desenvolver um compilador que traduza programas os programas de níveis superiores para a linguagem deste novo processador, mas isto não é suficiente
Quando instalamos softwares em nosso computador, estamos lidando apenas com o executável gerado por algum programa
Isto quer dizer que esses softwares já foram compilados anteriormente, de acordo com a linguagem dos processadores antigos. Logo, nada rodará no PC que utilizar o novo processador 3
O tipo de aplicação é determinante na escolha de cada detalhe da máquina que será desenvolvida para aquela aplicação
Em aplicações onde o desempenho é fundamental, o projetista escolherá as opções que tornam o processamento mais ágil, sem se importar muito com o custo (ex.: sistemas da NASA, supercomputadores)
Já em outras, a prioridade é minimizar o custo. Para essas, o projetista escolherá as opções que barateiam a máquina (ex.: celulares)
4
Vamos entender agora que critérios o projetista deveria levar em conta, na questão das instruções e seus formatos, caso fosse desenvolver uma nova máquina
Primeiramente, instruções curtas são mais vantajosas que as longas, por ocuparem menos espaço na memória
5
h
w
h
w/2
h.w bits h.w/2 bits
Além disso, cada memóriapossui uma taxa de transfe-rência de bits por segundo
Sendo assim, quanto menosbits uma instrução tiver, mais instruções poderão ser executadas a cada segundo
Isto dá ainda mais importância à atenção que se deve ter com a largura das instruções
Deve-se ter, porém, a mesma atenção para não diminuir demais a largura da instrução a ponto de não ser mais possível representar todas as operações que a máquina pode realizar 6
Para uma máquina capaz de realizar 2ⁿ operações, é impossível que as instruções tenham menos de n bits de largura, já que dessa forma não seria possível ter um opcode diferente para cada operação
Mesmo que as instruções não tenham operandos, como representar 8 operações com instruções de 2 bits de largura?
7
Para uma máquina capaz de realizar 2ⁿ operações, é impossível que as instruções tenham menos de n bits de largura, já que dessa forma não seria possível ter um opcode diferente para cada operação
Mesmo que as instruções não tenham operandos, como representar 8 operações com instruções de 2 bits de largura?
8
operação 1 00
Para uma máquina capaz de realizar 2ⁿ operações, é impossível que as instruções tenham menos de n bits de largura, já que dessa forma não seria possível ter um opcode diferente para cada operação
Mesmo que as instruções não tenham operandos, como representar 8 operações com instruções de 2 bits de largura?
9
operação 1
operação 2
00
01
Para uma máquina capaz de realizar 2ⁿ operações, é impossível que as instruções tenham menos de n bits de largura, já que dessa forma não seria possível ter um opcode diferente para cada operação
Mesmo que as instruções não tenham operandos, como representar 8 operações com instruções de 2 bits de largura?
10
operação 1
operação 2
operação 3
00
01
10
Para uma máquina capaz de realizar 2ⁿ operações, é impossível que as instruções tenham menos de n bits de largura, já que dessa forma não seria possível ter um opcode diferente para cada operação
Mesmo que as instruções não tenham operandos, como representar 8 operações com instruções de 2 bits de largura?
11
operação 1
operação 2
operação 3
operação 4
00
01
10
11
Para uma máquina capaz de realizar 2ⁿ operações, é impossível que as instruções tenham menos de n bits de largura, já que dessa forma não seria possível ter um opcode diferente para cada operação
Mesmo que as instruções não tenham operandos, como representar 8 operações com instruções de 2 bits de largura?
12
operação 1
operação 2
operação 3
operação 4
operações 5 em diante
00
01
10
11
Instruções fazem parte de palavras na memória Ao falar de blocos e cache, falamos de palavras
de forma superficial, como se fossem o mesmo que instruções. Mas na verdade, uma palavra é formada por uma ou mais instruções na memória
Palavras possuem tamanho fixo, pois ficam armazenadas em células da memória e estas possuem tamanho único
Entretanto, é possível que o tamanho das instruções varie. Dessa forma, cada palavra pode armazenar um número diferente de instruções
13
Dito isso, podemos falar sobre outro aspecto importante a ser notado: é bastante conveniente associar o tamanho de uma palavra da máquina ao código do caracter
Um caracter é definido por uma sequência de bits, que constituem esse código
Na computação em geral, é frequente a necessidade de manipular sequências de caracteres
Se o tamanho de cada palavra for múltiplo do tamanho do código do caracter, asseguramos que não haverá desperdício de bits quando se tratar de uma sequência de caracteres 14
Imagine uma máquina em que cada caracter seja representado por 6 bits e a cada palavra tenha um comprimento de 28 bits
A palavra “inconstitucional” ficaria armazenada na memória da seguinte forma (simplificada):
Repare que foram desperdiçados 4 bits de cada célula de memória, totalizando 16 bits perdidos15
6 12 18 24 28
i n c o
n s t i
t u c i
o n a l
bitsinúteis
bitsinúteis
bitsinúteis
bitsinúteis
Se fizermos o tamanho de cada palavra ser igual a 24 (múltiplo de 6), os caracteres se encaixariam perfeitamente e não haveria mais bits inúteis
Poderíamos também guardar partes do código de um caracter em palavras diferentes, mas isso aumentaria desnecessariamente o número de acessos
Por último, o tamanho de cada instrução depende também da forma como a memória é endereçada. Este aspecto está diretamente relacionado ao comprimento de cada palavra
16
Supondo uma máquina cujo código do caracter seja composto por 8 bits, e uma memória que precise armazenar 2¹⁶ caracteres
É possível fazer com que cada palavra tenha 8 bits, e desta forma cada célula de memória armazenaria 1 caracter. Nesse caso, seriam necessários 16 bits para indicar um endereço dessa memória
Agora suponha que uma instrução dessa máquina possui 8 bits reservados para opcode
Queremos comparar os caracteres que estão nos endereços 0 e 1 da memória, e o opcode da operação de comparação é 11111111 17
Com isso, nossa instrução ficaria assim:
Apenas essa instrução ocuparia 50 bits, isto é, 5 palavras!
Em algumas máquinas, o tamanho das instruções é variável ao longo da memória
É importante ressaltar que, da mesma forma que uma palavra pode conter várias instruções, uma instrução pode ocupar várias palavras caso o tamanho das instruções varie na memória 18
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
opcode(8 bits)
endereço do 1º caracter(16 bits)
endereço do 2º caracter(16 bits)
Então, outra opção é organizar a memória em palavras mais longas. Se utilizássemos, por exemplo, palavras de 32 bits ao invés de 8, reduziríamos os bits de endereço de 2¹⁶ para 2¹⁴ (igual a (2¹⁶)/4, já que 32 = 8 x 4)
O revés disso seria a necessidade de instruções adicionais para extrair o caracter desejado de uma palavra, que agora não contém aquele caracter apenas
19
char char char char char
char
char
char char char char
char char char char
0
1
2
0
1
2
caracter é localizável apenas pelo endereço
necessárias mais instruções para localizar um caracter entre os 4 armazenados por uma palavra
Vamos considerar agora apenas máquinas nas quais o tamanho das instruções não varia
Uma instrução com n bits de opcode permite à máquina 2ⁿ operações diferentes, enquanto k bits de endereço permitem endereçar 2k células de memória
Caso queiramos aumentar o número de células da memória, somos obrigados a reduzir o número de operações da máquina
A menor mudança que podemos fazer é acrescentar um bit de endereço, retirando um de opcode. Porém, só isso já acrescenta o dobro de endereços possíveis de serem indicados, em troca da perda de metade das possíveis operações 20
E se uma máquina tivesse 65 (2⁶ + 1) operações diferentes e uma memória com 512 (2⁹) células?
A máquina teria que ter no mínimo 7 bits de opcode e 9 bits de endereço, totalizando 16 bits; caso contrário, não seria possível representar todas as operações ou todos os endereços
Perceba que, por causa de somente uma operação, a princípio não é possível projetar a máquina com instruções de tamanho 15
Memórias armazenam milhares, milhões ou até bilhões de instruções. Logo, um bit a mais ou a menos por instrução faz grande diferença
21
Através da técnica conhecida como expansão de código de operação, é possível representar as 65 operações em 15 bits, sem sacrificar os 9 bits reservados ao endereçamento
A técnica consiste em fazer com que “um opcode represente várias operações em vez de uma”. A definição aparece entre aspas porque, na verdade, não se trata mais de um opcode, e sim de vários, originados pela expansão de um
Em outras palavras, reserva-se um opcode específico (por exemplo, 1111). A instrução que tiver esses 4 bits iniciais terá então, 8 bits de opcode e não mais 4 22
Dessa forma, instruções começadas em 11110000 e 11110001 por exemplo, passam a representar 2 operações
Naturalmente, esses 2 “novos” opcodes não podem representar operações que envolvem endereços da memória, já que não há mais espaço para indicá-los (restaram apenas 7 bits)
Um exemplo prático e simples pode ser visto na primeira máquina que estudamos, na tabela de macroinstruções retirada do livro Organização Estruturada de Computadores:
23
24
Repare que as instruções que não começam por 1111 possuem 4 bits de opcode. Já as demais possuem 8, e nenhuma delas tem endereços da memória como operando
Existem diversas classificações que podemos fazer com as instruções, e uma delas é relativa ao modo de endereçamento
Mas precisamos passar para um conceito mais geral de “endereço”. Não mais se tratará da memória principal apenas, mas de qualquer local onde instruções e/ou dados podem ser armazenados. Nesta definição, incluem-se os registradores da CPU 25
A classificação é bastante simples e é feita de acordo com a forma como cada instrução se refere ao(s) seu(s) operando(s)
Suponhamos uma instrução que faz o acumulador (registrador especial da CPU, já visto anteriormente) receber o seu próprio valor somado a 5, isto é, ac ← ac + 5
No endereçamento imediato, a instrução explicita claramente que é o valor 5 a ser somado com o valor do acumulador
No endereçamento direto, não é 5 o valor fornecido na instrução, mas sim o endereço da memória onde aquele valor está 26
Um método de endereçamento bem parecido com o anterior é o endereçamento de registrador, no qual a instrução fornece o endereço do registrador (e não da memória) onde está o valor a ser somado
No endereçamento indireto, a instrução fornece um endereço da memória onde se encontra um apontador, isto é, um número que representa o endereço onde de fato está o valor a ser somado. No nosso exemplo, se o valor 5 está no endereço 10 da memória, e o número 10 está no endereço 1, o acumulador será carregado com o valor 1. Então o apontador 10 presente no endereço 1 indicará a célula onde está o valor 5, que será somado como manda a instrução 27
O método de indexação auxilia em operações sobre estruturas de dados armazenados sequencialmente na memória Utiliza-se um ou mais registradores, os registradores
de índice, os quais possuem endereços de memória a serem acessados
Se queremos por exemplo, copiar o conteúdo de um vetor que começa na posição X para outro na posição Y, uma instrução pode indicar os endereços X e Y da memória e inicializar o registrador de índice com o valor 0. Desta forma, o valor contido em X + 0 será copiado para Y + 0
Depois, incrementa-se o registrador de índice até a última posição dos vetores. Assim, o valor em X + 1 será copiado para Y + 1, o valor em X + 2 será copiado para Y + 2, e assim por diante 28
Generalizando, pode-se dizer que o valor na posição X + n é copiado para o valor Y + n, onde n é o valor do registrador de índice e vai de 0 a k-1, sendo k o tamanho dos vetores
Esquematizando:
29
.
.
.
.
.
.
início do vetor 1(endereço X)
fim do vetor 1(endereço X + k - 1)
.
.
.
registradorde índice
.
.
.
vetor 1
.
.
.
vetor 2
v1
v2
vk
início do vetor 2(endereço Y)
fim do vetor 2(endereço Y + k - 1)
Generalizando, pode-se dizer que o valor na posição X + n é copiado para o valor Y + n, onde n é o valor do registrador de índice e vai de 0 a k-1, sendo k o tamanho dos vetores
Esquematizando:
30
.
.
.
.
.
.
início do vetor 1(endereço X)
fim do vetor 1(endereço X + k - 1)
.
.
.
registradorde índice
.
.
.
vetor 1
.
.
.
vetor 2
v1
v2
vk
0
RI é inicializado com 0início do vetor 2(endereço Y)
fim do vetor 2(endereço Y + k - 1)
o valor v1, que está em
X + 0, é copiado para
Y + 0
v1
Generalizando, pode-se dizer que o valor na posição X + n é copiado para o valor Y + n, onde n é o valor do registrador de índice e vai de 0 a k-1, sendo k o tamanho dos vetores
Esquematizando:
31
.
.
.
.
.
.
início do vetor 1(endereço X)
fim do vetor 1(endereço X + k - 1)
.
.
.
registradorde índice
.
.
.
vetor 1
.
.
.
vetor 2
v1
v2
vk
1
RI é incrementado e passa a ter o valor 1início do vetor 2
(endereço Y)
fim do vetor 2(endereço Y + k - 1)
o valor v2, que está em
X + 1, é copiado para
Y + 1
v1
v2
Generalizando, pode-se dizer que o valor na posição X + n é copiado para o valor Y + n, onde n é o valor do registrador de índice e vai de 0 a k-1, sendo k o tamanho dos vetores
Esquematizando:
32
.
.
.
.
.
.
início do vetor 1(endereço X)
fim do vetor 1(endereço X + k - 1)
.
.
.
registradorde índice
(RI)
.
.
.
vetor 1
.
.
.
vetor 2
v1
v2
vk
k - 1
RI é incrementado pela última vez e passa a ter o valor k - 1início do vetor 2
(endereço Y)
fim do vetor 2(endereço Y + k - 1)
o processo se repete até que vk, que está em X + k - 1, é
copiado para Y + k - 1
v1
v2
vk
Finalmente, no endereçamento de pilha, a instrução fornece apenas a operação a ser feita. Seu opcode já irá especificar que os operandos são os dois presentes no topo de uma pilha. Estes são retirados e a operação fornecida é executada sobre eles, e o resutado é colocado de volta na pilha
33
Finalmente, no endereçamento de pilha, a instrução fornece apenas a operação a ser feita. Seu opcode já irá especificar que os operandos são os dois presentes no topo de uma pilha. Estes são retirados e a operação fornecida é executada sobre eles, e o resutado é colocado de volta na pilha
34
3
5
.
.
.
.
.
stackpointer
Finalmente, no endereçamento de pilha, a instrução fornece apenas a operação a ser feita. Seu opcode já irá especificar que os operandos são os dois presentes no topo de uma pilha. Estes são retirados e a operação fornecida é executada sobre eles, e o resutado é colocado de volta na pilha
35
3
5
.
.
.
.
.
stackpointer
.
.
.
.
.
stackpointer
3 + 5 = 8
Finalmente, no endereçamento de pilha, a instrução fornece apenas a operação a ser feita. Seu opcode já irá especificar que os operandos são os dois presentes no topo de uma pilha. Estes são retirados e a operação fornecida é executada sobre eles, e o resutado é colocado de volta na pilha
36
3
5
.
.
.
.
.
stackpointer
.
.
.
.
.
stackpointer
3 + 5 = 88
.
.
.
.
.
stackpointer
Outra classificação possível para instruções é quanto ao seu tipo, o qual indica superficialmente sobre o que a instrução é responsável em termos de execução
Instruções de transferência de dados servem para copiar dados não só de um endereço para o outro na memória, mas também para registradores e pilhas, por exemplo
Instruções que utilizam operações diáticas são aquelas que combinam dois operandos com a finalidade de produzir um resultado. Exemplos comuns são instruções de soma, subtração, multiplicação, divisão e operações booleanas
37
Já as instruções com operações monádicas utilizam apenas um operando para produzir um resultado. É o caso da operação booleana de negação e do deslocamento de bits, entre outros
Instruções de comparação e desvios condicionais também são frequentemente utilizadas e sua classificação é auto explicativa: testam valores e operam desvios caso os valores atendam uma determinada condição
Chamadas de procedimentos são instruções que iniciam a execução de um grupo de instruções (por exemplo, funções) dentro de um programa. Como vimos há alguns (muitos) slides atrás, a chamada de uma função geralmente invoca a criação de uma pilha, tarefa que cabe às chamadas de procedimentos 38
Instruções de controle de loop não haviam sido vistas até agora, até por serem bem particulares, mas servem basicamente para controlar iterações de uma forma menos “manual” Tínhamos uma instrução para incrementar uma
variável que controlava o loop, e depois outra para testar esta variável e executar um desvio se preciso, sendo que ambas eram processada a cada iteração
Uma instrução de controle de loop, na única vez em que é processada, inicia um contador e especifica uma condição. O contador é testado a partir desta condição, e quando a condição é satisfeita, o loop é encerrado. Seja x o número de iterações, deixamos de processar 2x instruções para processar apenas uma
39
Instruções de Entrada/Saída determinam as operações de leitura e escrita Tais instruções contam com um DMA (Direct Access
Memory ou Acesso Direto à Memória), que controla o fluxo de dados entre a memória principal e softwares que estão sendo executados
O DMA possui 4 registradores especiais, detalhados no seguinte esquema:
40
Endereço
Contador
Dispositivo
Direção
armazena o endereço da memória a ser lido/escrito
indica quantas palavras devem ser transferidas
indica o número do dispositivo de E/S a ser usado
armazena 0 ou 1, para informar se a operação será
de leitura ou escrita
O DMA frequentemente precisa interromper as atividades do processador para controlar operações de leitura e escrita, já que dispostivos de E/S geralmente não toleram atrasos. Seria bem desagradável se, por exemplo, para todas as letras que digitássemos do teclado, houvesse um pequeno atraso em sua exibição na tela
Para máquinas que fazem muitas operações de E/S, é necessária uma espécie de miniprocessador adicional. São os canais de dados, que podem até receber e executar programas sem nenhuma ajuda da CPU
No momento em que a CPU ordena o início de uma operação de E/S, o canal de dados entra em ação
41
O canal passa então a interagir com a memória para buscar tudo o que é necessário para executar instruções vindas de algum dispositivo de E/S sem que a CPU precise “se preocupar” com isso
Ficam armazenados na memória: um endereço de buffer, que informa onde dados devem ser lidos ou escritos pelo canal; o endereço do programa de canal, onde começa o programa que contém as instruções a serem executadas pelo canal; um contador, responsável por indicar quantas palavras possui o programa de canal; e alguns bits de flag, que informam atividades como interrupção do canal após o processamento de uma determinada instrução
42