Instrucoes

42
Projeto de Instruções Projeto 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

description

 

Transcript of Instrucoes

Page 1: 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

Page 2: Instrucoes

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

Page 3: Instrucoes

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

Page 4: Instrucoes

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

Page 5: Instrucoes

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

Page 6: Instrucoes

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

Page 7: Instrucoes

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

Page 8: Instrucoes

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

Page 9: Instrucoes

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

Page 10: Instrucoes

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

Page 11: Instrucoes

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

Page 12: Instrucoes

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

Page 13: Instrucoes

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

Page 14: Instrucoes

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

Page 15: Instrucoes

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

Page 16: Instrucoes

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

Page 17: Instrucoes

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

Page 18: Instrucoes

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)

Page 19: Instrucoes

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

Page 20: Instrucoes

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

Page 21: Instrucoes

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

Page 22: Instrucoes

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

Page 23: Instrucoes

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

Page 24: Instrucoes

24

Page 25: Instrucoes

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

Page 26: Instrucoes

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

Page 27: Instrucoes

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

Page 28: Instrucoes

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

Page 29: Instrucoes

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)

Page 30: Instrucoes

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

Page 31: Instrucoes

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

Page 32: Instrucoes

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

Page 33: Instrucoes

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

Page 34: Instrucoes

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

Page 35: Instrucoes

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

Page 36: Instrucoes

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

Page 37: Instrucoes

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

Page 38: Instrucoes

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

Page 39: Instrucoes

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

Page 40: Instrucoes

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

Page 41: Instrucoes

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

Page 42: Instrucoes

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