Quais são os exemplos típicos de funções aritméticas executadas pela ULA?

Revisão Prova 3

Organização e Arquitetura de Computadores

Alysson Milanez

Unidade Lógica e Aritmética (ULA)

2

ULA

A ULA é o componente do processador responsável pela realização de operações matemáticas (aritméticas e lógicas) requeridas por instruções de máquina específicas, tais como uma instrução para adicionar o valor de um registrador em outro ou fazer uma comparação lógica entre um registrador e um operador.

3

ULA

Todos os outros elementos do computador - unidade de controle, registradores, memória, E/S - servem, principalmente, para trazer os dados a serem processados pela ULA e receber os resultados das operações efetuadas.

De certo modo, a ULA constitui o núcleo ou a essência de um computador.

4

ULA

Assim como todos os componentes eletrônicos de um computador, a ULA é baseada em dispositivos lógicos digitais simples, capazes de armazenar dígitos binários e efetuar operações simples de lógica booleana.

5

ULA

Genericamente, uma ULA é organizada de modo a possuir algumas entradas e saídas.

6

ULA

Unidade de controle

Registradores

Bits especiais

Registradores

ULA

Os dados são fornecidos à ULA em registradores e os resultados de uma operação são armazenados em registradores.

Esses registradores são áreas de armazenamento temporário dentro do processador.

A ULA pode também ativar bits especiais (flags) para indicar O resultado de uma operação.

7

ULA

Por exemplo, caso o resultado de uma operação exceda a capacidade de armazenamento de um registrador, isso é indicado atribuindo o valor 1 ao bit de overflow.

Esses bits especiais são também armazenados em registradores internos do processador. A unidade de controle fornece sinais para controlar a operação da ULA e a transferência de dados entre a ULA e os registradores.

8

ULA

Os circuitos da ULA são basicamente dedicados a:

  • realizar operações de soma;
  • realizar operações lógicas AND e OR;
  • possuir um circuito inversor (NOT) ou de complemento;
  • possuir um circuito para efetuar deslocamentos dos bits de um número; e
  • realizar operações de multiplicação.

9

ULA

As operações lógicas podem testar três condições:

1. Condição de Igualdade: é o teste da condição igual a, em que é comparado se os valores determinados são iguais.

2. Condição menor que: compara dois valores para determinar se o primeiro é menor que o segundo.

3. Condição maior que: compara dois valores para determinar se o primeiro é maior que o segundo.

10

ULA

As operações matemáticas são usualmente as de adição, deslocamento, rotação e operações lógicas, todas essas realizadas sobre dois operandos; e as de complemento, que utiliza apenas um único operando.

11

ULA

Nos processadores mais antigos, o barramento interno de dados servia para interligar a ULA a um registrador especial chamado acumulador (ACC) e aos demais registradores e daí à memória principal.

12

ULA

Nos sistemas mais antigos, havia a possibilidade de utilização de dois tipos de processadores, sendo um deles exclusivo para realização de operações aritméticas com valores fracionários (ponto flutuante); tais processadores eram chamados de co-processadores matemáticos (e.g. Intel 8087 - que funcionava com o Intel 8086/8088; e o Intel 80387, que operava com o Intel 80386).

Mais detalhes desses co-processadores podem ser obtidos aqui.

13

ULA

Nos processadores mais modernos, com mais componentes, o barramento interno conduz os bits de dados de e para a memória cache L1 (e também para os demais níveis de cache, se disponíveis no dado processador), com um dos N registradores de dados e daí para a ULA que processa os valores.

14

ULA

Qualquer ULA é um conglomerado de circuitos lógicos e componentes eletrônicos simples que, integrados, realizam as operações (lógicas e aritméticas). A ULA pode ser uma parte pequena da pastilha do processador, usada em pequenos sistemas, ou pode compreender um considerável conjunto de componentes lógicos de alta velocidade, sendo que os processadores vêm utilizando em suas arquiteturas mais de uma ULA, tornando a execução mais rápida.

15

ULA

Nós podemos projetar uma ULA em três etapas. Na primeira, nós projetamos a seção aritmética. Então a seção lógica, e por fim, combinamos as duas seções para formar a ULA.

16

ULA

Já o componente para executar cálculos com números fracionários (representados em ponto flutuante), não realiza operações lógicas e seu nome, desde o Intel 486, tem sido FPU - Unidade de Ponto Flutuante (Floating Point Unit).

17

Registradores de dados

18

Registradores de dados

Para que um dado possa ser transferido para a ULA, é necessário que ele permaneça, mesmo que por um breve instante, armazenado em um registrador. Além disso, o resultado de uma operação aritmética ou lógica realizada na ULA deve ser armazenado temporariamente, de modo que possa ser reutilizado mais adiante (por outra instrução) ou apenas para ser, em seguida, transferido para a memória.

19

Registradores de dados

Mesmo no caso dos atuais processadores, que possuem uma boa quantidade de cache L1, os registradores continuam a ser importantes.

Para atender a esses propósitos, os processadores são fabricados contendo certa quantidade de registradores, destinados ao armazenamento de dados. Servindo de memória auxiliar para a ULA.

20

Registradores de dados

Os registradores de dados de alguns processadores têm uma largura igual ao tamanho estabelecido pelo fabricante para a palavra do referido processador, quando se trata de registradores para valores inteiros e que operam com a unidade de execução de cálculos de valores inteiros, enquanto possuem, em geral, o dobro da largura da palavra quando se trata de registradores para armazenar números em ponto flutuante, a serem manipulados pelas unidades de cálculo de ponto flutuante (FPU).

21

Registradores de dados

Desse modo, processadores que possuem palavra de 16 bits devem ter seus registradores de dados com largura de 16 bits, assim como aqueles que possuem palavra de 32 ou 64 bits devem ser fabricados com seus registradores de dados com largura de 32 e 64 bits, respectivamente.

22

Registradores especiais de estado

23

Registradores especiais de estado

Os principais bits de estado são:

- sinal: contém o sinal resultante da última operação aritmética realizada pelo processador.

- overflow: quando setado (= 1) indica que a última operação aritmética realizada resultou em estouro do valor, um erro.

- zero: quando setado (= 1) indica que a última operação aritmética realizada resultou no valor zero.

24

Registradores especiais de estado

- vai 1 (carry): indica que ocorreu "vai 1" para o bit mais à esquerda na última operação de soma realizada. Pode indicar, também, overflow em operações com números sem sinal.

- paridade: é setado (= 1) ou não (= 0), dependendo da quantidade de bits 1 no byte recebido.

25

Aritmética de números inteiros

26

Aritmética de números inteiros

Os dois aspectos mais importantes da aritmética computacional são o modo como os números são representados (o formato binário) e os algoritmos usados para as operações aritméticas básicas (adição, subtração, multiplicação e divisão). Isso se aplica tanto para a aritmética de números inteiros quanto para a de números de ponto flutuante.

27

Aritmética de números inteiros

Números de ponto flutuante são expressos na forma de um número (mantissa) multiplicado por uma constante (base) elevada a uma potência inteira (expoente). Eles podem ser usados para representar números muito grandes e muito pequenos.

A maioria dos processadores implementa o padrão IEEE 754 para representação e aritmética de números de ponto flutuante. Esse padrão define um formato de 32 bits e de 64 bits.

28

Negação

29

Negação

Na representação sinal-magnitude, a regra para a negação de um número inteiro é simples: basta inverter o valor do bit de sinal. Na notação em complemento de dois, a negação de um número inteiro é obtida pelos seguintes passos:

1. Tome o complemento booleano de cada bit do número (incluindo o bit de sinal), isto é, troque cada 1 por 0 e cada 0 por 1.

2. Adicione 1 ao resultado, visto como um número inteiro binário sem sinal.

30

Negação

Supomos, ao adicionar 1, que a sequência de bits representa um número inteiro sem sinal (obtido fazendo o complemento bit a bit do número original) e tratamos o resultado, então, como um número inteiro em complemento de dois. Dois casos especiais devem ser considerados. O primeiro é se A = 0.

31

Negação

Nesse caso, para uma representação de 8 bits, temos:

0 = 00000000 (complemento de dois)

complemento bit a bit = 11111111

+1

100000000 = 0

O bit "vai-um" (carry-in) com valor 1 obtido na posição mais à esquerda é ignorado. Como resultado, temos que o complemento de dois de 0 é 0, como deveria ser.

32

Negação

O segundo caso especial é mais problemático. Se negarmos o padrão de bits constituído de um bit com valor 1 seguido de n-1 bits de valor 0, obteremos esse mesmo número. Por exemplo, para uma palavra de 8 bits, temos:

-128 = 10000000

complemento de bit a bit = 01111111

+1

10000000 = -128

33

Negação

Essa anomalia não pode ser evitada. O número de padrões de bits distintos de uma palavra de n bits é 2n, que é um número par. Desejamos representar números inteiros positivos, negativos e 0.

34

Negação

Se a quantidade de números inteiros positivos e negativos que podem ser representados for a mesma (sinal-magnitude), então existirão duas representações para 0. Se existir apenas uma representação para 0 (complemento de dois), então as quantidades de números positivos e negativos que podem ser representados serão diferentes.

35

Negação

No caso da representação em complemento de dois, usando uma palavra de n-bits, haverá uma representação para o valor -2n, mas não para +2n.

36

Adição e Subtração

37

Adição e Subtração

Se o resultado da operação for positivo, será obtido um número positivo na notação binária.

Se for negativo, será obtido um número negativo em complemento de dois.

38

Adição e Subtração

O resultado de uma adição pode ter um número de bits maior do que o tamanho da palavra usada. Essa condição é denominada overflow. Quando ocorre overflow, a ULA precisa sinalizar esse fato, para que o resultado não seja usado. A detecção de overflow é feita de acordo com a seguinte regra: na adição de dois números, ambos positivos ou negativos, ocorrerá overflow somente se o resultado tiver sinal oposto.

39

Adição e Subtração

A subtração também é implementada facilmente, usando a seguinte regra: para subtrair um número S (subtraendo) de um número M (minuendo), pegue o complemento de dois (negação) de S e acrescente esse valor a M.

40

Adição e Subtração

Note que, para números com n bits, podemos subtrair um valor k positivo (ou adicionar um valor k negativo) movendo 2n - k posições no sentido horário. Note ainda que 2n - k é o complemento de dois de k.

Isso demonstra que a subtração M - S pode ser feita somando a M o complemento de dois de S.

41

Adição e Subtração

A Figura a seguir sugere os caminhos de dados e elementos de hardware necessários para efetuar a adição e a subtração. O elemento central é um somador binário (ou meio-somador), que recebe dois números e produz como resultado a soma desses números e uma indicação e overflow. O somador binário trata os dois operandos como números inteiros sem sinal. Esses dois operandos são apresentados ao somador em dois registradores, designados, nesse caso, como registradores A e B.

42

Adição e Subtração

O resultado pode ser armazenado em um desses registradores ou em um terceiro. A ocorrência de overflow é indicada por um bit de overflow (0 = não ocorreu overflow; 1 = ocorreu overflow). Na operação de subtração, o subtraendo (registrador B) é passado por um circuito que calcula seu complemento de dois, sendo esse valor, então, passado para o somador.

43

Adição e Subtração

44

Multiplicação

45

Multiplicação: inteiros sem sinal

Algumas observações importantes a serem feitas:

1. A multiplicação envolve a geração de produtos parciais, um para cada dígito do multiplicador. Esses produtos parciais são somados para a obtenção do produto final.

2. Os produtos parciais são determinados facilmente. Quando o bit do multiplicador é 0, o produto parcial é 0. Quando é 1, o produto parcial é o próprio multiplicando.

46

Multiplicação: inteiros sem sinal

3. O produto total é obtido somando-se os produtos parciais. Para isso, cada produto parcial sucessivo é deslocado um dígito para a esquerda, em relação ao produto parcial anterior.

4. A multiplicação de números inteiros binários de n bits resulta em um produto com até 2n bits de comprimento.

47

Multiplicação: inteiros sem sinal

Multiplicações podem ser feitas de modo mais eficiente do que na forma usual, em que são feitas usando-se lápis e papel. Primeiro, podemos acumular imediatamente cada produto parcial obtido, em vez de esperar o cálculo de todos os produtos parciais. Isso elimina a necessidade de armazenar todos os produtos parciais; é preciso, dessa maneira, um número menor de registradores.

48

Multiplicação: inteiros sem sinal

Segundo, podemos poupar algum tempo na geração de produtos parciais. Para cada 1 no multiplicador, é necessário realizar uma operação de soma e um deslocamento; para cada 0, apenas um deslocamento é necessário.

49

Multiplicação: inteiros sem sinal

A figura mostra uma implementação possível que emprega essas idéias.

O multiplicador e o multiplicando são carregados em dois registradores (Q e M).

50

Multiplicação: inteiros sem sinal

Também é necessário um terceiro registrador, o registrador A, que é inicializado com valor 0. Existe ainda um registrador C, de 1 bit, inicializado com 0, que contém um potencial bit 'vai-um' resultante da adição.

A operação do multiplicador se dá como a seguir. A lógica de controle lê os bits do multiplicador, um de cada vez.

51

Multiplicação: inteiros sem sinal

Se Q0 for 1, o multiplicador será adicionado ao registrador A e o resultado, armazenado nesse registrador, sendo o bit C usado para indicar a ocorrência de overflow. Então, todos os bits dos registradores C, A e Q são deslocados um bit para a direita, de modo que o bit C vá para An-1, A0 vá para Qn-1 e Q0 seja perdido.

52

Multiplicação: inteiros sem sinal

Se Q0 é 0, então nenhuma adição é efetuada, sendo feito apenas o deslocamento dos bits. Esse processo é repetido para cada bit do multiplicador original. O produto de 2n bits resultante estará contido nos registradores A e Q.

53

Multiplicação: números em complemento de 2

Vimos que é possível fazer adição e subtração de números na notação em complemento de dois tratando-os como números inteiros sem sinal. Considere o seguinte:

1001

+ 0011

1100

54

Multiplicação: números em complemento de 2

Se esses números forem considerados números inteiros sem sinal, então estaremos fazendo a adição 9 (1001) mais 3 (0011) para obter 12 (1100).

Como os números são representados em complementos de dois, estamos de fato fazendo a adição -7 (1001) mais 3 (0011) e obtendo -4 (1100).

55

Multiplicação: números em complemento de 2

Infelizmente, esse esquema simples não funciona para a multiplicação. Para mostrar isso, consideramos novamente a multiplicação de 11 (1011) por 13 (1101), obtendo 143 (10001111).

Se interpretarmos esses números como números em complemento de dois, teremos -5 (1011) vezes -3 (1101), que é igual a -113 (10001111).

56

Multiplicação: números em complemento de 2

Esse exemplo nos mostra que a multiplicação direta não funciona se o multiplicando e o multiplicador são negativos. De fato, ela não funciona nos casos em que o multiplicando ou o multiplicador é negativo.

Lembre-se de que qualquer número binário sem sinal pode ser expresso como uma soma de potências de 2.

A multiplicação de um número binário por 2n é feita deslocando esse número n bits para a esquerda.

57

Multiplicação: números em complemento de 2

Os produtos parciais devem ser vistos como números de 2n bits, gerados a partir de um multiplicando de n bits. Dessa maneira, o multiplicando 1011 de 4 bits é armazenado como um número inteiro sem sinal em uma palavra de 8 bits, ou seja, como 00001011. Cada produto parcial (exceto o correspondente a 20) é constituído desse número deslocado para a esquerda, com as posições não ocupadas à direita preenchidas com zeros (por exemplo, um deslocamento para a esquerda de duas posições produz 00101100).

58

Multiplicação: números em complemento de 2

Podemos agora ver que a multiplicação direta não funciona no caso em que o multiplicando é negativo. O problema é que cada contribuição do multiplicando negativo como produto parcial deve ser um número negativo de 2n bits; os bits de sinal dos produtos parciais devem ser alinhados. Se esses números são tratados como números inteiros sem sinal, a multiplicação 9 x 3 = 27 prossegue da forma usual.

59

Multiplicação: números em complemento de 2

No entanto, se 1001 for interpretado como o número em complemento de dois que representa o valor -7, então cada produto parcial deverá ser um número negativo, em complemento de dois, de 2n (8) bits. Isso pode ser feito estendendo cada produto parcial para a esquerda, com bits de valor 1.

60

Multiplicação: números em complemento de 2

1001 (-7)

x 0011 (3)

11111001 (-7) x 20 = (-7)

11110010 (-7) x 21 = (-14)

11101011 (-21)

61

Multiplicação: números em complemento de 2

É fácil perceber que a multiplicação direta também não funciona se o multiplicador é negativo. A razão é que, nesse caso, os bits do multiplicador não correspondem aos deslocamentos e às multiplicações que devem ocorrer. Por exemplo, considere o número decimal -3, escrito em complemento de dois com 4 bits como 1101. Se calcularmos os produtos parciais simplesmente com base no valor de cada posição de bit, obteremos a seguinte correspondência:

1101 <-> -(1*23 + 1*22+ 0*21 + 1*20) = - (23 + 22+ 20)

62

Multiplicação: números em complemento de 2

Na realidade o que se deseja obter é: -(21 + 20). Portanto, o multiplicador não pode ser usado diretamente da maneira como descrevemos.

Existem diversas soluções possíveis para esse dilema. Uma delas seria converter o multiplicador e o multiplicando para números positivos, efetuar a multiplicação e, então, caso o sinal dos dois números originais seja diferente, tomar o complemento de dois do resultado.

63

Multiplicação: números em complemento de 2

Os projetistas têm preferido usar técnicas que não requeiram esse passo final de transformação. Um dos algoritmos mais usados é o algoritmo de Booth. Esse algoritmo tem também a vantagem de efetuar a multiplicação de maneira mais rápida do que em uma abordagem mais direta.

64

Algoritmo de Booth

65

Multiplicação: números em complemento de 2

Descrição do algoritmo de Booth: multiplicador e multiplicando são armazenados nos registradores Q e M, respectivamente. Existe também um registrador de 1 bit, posicionado logicamente à direita do bit menos significativo (Q0) do registrador Q é designado como Q-1, cujo uso é explicado a seguir. O resultado da multiplicação é dado nos registradores A e Q. A e Q-1 são inicializados com valor 0. Como antes, a lógica de controle examina os bits do multiplicador, um de cada vez.

66

Multiplicação: números em complemento de 2

Quando cada bit é examinado, também é examinado o bit à sua direita. Se esses dois bits forem iguais (1-1 ou 0-0), então todos os bits dos registradores A, Q e Q-1 serão deslocados 1 bit para a direita. Se eles forem diferentes, o multiplicando será somado ou subtraído do registrador A, dependendo se os dois bits são 0-1 ou 1-0, respectivamente.

67

Multiplicação: números em complemento de 2

Após essa operação de adição ou subtração, ocorre o deslocamento de um bit para a direita, que é feito de tal maneira que o bit mais à esquerda de A, denominado An-1, é deslocado para An-2, mas também permanece em An-1. Isso é necessário para preservar o sinal do número armazenado em A e Q. Esse deslocamento é conhecido como deslocamento aritmético, porque preserva o bit de sinal.

68

Multiplicação: números em complemento de 2

O algoritmo de Booth funciona com qualquer combinação de números positivos e negativos. Além disso, o algoritmo é eficiente: blocos de 1s e 0s são ignorados, sendo feita, em média, apenas uma adição ou subtração por bloco.

Por que o algoritmo funciona?

69

Multiplicação: números em complemento de 2

Consideremos o caso em que o multiplicador é positivo. Suponhamos que o multiplicador seja constituído de um bloco de 1s cercado por 0s (e.g. 00011110). Como sabemos, a multiplicação pode ser feita somando-se cópias deslocadas do multiplicando:

M x (00011110) = M x (24 + 23 + 22 + 21)

= M x (16 + 8 + 4 + 2)

= M x 30

70

Multiplicação: números em complemento de 2

O número de operações requerido pode ser reduzido para dois se observarmos o seguinte:

2n + 2n-1 + … + 2n-K = 2n+1 - 2n-K

Logo:

M x (00011110) = M x (25 - 21)

= M x (32 - 2)

= M x 30

71

Multiplicação: números em complemento de 2

Assim, o produto pode ser gerado efetuando-se apenas uma adição e uma subtração do multiplicando. Esse esquema pode ser estendido para qualquer número de blocos de 1s do multiplicador, incluindo o caso em que o bloco tem um único 1.

O algoritmo de Booth opera de acordo com esse esquema, efetuando uma subtração quando é encontrado o primeiro 1 de um bloco (1 - 0) e uma adição quando é encontrado o fim do bloco (0 - 1).

72

Multiplicação: números em complemento de 2

Para mostrar que esse esquema também funciona se o multiplicador for negativo, observe o seguinte. Seja X um número negativo na notação em complemento de dois:

Representação de X = {1xn-2xn-3...x1x0}

Então X pode ser expresso como:

X = -2n-1 + (xn-2*2n-2) + (xn-3*2n-3) + … + (x1*21) + (x0*20)

73

Multiplicação: números em complemento de 2

O bit mais à esquerda de X é 1, uma vez que X é negativo. Suponha que o bit de valor 0, mais à esquerda, esteja na posição k. Então, X é da forma:

Representação de X = {111...10xk-1xk-2...x1x0}

E o valor de X é:

X = -2n-1 + 2n-2 + … 2k+1 + (xk-1*2k-1) + … + (x0*20)

74

Multiplicação: números em complemento de 2

Obtemos que:

2n-2 + … 2k+1 = 2n-1 - 2k+1

Reordenando os termos:

- 2n-1 + 2n-2 + … 2k+1 = - 2k+1

Substituindo: X = -2k+1 + (xk-1*2k-1) + … + (x0*20)

75

Multiplicação: números em complemento de 2

Retornando ao algoritmo de Booth: Tendo em vista a representação de X, todos os bits desde x0 até o bit de valor 0 mais à esquerda são manipulados de maneira adequada, exceto (-2k+1), e assim estão na forma correta. À medida que o algoritmo examina o bit 0 mais à esquerda e encontra o próximo 1 (2k+1), ocorre uma transição 1 - 0 e é realizada uma subtração (-2k+1).

76

Multiplicação: números em complemento de 2

O algoritmo de Booth efetua uma subtração quando o primeiro 1 é encontrado (1 - 0), uma adição quando é encontrada uma transição (0 - 1) e, finalmente, outra subtração quando o primeiro 1 do próximo bloco de 1s é encontrado. Portanto, o algoritmo de Booth efetua menos adições e subtrações do que um algoritmo mais direto.

77

Divisão

78

Divisão

A divisão é, de certa maneira, mais complexa que a multiplicação, embora seja baseada nos mesmos princípios gerais. Como antes, a base para o algoritmo é a abordagem usada ao efetuar a operação com lápis e papel, e a operação envolve repetidas execuções de adição, subtração e deslocamento.

79

Divisão: processo

Primeiramente, os bits do dividendo são examinados, da esquerda para a direita, até que se obtenha um conjunto de bits que represente um número maior ou igual ao divisor. Quando esse número é encontrado, diz-se que o divisor divide o número. Enquanto isso não ocorre, são introduzidos 0s no quociente, da esquerda para a direita. Quando esse evento ocorre, é colocado um 1 no quociente e o divisor é subtraído do dividendo parcial.

80

Divisão: processo

O resultado é conhecido como resto parcial. Desse ponto em diante, a divisão segue um padrão cíclico. A cada ciclo, bits adicionais do dividendo são anexados ao resto parcial, até que o resultado seja maior ou igual ao divisor. Como antes, o divisor é subtraído desse número, para produzir um novo resto parcial. O processo continua até que todos os bits do dividendo tenham sido examinados.

81

Algoritmo

Divisão de números binários sem sinal.

82

Divisão

Esse processo pode, com alguma dificuldade, ser estendido para números negativos. Uma possível abordagem para números em complemento de dois é apresentada a seguir. O algoritmo pode ser descrito como:

1. Carregar o divisor no registrador M e o dividendo nos registradores A e Q. O dividendo deve ser expresso como um número em complemento de dois com 2n bits. Por exemplo, o número 0111 de 4 bits seria 00000111.

83

Divisão

2. Deslocar o conteúdo dos registradores A e Q, juntos, um bit para a esquerda.

3. Se M e A têm o mesmo sinal, fazer A = A - M; caso contrário, A = A + M.

4. A operação anterior será bem-sucedida se o sinal de A for o mesmo, antes e depois da operação.

84

Divisão

4. a) Se a operação for bem-sucedida ou se (A == 0 e Q == 0), então faça Q0 = 1.

4. b) Se a operação não for bem-sucedida e se (A != 0 ou Q != 0), então faça Q0 = 0 e restaure o antigo valor de A (somando M a A).

5. Repita os passos 2 a 4 enquanto houver bits a examinar em Q.

85

Divisão

Ao final, o resto estará em A. Se o divisor e o dividendo tiverem o mesmo sinal, o quociente estará em Q; caso contrário, o quociente correto é o complemento de dois do número armazenado em Q.

86

Aritmética de números ponto flutuante

87

Aritmética de números ponto flutuante

Nas operações de adição e subtração, é necessário assegurar que os dois operandos tenham o mesmo valor de expoente, o que pode requerer o deslocamento da vírgula fracionária em um dos operandos para se obter o alinhamento apropriado.

A multiplicação e a divisão são mais diretas.

88

Aritmética de números ponto flutuante

Alguns problemas podem ocorrer como resultado dessas operações:

  • Overflow no expoente: um expoente positivo excede o maior valor possível para um expoente. Em alguns sistemas, isso pode ser designado como +∞ ou -∞.
  • Underflow no expoente: um expoente negativo é menor que o menor valor possível para um expoente. Isso significa que o número é muito pequeno para ser representado e pode ser tratado como sendo 0.

89

Aritmética de números ponto flutuante

  • Underflow na mantissa: no processo de alinhamento das mantissas, pode ocorrer o transbordo de dígitos para fora da extremidade da direita da mantissa. Isso requer alguma forma de arredondamento.
  • Overflow na mantissa: a adição de duas mantissas de mesmo sinal pode resultar em um 'vai-um' do bit mais significativo. Isso pode ser corrigido com um novo alinhamento do número.

90

Adição e subtração

91

Adição e subtração

O algoritmo de adição e de subtração tem quatro fases básicas:

  • Verificar se algum operando é zero.
  • Alinhar as mantissas.
  • Adicionar ou subtrair as mantissas.
  • Normalizar o resultado.

92

93

Um fluxograma típico das operações.

Adição e subtração

Uma descrição passo a passo realça as principais funções requeridas na adição e na subtração de números de ponto flutuante. Considere um formato semelhante a X = Xs * BXE.

Em uma operação de adição ou subtração, os dois operandos devem ser armazenados em registradores usados pela ULA.

94

Adição e subtração

Se o formato de ponto flutuante inclui um bit de mantissa implícito, esse bit deve ser tornado explícito no momento de efetuar a operação.

Como a adição e a subtração são idênticas, exceto por uma mudança de sinal, o processo começa pela mudança de sinal do subtraendo, caso a operação seja uma subtração. A seguir, se o operando for 0, o resultado será o valor do outro operando.

95

Adição e subtração

O alinhamento pode ser obtido tanto deslocando o número menor para a direita (aumentando seu expoente) quanto deslocando o número maior para a esquerda.

Como ambas as operações podem resultar em perda de dígitos, o deslocamento é efetuado no número de menor expoente; qualquer dígito perdido tem, portanto, um valor relativamente menor.

96

Adição e subtração

O alinhamento é feito deslocando os dígitos da mantissa para a direita e incrementando o expoente, repetidamente, até que os dois expoentes sejam iguais. (Note que, se a base implícita for 16, o deslocamento de um dígito para a direita corresponderá a um deslocamento para a direita de 4 bits.)

97

Adição e subtração

Caso esse processo resulte em valor 0 na mantissa, o resultado da operação é o outro número. Portanto, se os dois números tiverem expoentes que diferem significativamente, o menor número será perdido.

98

Adição e subtração

Em seguida, as duas mantissas são somadas, levando em conta seus sinais. Como os sinais podem ser diferentes, o resultado pode ser 0. Também existe a possibilidade de ocorrer overflow na mantissa por um dígito. Nesse caso, a mantissa do resultado é deslocada para a direita e o expoente é incrementado. Essa operação pode resultar em overflow no expoente, o que termina a operação, sendo reportado um erro.

99

Adição e subtração

A fase seguinte normaliza o resultado. A normalização consiste em deslocar os dígitos da mantissa para a esquerda, até que o dígito mais significativo (1 bit ou 4 bits, se a base for 16) seja diferente de zero. A cada deslocamento, o expoente é decrementado, podendo, portanto, ocorrer underflow no expoente. Finalmente, o resultado deve ser arredondado e, então, é reportado.

100

Multiplicação e divisão

101

Multiplicação e divisão

A multiplicação e a divisão de ponto flutuante são operações muito mais simples do que a adição e a subtração.

Em princípio, consideramos a multiplicação.

102

103

Multiplicação e divisão

Primeiramente, se qualquer dos operandos for 0, o resultado será 0. O próximo passo é somar os expoentes. Se os expoentes forem armazenados na forma polarizada, a soma dos expoentes dobrará a polarização. Portanto, o valor da polarização deve ser subtraído da soma dos expoentes. Poderá então ocorrer tanto overflow quanto underflow no expoente, o que termina o algoritmo, sendo reportado um erro.

104

Multiplicação e divisão

Se o expoente do produto estiver dentro da faixa de números representáveis, o passo seguinte será multiplicar as mantissas, levando em conta seus sinais.

A multiplicação é feita do mesmo modo que para números inteiros. Nesse caso, estamos tratando de uma representação sinal-magnitude, mas os detalhes são semelhantes aos da operação sobre números em complemento de dois.

105

Multiplicação e divisão

O produto terá o dobro do comprimento do multiplicando e do multiplicador. Bits extras são perdidos com o arredondamento.

Depois de calculado o produto, o resultado é então normalizado e arredondado, tal como é feito na adição e na subtração. A normalização pode resultar em um underflow no expoente.

106

Consideremos agora o fluxograma para a divisão.

107

Multiplicação e divisão

O primeiro passo também é testar se algum dos operandos é 0. Caso o divisor seja 0, é reportado um erro ou o resultado é a representação de infinito, dependendo da implementação.

Caso o dividendo seja 0, o resultado será 0. Se não ocorrer nenhum desses casos, no passo seguinte, o expoente do divisor será subtraído do expoente do dividendo.

108

Multiplicação e divisão

Isso remove a polarização, que deve, portanto, ser adicionada ao resultado. Em seguida, são efetuados testes de overflow e underflow no expoente.

O passo seguinte é dividir as mantissas. Esse passo é seguido pela normalização e pelo arredondamento do resultado.

109

Considerações de precisão

110

Arredondamento

Outro detalhe que afeta a precisão do resultado é a política de arredondamento. O resultado de qualquer operação sobre as mantissas geralmente é armazenado em um registrador de tamanho maior. Quando o resultado é colocado novamente no formato de ponto flutuante, os bits extras devem ser descartados.

111

Arredondamento

Diversas técnicas para arredondamento foram exploradas. De fato, o padrão IEEE relaciona quatro abordagens alternativas:

  • Arredondar para o mais próximo: o resultado é arredondado para o número representável mais próximo.
  • Arredondar para cima (+∞): o resultado é arredondado para cima, na direção de infinito positivo.

112

Arredondamento

  • Arredondar para baixo (-∞): o resultado é arredondado para baixo, na direção de infinito negativo.

  • Arredondar para 0: o resultado é arredondado na direção de zero.

113

Arredondamento

O modo padrão de arredondamento é arredondar para o mais próximo, que é definido como a seguir: o resultado é o valor representável mais próximo do resultado com precisão infinita. Se existirem dois valores representáveis igualmente próximos, o resultado será aquele cujo bit menos significativo for igual a 0.

114

Arredondamento

Por exemplo, se os bits extras, além dos 23 que podem ser armazenados, forem 10010, então esses bits extras totalizarão mais que a metade da última posição de bit representável. Nesse caso, a resposta correta é obtida adicionando 1 ao último bit representável, isto é, arredondando para cima, para o número representável imediatamente maior. Suponha agora que os bits extras sejam 01111.

115

Arredondamento

Nesse caso, os bits extras totalizam menos que a metade da última posição de bit representável. A resposta correta é obtida simplesmente ignorando os bits extras (truncando), ou seja, arredondando para baixo, para o número representável imediatamente inferior.

116

Arredondamento

O padrão também considera o caso especial em que os bits extras são da forma 10000... Aqui, o resultado está exatamente no meio de dois valores representáveis. Uma técnica possível nesse caso seria truncar sempre, uma vez que essa operação é a mais simples.

117

Arredondamento

No entanto, o problema dessa abordagem é que ela introduz uma polarização pequena, porém cumulativa, ao longo de uma sequência de computações. O que é necessário é um método de arredondamento não-polarizado.

118

Arredondamento

Uma abordagem possível seria arredondar para cima ou para baixo, conforme um número aleatório, de modo que, em média, o resultado seria não-polarizado. O argumento contra essa abordagem é que ela não apresenta resultados previsíveis, determinísticos.

119

Arredondamento

A abordagem adotada pelo padrão IEEE é forçar que o resultado seja par: se o resultado de uma computação está exatamente no meio de dois números representáveis, o valor é arredondado para cima, caso o último bit representável seja 1, e será truncado, se o último bit for 0.

120

Arredondamento

As duas opções seguintes, arredondar para infinito positivo ou negativo, são úteis na implementação de uma técnica conhecida como aritmética intervalar. A aritmética intervalar fornece um método para monitorar e controlar erros em computações de ponto flutuante, produzindo dois valores para cada resultado. Os dois valores correspondem aos limites inferior e superior de um intervalo que contém o resultado verdadeiro.

121

Arredondamento

A largura do intervalo, isto é, a diferença entre o limite inferior e o limite superior, indica a precisão do resultado. Se os limites do intervalo não forem representáveis, então, os limites inferior e superior serão arredondados para baixo e para cima, respectivamente. Embora a largura do intervalo possa variar de acordo com a implementação, muitos algoritmos são projetados para produzir intervalos pequenos.

122

Arredondamento

Se a faixa de valores entre os limites do intervalo for suficientemente pequena, então o resultado obtido será suficientemente preciso. Caso contrário, esse fato ao menos é conhecido e análises adicionais podem ser efetuadas.

123

Arredondamento

A última técnica especificada no padrão é arredondar para zero. De fato, isso consiste simplesmente em truncar o número: os bits extras são ignorados. Essa é, certamente, a técnica mais simples. No entanto, o resultado é que a magnitude dos valores truncados é sempre menor ou igual ao valor original mais preciso, o que introduz uma constante polarização em direção a zero na operação.

124

Arredondamento

Essa polarização é mais séria do que a que foi discutida anteriormente, pois afeta todas as operações em que existam bits extras diferentes de zero.

125

Padrão IEEE para aritmética de números binários de ponto flutuante

O padrão IEEE 754 vai além da simples definição de um formato, delineando também práticas e procedimentos específicos para que a aritmética de ponto flutuante produza resultados uniformes, previsíveis e independentes da plataforma de hardware.

126

Padrão IEEE para aritmética de números binários de ponto flutuante

Infinito

A aritmética de infinito é tratada como caso-limite da aritmética real, com valores infinitos com a seguinte interpretação:

-∞ < (cada número finito) < +∞

127

Padrão IEEE para aritmética de números binários de ponto flutuante

Com exceção dos casos especiais discutidos a seguir, qualquer operação aritmética envolvendo infinito produz o resultado óbvio.

128

Padrão IEEE para aritmética de números binários de ponto flutuante

NaN silencioso e NaN sinalizador

Um NaN é uma entidade simbólica, codificada no formato de números de ponto flutuante, que pode ser de dois tipos: sinalizador ou silencioso. Um NaN sinalizador (signaling NaN) gera uma exceção de operação inválida sempre que é usado como operando.

129

Padrão IEEE para aritmética de números binários de ponto flutuante

NaN silencioso e NaN sinalizador

Esses NaNs fornecem valores para variáveis não inicializadas e para extensões aritméticas não submetidas ao padrão. Um NaN silencioso (quiet NaN) se propaga por meio de quase toda operação aritmética sem gerar uma exceção.

130

Padrão IEEE para aritmética de números binários de ponto flutuante

Ambos os tipos de NaN têm o mesmo formato geral: o campo de expoente preenchido totalmente com uns e uma fração diferente de zero. O padrão de bits real da fração (diferente de zero) é dependente de implementação. Os valores armazenados na fração podem ser usados para distinguir NaNs silenciosos e NaNs sinalizadores, além de especificar condições de exceção particulares.

131

Padrão IEEE para aritmética de números binários de ponto flutuante

Números não-normalizados

Números não-normalizados são incluídos no padrão IEEE 754 para manipular casos de underflow de expoente.

132

Padrão IEEE para aritmética de números binários de ponto flutuante

O uso de números não-normalizados é conhecido como underflow gradual. Sem o uso de números não-normalizados, o buraco entre o menor número não nulo representável e o zero é muito mais largo que o buraco entre o menor número não nulo representável e o número imediatamente maior.

133

Padrão IEEE para aritmética de números binários de ponto flutuante

O underflow gradual preenche esse buraco, reduzindo o impacto do underflow de expoente a um nível comparável ao do arredondamento de números normalizados.

134

Referências + Materiais extra

135

Vídeo aulas úteis

136

Livro referência

W. Stallings. Arquitetura e Organização de Computadores. SP. Prentice Hall. (2002).

Capítulo 8.

137

Função Controle

138

Função controle

A área de controle de um processador é a parte funcional que realiza as atividades de:

  • busca da instrução que será executada, armazenando-a em um registrador especialmente projetado para esta finalidade;

139

Função controle

  • interpretação das ações a serem desencadeadas com a execução da instrução (se é uma soma, uma subtração, uma complementação etc. e como realizá-la). Estas duas etapas compõem o que se denomina ciclo de busca da instrução (fetch cycle);

140

Função controle

  • geração dos sinais de controle apropriados para ativação das atividades requeridas para a executada propriamente dita da instrução identificada. Esses sinais de controle são enviados aos diversos componentes do sistema, sejam internos do processador (como a ULA) ou externos (como a memória ou E/S). Esta etapa é denominada ciclo de execução da instrução (execute cycle).

141

Função controle

A área de controle é projetada para entender o que fazer, como fazer e comandar quem vai fazer no momento adequado.

142

Função controle

Os dispositivos básicos que fazem parte da área funcional de controle são:

1. Unidade de controle - UC;

2. relógio ou clock;

3. registrador de instrução - IR;

4. contador de instrução - PC;

5. decodificador de instrução;

6. registrador de dados da memória - MBR e registradores de endereço de memória - MAR.

143

Função controle

É importante ressaltar que a organização dos componentes e o funcionamento básico da área de controle constituem a microarquitetura dos processadores.

144

Unidade de controle

145

Unidade de controle

A unidade de controle é o dispositivo mais complexo do processador. Ele possui a lógica necessária para realizar a movimentação de dados e de instruções de e para o processador, através dos sinais de controle que emite em instantes de tempo determinados conforme uma programação prévia.

146

Unidade de controle

A UC se conecta a todos os principais elementos do processador e ao barramento externo de controle.

Os sinais de controle emitidos pela UC ocorrem em vários instantes durante o período de realização de um ciclo de instrução e, de modo geral, todos possuem uma duração fixa e igual, originada em um gerador de sinais denominado relógio (clock).

147

Unidade de controle

Os micro eventos (ou micro operações) comandados pelo funcionamento da UC podem ser iniciados segundo um de dois princípios de organização de processadores:

  • por microprogramação; ou

  • por programação prévia diretamente no hardware.

148

Unidade de controle

Assim, o início de um ciclo de instrução consiste na busca (fetch) da referida instrução, trazendo uma cópia dela da memória principal (ou cache) para o processador (armazenando no IR - registrador de instrução).

Para efetivar esta ação são realizadas algumas ações menores que, em conjunto, constituem a desejada transferência (constituem os passos de um ciclo de leitura).

149

Unidade de controle

Tais operações menores denominam-se microoperações, por se constituírem na menor parte individualmente executável pelo processador.

150

Unidade de controle

Cada micro operação é realizada por iniciativa de um pulso originado na UC em decorrência de uma prévia programação (diretamente no hardware ou pela execução de uma microinstrução, se a arquitetura do processador é microprogramada).

151

Unidade de controle

Uma outra característica de funcionamento dos sistemas de computação na área de controle, mais especificamente com relação à Unidade de Controle, diz respeito ao modo pelo qual o sistema conduz a execução das instruções, levando a diversos tipos de arquitetura de processadores, tais como:

1. processadores que executam instruções de modo exclusivamente sequencial ou serial (SISD);

152

Unidade de controle

2. processadores que executam instruções de modo concorrente, ou tipo pipeline;

3. processadores que executam várias instruções simultaneamente (processamento paralelo);

4. processadores que realizam processamento vetorial.

153

O relógio

154

O relógio

Dado que os processadores são constituídos na sua menor parte por circuitos digitais, que mudam de estado (de um valor para outro) milhões de vezes por segundo e que para executarem as tarefas determinadas de acordo com uma programação prévia precisam estar sincronizados, usa-se nos computadores um dispositivo com essa finalidade de sincronização: o relógio (ou clock).

155

O relógio

Serve para sincronizar - permitir que duas ou mais ações ocorram no mesmo instante de tempo (no mesmo ponto de um pulso) e cadenciar as ações (ou atividades ou micro operações) realizadas em um determinado dispositivo; cadenciar: controlar a velocidade com que as ações ocorrem.

156

O relógio

O relógio pode ser entendido como um dispositivo de controle; ele é como um maestro de uma orquestra, que sincroniza e cadencia a ação dos músicos.

157

O relógio

Na figura, observamos os seguintes elementos:

  • ciclo do relógio ou simplesmente ciclo (clock cycle ou cycle): é o intervalo de tempo entre o início da subida (ou descida) de um pulso até o início da subida (ou descida) do outro pulso;

158

O relógio

  • período (cycle time ou period): intervalo de tempo gasto para se obter um ciclo do sinal do relógio. Medido em unidades de tempo, usualmente de nanosegundos, ns.

159

O relógio

  • lado de subida (rising edge): é a parte do pulso que realiza a transição do valor baixo para o valor alto.

  • tempo de subida (rising time): é o período de tempo gasto pelo sinal para realizar toda a subida. Medido em unidades de tempo, usualmente de nanosegundos.

160

O relógio

  • lado de descida (falling edge): é a parte do pulso que realiza a transição do valor alto para o valor baixo.

  • tempo de descida (falling time): é o período de tempo gasto pelo sinal para realizar toda a descida. Medido em unidades de tempo, usualmente de nanosegundos.

161

O relógio

  • frequência (frequency ou clock rate): é a quantidade de ciclos por segundo de um relógio. Ela é o inverso do período e vice-versa, sendo usualmente medida em Hertz (Hz), onde 1 Hz = 1 ciclo/s.

162

O relógio

Como as taxas de pulos ou velocidades dos relógios dos processadores são muito elevadas, usam-se múltiplos do Hz:

1000 Hz = 1 kHz

1000 kHz = 1.000.000 = 1 MHz

1000 MHz = 1.000.000.000 = 1 GHz

163

O relógio

Como o período é o inverso da frequência e vice-versa:

Se F = 1 GHz (velocidade do relógio do processador), então P = 1/F = 1/1.000.000.000 = 1*10-9 = 1 ns.

Se P = 1.25 ns, então F = ?

164

O relógio

O ciclo de relógio está relacionado à realização de uma operação elementar, durante o ciclo de uma instrução. No entanto, mesmo esta operação elementar não se realiza em um só passo e, por essa razão, costuma-se dividir o ciclo de máquina em subciclos, defasados no tempo, de modo que cada um aciona um passo diferente da operação elementar.

165

O relógio

Esses passos de uma operação elementar são denominados micro operações.

A base de operação de qualquer relógio é um cristal de quartzo que gera pulsos, acionado por um oscilador. Quando acionado eletronicamente pelo oscilador, o quartzo produz seus pulsos, que variam em frequência de acordo com o corte do cristal.

166

O relógio

Cada micro operação é realizada em um instante de tempo. Esses instantes de tempo são originados no relógio.

Se as operações para realizar um ciclo de instrução, duram o tempo definido por um ou mais pulsos do relógio, e se estes pulsos tiverem curta duração, mais operações podem ser realizadas na mesma unidade de tempo.

167

O relógio

O período-base utilizado é o segundo, ciclos por segundo, milhões de instruções por segundo, ou MIPS ou milhões de operações ponto flutuante por segundo, MFlops.

168

O relógio

A frequência do relógio do processador é uma das características mais conhecida dos usuários. Ela pode ser considerada um indicador de desempenho menos técnico para leigos.

Contudo, não é totalmente verdade que um processador com maior velocidade de relógio será mais eficiente que um com velocidade menor.

169

Registrador de Instrução - IR

É o registrador que tem a função específica de armazenar a instrução a ser executada pelo processador. Ao se iniciar um ciclo de instrução, a UC emite sinais de controle em sequência no tempo, de modo que se processe a realização de um ciclo de leitura para buscar a instrução na memória.

170

Registrador de Instrução - IR

Conforme definido na programação do ciclo de busca de um ciclo de instrução, ao término deste ciclo de leitura a instrução desejada será armazenada no IR, via barramento externo de dados, barramento interno e RDM.

171

Registrador de Instrução - IR

Antigamente, os eventos se passavam ligeiramente diferente e o IR de fato armazenava uma parte da instrução, denominada código da operação. Atualmente, o processo é ainda mais complexo, devido a necessidades de desempenho, com maiores velocidades e pipeline, usando-se buffers para armazenar instruções em fila antes mesmo de sua execução.

172

Contador de Instrução - PC

É o registrador que armazena o endereço da próxima instrução a ser executada. Assim que a instrução que vai ser executada é buscada, o sistema automaticamente efetiva a modificação do conteúdo do PC para que ele passe a armazenar a próxima instrução.

173

Contador de Instrução - PC

Por isso, define-se a função do PC como "armazenar o endereço da próxima instrução"; na realidade, durante boa parte da realização de um ciclo de instrução o PC já contém o endereço da próxima instrução.

174

Contador de Instrução - PC

O PC é um registrador de suma importância para o processo de controle e sequenciamento da execução dos programas.

Como esse registrador armazena o endereço da instrução que será buscada em sequência na memória para a execução do próximo ciclo de instrução, o hardware não tem controle sobre qual instrução deverá ser executada; ele simplesmente busca a instrução cujo endereço encontra-se no PC.

175

Contador de Instrução - PC

Assim, a alteração de seu conteúdo define a próxima instrução, cujo ciclo será executado, seja ela a instrução em sequência no mesmo programa, seja uma outra instrução fora de sequência no mesmo programa ou mesmo podendo ser uma instrução de outro programa.

176

Contador de Instrução - PC

Possibilidades de alterar o conteúdo do PC:

1. Sistematicamente, por meio de incremento automático - realizado pelo hardware;

177

Contador de Instrução - PC

2. Sempre que o sistema precisa reinicializar (ou iniciar-se), o hardware é programado para inserir no PC o endereço da primeira instrução do programa de inicialização - o que dispara o processo de inicialização;

178

Contador de Instrução - PC

3. Eventualmente, por meio de instruções de desvio, quando se usa um comando de desvio em um programa ou quando o sistema operacional decide mudar de programa em execução.

179

Decodificador de Instrução

É usado para identificar qual operação será realizada, de acordo com a instrução que foi decodificada. Em outras palavras, cada instrução é uma ordem para que o processador realize uma dada operação.

180

Decodificador de Instrução

Como são muitas instruções, é necessário que cada uma possua uma identificação própria e única (como os nossos CPFs). A unidade de controle está, por sua vez, preparada para sinalizar de modo adequado aos diversos dispositivos do processador, conforme ela tenha identificado a instrução a ser executada.

181

Decodificador de Instrução

O decodificador recebe como entrada um conjunto de bits escolhido e específico para identificar uma instrução de máquina e possui 2N saídas, sendo N a quantidade de algarismos binários do valor de entrada.

182

RDM e REM

RDM - registrador de dados de memória.

REM - registrador de endereços de memória.

183

RDM e REM

São os registradores utilizados pelo processador e memória para comunicação e troca de informações.

Em geral, o RDM (ou MBR -- Memory Buffer Register) possui um tamanho igual ao do barramento de dados - que costuma ser construído com largura múltipla do tamanho da palavra do processador.

184

RDM e REM

O REM (ou MAR -- Memory Address Register) possui um tamanho igual ao dos endereços da memória. Definindo-se o tamanho em bits do REM podemos calcular o espaço máximo de endereçamento da memória principal de um computador.

185

Microprogramação

186

Micro programação

Em 1951, Wilkes introduziu a microprogramação, que permite:

  • um conjunto grande de instruções de máquina (no nível convencional), usando
  • um hardware simples capaz de executar apenas as chamadas microinstruções.

187

Micro programação

Cada instrução de máquina no nível convencional é interpretada e pode dar origem à execução de muitas microinstruções.

188

Micro programação

Os computadores que usam microprogramação são ditos CISC - Complex Instruction Set Computer.

Alguns exemplos: IBM 360, DEC VAX, família Intel como 8088, 80386, Pentium etc.

189

Microprograma

O microprograma é um conjunto de microinstruções.

Ele é armazenado numa memória ROM do processador, chamada control store.

Há um MPC (micro program counter que aponta para a próxima microinstrução dentro do control store).

190

Microprograma

Há um registrador chamado MIR que armazena a microinstrução em execução.

191

MPC

MIR

Control Store

Microprograma

4 subciclos na execução da microinstrução

Subciclo 1: carrega a próxima microinstrução a ser executada num registrador chamado MIR (micro instruction register)

Subciclo 2: coloca valores dos registradores nos barramentos A e B, carregando os A latch e B latch.

192

Microprograma

4 subciclos na execução da microinstrução

Subciclo 3: dá o tempo necessário para a ULA e shifter produzirem seu resultado, carregando-o no MAR se for o caso.

Subciclo 4: armazena o resultado no registrador ou no MBR.

193

Dificuldade de escrever microinstruções

Cada microinstrução consta de 32 bits.

Esses 32 bits determinam o que deve acontecer num ciclo (4 subciclos).

Escrever cada microinstrução é uma tarefa árdua (pois lida com o nível muito baixo - zeros e uns).

194

Micro-assembler

Micro-assembler (ou micro-montador) facilita a escrita de microinstruções por permitir mnemônicos e símbolos parecidos com um programa de alto nível.

Na verdade o micro-assembler ainda é baixo nível, no sentido de cada microinstrução em micro-assembler deve corresponder a uma microinstrução de 32 bits.

195

Exemplo

Uma microinstrução em micro-assembler pode ser assim:

pc := pc + 1

196

Exemplo

Ela corresponde a uma microinstrução de 32 bits, onde

A = 0 (Registrador 0 é PC)

B = 6 (Registrador 6 contém o número 1)

C = 0

ULA = 0 (0 corresponde à operação soma na ULA)

ENC = 1 (indica que o resultado da ULA deve voltar ao registrador 0)

197

Exemplo

Fica mais fácil escrever

pc := pc + 1

do que

00000000000100000110000000000000.

198

Como escrever microprograma eficiente

Uma microinstrução tem 32 bits que comandam a ação do processador durante um ciclo.

É importante explorarmos, se possível, todos esses bits disponíveis numa mesma microinstrução, ao invés de dividir algo que poderia ser feito em um ciclo para serem feitos em dois ciclos ou mais.

199

Como escrever microprograma eficiente

Leitura (rd) leva dois ciclos. Assim rd deve aparecer em duas microinstruções seguidas. O mesmo para escrita (wr). Então é importante aproveitar a microinstrução e não definir uma microinstrução apenas com rd ou apenas com wr.

Veremos um exemplo a seguir de como escrever um microprograma eficiente.

200

Exemplo

Suponha a criação de uma nova instrução de máquina (nível convencional) chamada NOVA que faz o seguinte:

Escreve o valor 0 na memória endereçada por SP

Faz AC ficar igual a 4 vezes o valor de SP

Soma TIR em AC e se o valor da soma ficar negativa

entao faz AC igual a 0, senão faz AC igual a 1

No final o controle deve voltar a posição 0

201

Exemplo

Suponha que a instrução NOVA já está lida e encontra-se no IR. Suponha ainda que já foi feita a decodificação e sabe-se que se trata da instrução NOVA.

Vamos escrever, em micro-assembler, o trecho das microinstruções que implementa NOVA. Suponha que o início desse trecho é na linha 101.

202

Solução: microprograma para NOVA

Escreve o valor 0 na memória endereçada por SP

Faz AC ficar igual a 4 vezes o valor de SP

Soma TIR em AC e se o valor da soma ficar negativa

então faz AC igual a 0, senão faz AC igual a 1

No final o controle deve voltar a posição 0.

203

Solução: microprograma para NOVA

Ineficiente

101: mar:=sp;

102: mbr:=0; wr

103: wr

104: ac:=(sp+sp)

105: ac:=ac+ac

106: ac:=ac+tir; if n goto 109

107: ac:=1

108: goto 0

109: ac:=0

110: goto 0

204

Solução: microprograma para NOVA

Eficiente

101: mar:=sp; mbr:=0; wr

102: ac:=lshift(sp+sp); wr

103: ac:=ac+tir; if n goto 105

104: ac:=1; goto 0

105: ac:=0; goto 0

205

Referências

+

Outros recursos

206

Vídeo aulas úteis

207

Livros

M. A. Monteiro. Introdução à Organização de Computadores. ETC Editora.

Capítulo 6

A. Tanenbaum. Organização Estruturada de Computadores. Prentice Hall Brasil.

Capítulo 4

208

Arquitetura:

Instruções e Operandos

209

Nível ISA

Este nível está posicionado entre o nível da microarquitetura e o nível do sistema operacional.

Historicamente, esse nível foi desenvolvido antes de quaisquer outros níveis e, na verdade, originalmente era o único nível. Até hoje não é incomum ouvir esse nível ser denominado simplesmente 'a arquitetura' de uma máquina ou às vezes (incorretamente) como 'linguagem de montagem'.

210

Nível ISA

O nível ISA tem um significado especial que o torna importante para arquitetos de sistema: é a interface entre o software e o hardware. Embora seja possível o hardware executar diretamente programas escritos em C, C++, Java ou alguma outra linguagem de alto nível, não seria uma boa ideia.

211

Nível ISA

A vantagem em desempenho da compilação em relação à interpretação seria perdida. Além do mais, para ter muita utilidade prática, a maioria dos computadores deve ser capaz de executar programas escritos em várias linguagens, e não apenas em uma.

212

Nível ISA

A abordagem adotada essencialmente por todos os projetistas de sistemas é traduzir programas escritos em várias linguagens de alto nível para uma forma intermediária comum - o nível ISA - e construir hardware que possa executar programas de nível ISA diretamente.

O nível ISA define a interface entre os compiladores e o hardware. É a linguagem que ambos têm de entender. A relação entre os compiladores, o nível ISA e o hardware são mostrados na figura 1.

213

Nível ISA

O ideal é que, ao projetar uma nova máquina, os arquitetos conversem com os escritores de compiladores e também com os engenheiros de hardware para descobrir quais características cada um deles quer no nível ISA.

214

Nível ISA

Se os escritores de compiladores quiserem alguma característica que os engenheiros não podem implementar de modo eficiente em custo (e.g. uma instrução desvie-e-processe a folha de pagamento), ela não entra no hardware. Da mesma forma, se a turma do hardware tiver alguma nova característica elegante que quer acrescentar (e.g. uma memória na qual as palavras cujos endereços são números primos sejam super-rápidas), mas a turma do software não consegue imaginar como gerar código para usá-la, ela não passará da prancheta.

215

Nível ISA

Após muita negociação e simulação, surgirá uma ISA perfeitamente otimizada para as linguagens de programação pretendidas, e será implementada.

216

Nível ISA

Isso é a teoria. Agora vamos à triste realidade. Quando surge uma nova máquina, a primeira pergunta que todos os clientes potenciais fazem é: 'Ela é compatível com sua antecessora?'. A segunda é: 'Ela pode executar meu sistema operacional antigo?'. A terceira é: 'Ela executará todos os meus programas de aplicação existentes sem modificação?'.

217

Nível ISA

Se qualquer uma dessas respostas for 'não', os projetistas terão muitas explicações a dar. É raro que os clientes se disponham a jogar fora todos os seus programas antigos e começar tudo de novo.

218

Nível ISA

Essa atitude pressiona muito os arquitetos de computadores a manter a mesma ISA entre modelos, ou ao menos torná-la compatível com os modelos anteriores.

Com isso queremos dizer que a nova máquina deve ser capaz de executar programas antigos sem alteração. Contudo, é totalmente aceitável que a nova máquina tenha novas instruções e outras características que só possam ser exploradas por novo software.

219

Nível ISA

Eles podem passar de um projeto microprogramado para execução direta, ou adicionar paralelismo ou facilidades superescalares ou qualquer outra coisa que queiram, contanto que mantenham a compatibilidade com a ISA anterior.

A meta é garantir que velhos programas sejam executados na nova máquina. Então, o desafio se torna construir máquinas melhores sujeitas às limitações da compatibilidade.

220

Nível ISA

O que acabamos de dizer não tem a intenção de dar a entender que o projeto da ISA não importa. Uma boa ISA tem significativas vantagens em relação a uma ruim, em particular quando se trata de comparar capacidade computacional bruta com custo. Se quanto ao mais os projetos forem equivalentes, as ISAs podem ser responsáveis por uma diferença de até 25% em desempenho.

221

Nível ISA

O que queremos deixar claro é que as forças do mercado dificultam (mas não impossibilitam) descartar uma ISA antiga e introduzir uma nova.

Não obstante, de vez em quando surge uma nova ISA de uso geral e, em mercados especializados - e.g. sistemas embutidos ou processadores multimídia -, elas ocorrem com muito mais frequência. Por consequência, é importante entender o projeto da ISA.

222

Nível ISA

O que faz uma ISA ser boa? Há dois fatores primordiais. Em primeiro lugar, uma boa ISA deve definir um conjunto de instruções que pode ser implementado com eficiência em tecnologias atuais e futuras, resultando em projetos efetivos em custo por várias gerações. Um mau projeto é mais difícil de implementar e pode exigir um número muito maior de portas para implementar um processador e mais memória para executar programas.

223

Nível ISA

Além disso, a execução pode ser mais lenta porque a ISA encobre oportunidades de sobrepor operações, exigindo projetos muito mais sofisticados para obter desempenho equivalente.

Um projeto que aproveita as peculiaridades de determinada tecnologia pode ter um êxito fugaz e produzir uma única geração de implementações efetivas em custo e então ser ultrapassados por ISAs mais avançadas.

224

Nível ISA

Em segundo lugar, uma boa ISA deve fornecer um alvo claro para o código compilado. Regularidade e completude de uma faixa de opções são aspectos importantes que nem sempre estão presentes em uma ISA. Essas propriedades são importantes para um compilador, que pode ter problemas para escolher a melhor opção entre alternativas limitadas, em particular quando algumas alternativas aparentemente óbvias não são permitidas pela ISA.

225

Nível ISA

Em resumo, uma vez que a ISA é a interface entre o hardware e o software, ela tem de contentar os projetistas de hardware e os projetistas de software.

226

Visão geral do nível ISA

227

Propriedades do nível ISA

Em princípio, o nível ISA é definido pelo modo como a máquina se apresenta a um programador de linguagem de máquina.

Uma vez que mais ninguém faz muita programação em linguagem de máquina, vamos redefinir isso e dizer que código de nível ISA é o que um compilador produz (ignorando, por enquanto, chamadas ao sistema operacional e linguaguem de montagem simbólica).

228

Propriedades do nível ISA

Para produzir código de nível ISA, o escritor de compilador tem de saber qual é o modelo de memória, quais e quantos são os registradores, quais tipos de dados e instruções estão disponíveis e assim por diante. O conjunto de todas essas informações define o nível ISA.

229

Propriedades do nível ISA

De acordo com essa definição, questões como se a microarquitetura é microprogramada ou não, se ela tem paralelismo ou não, se ela é superescalar ou não, e assim por diante, não fazem parte do nível ISA porque não são visíveis para o escritor de compilador.

Todavia, essa observação não é de todo verdadeira, porque algumas dessas propriedades afetam o desempenho e isso é visível para o escritor do compilador.

230

Propriedades do nível ISA

Considere, por exemplo, um projeto superescalar que pode emitir instruções uma atrás da outra no mesmo ciclo, contanto que uma seja uma instrução de número inteiro e outra de ponto flutuante, obterá desempenho visivelmente melhor do que se não fizer isso. Assim, os detalhes da operação superescalar são visíveis no nível ISA, portanto a separação entre as camadas não é tão clara como poderia parecer de início.

231

Propriedades do nível ISA

Para algumas arquiteturas, o nível ISA é especificado por um documento formal de definição, muitas vezes produzido por um consórcio do setor. Por exemplo, a V9 SPARC tem uma definição oficial. A finalidade de um documento de definição é possibilitar que diferentes implementadores construam a máquina e todas elas executem exatamente o mesmo software e obtenham exatamente os mesmos resultados.

232

Propriedades do nível ISA

Uma outra propriedade importante do nível ISA é que na maioria das máquinas há no mínimo dois modos. O modo núcleo (kernel) deve executar o sistema operacional e permite que todas as instruções sejam executadas. O modo usuário deve executar programas de aplicação e não permite que certas instruções sensíveis, como as que manipulam a cache diretamente, sejam executadas. Focaremos no modo usuário.

233

Modelos de memória

234

Modelos de memória

Todos os computadores dividem a memória em células que têm endereços consecutivos. O tamanho de célula mais comum no momento é 8 bits, mas células de 1 bit a 60 bits já foram usadas no passado. Uma célula de 8 bits é denominada byte. A razão para usar bytes de 8 bits é que os caracteres ASCII têm 7 bits, portanto, um caractere ASCII mais um bit de paridade cabem em um byte.

235

Modelos de memória

Se o UNICODE vier a dominar o setor no futuro, então os futuros computadores poderão ser baseados em unidades de 16 bits com numeração sucessiva. Afinal, 24 é um número ainda mais interessante do que 23, uma vez que 4 é uma potência de 2 e 3 não é.

236

Modelos de memória

Em geral os bytes são agrupados em palavras de 4 bytes (32 bits) ou 8 bytes (64 bits) com instruções disponíveis para manipular palavras inteiras. Muitas arquiteturas requerem que as palavras sejam alinhadas em suas fronteiras naturais; assim, por exemplo, uma palavra de 4 bytes pode começar no endereço 0, 4, 8 etc., mas não no endereço 1 ou 2. De modo semelhante, uma palavra de 8 bytes pode começar no endereço 0, 8 ou 16, mas não no endereço 4 ou 6. O alinhamento de palavras de 8 bytes é ilustrado na figura 2.

237

Modelos de memória

O alinhamento costuma ser exigido porque memórias funcionam com mais eficiência desse modo. O Pentium 4, por exemplo, que busca 8 bytes por vez na memória, usa endereço físicos de 36 bits, mas tem somente 33 bits de endereço. Assim, o Pentium 4 não poderia fazer um referência não alinhado à memória nem que quisesse, porque os 3 bits de ordem baixa não estão especificados explicitamente. Eles são sempre 0s, o que obriga todos os endereços de memória a ser múltiplos de 8 bytes.

238

Modelos de memória

Contudo, esse requisito de alinhamento às vezes causa problemas. O Pentium 4 permite que programas ISA referenciem palavras que começam em qualquer endereço, uma propriedade que remonta ao 8088, que tinha um barramento de dados de 1 byte de largura - e, assim, nenhum requisito de alinhamento de referência à memória em fronteiras de 8 bytes.

239

Modelos de memória

Se um programa Pentium 4 ler uma palavra de 4 bytes no endereço 7, o hardware tem de fazer uma referência à memória para obter os bytes de 0 a 7 e uma segunda referência à memória para obter os bytes de 8 a 15. Então a CPU tem de extrair os 4 bytes requisitados dos 16 bytes lidos da memória e montá-los na ordem correta para formar uma palavra de 4 bytes.

240

Modelos de memória

Ter a capacidade de ler palavras em endereços arbitrários requer lógica extra no chip, o que o torna maior e mais caro. Os engenheiros projetistas adorariam livrar-se dela e simplesmente exigir que todos os programas fizessem referências à memória alinhadas por palavra. O problema é que, sempre que os engenheiros dizem "E quem se importa com executar programas 8088 antigos e bolorentos que referenciam a memória de modo errado?", o pessoal de marketing tem uma resposta sucinta: "Nossos clientes".

241

Modelos de memória

A maioria das máquinas tem um único espaço de endereço linear no nível ISA, que se estende do endereço 0 até algum máximo, frequentemente 232 bytes ou 264 bytes. Contudo, algumas máquinas têm espaços de endereços separados para instruções e dados, de modo que uma busca de instrução no endereço 8 vai para um espaço de endereço diferente do que uma busca de dados no endereço 8. Esse esquema é mais completo do que ter um único espaço de endereço, mas tem duas vantagens.

242

Modelos de memória

Em primeiro lugar, torna-se possível ter 232 bytes de programa e 232 bytes adicionais de dados usando somente endereços de 32 bits. Em segundo lugar, como todas as escritas vão automaticamente para o espaço de dados, fica impossível sobrescrever acidentalmente o programa, eliminando assim uma fonte de bugs de programas.

243

Modelos de memória

Note que ter um espaço de endereços separado para instruções e dados não é o mesmo que ter uma cache de nível 1 dividida. No primeiro caso, a quantidade total de espaço de endereço é duplicada e leitura para qualquer endereço determinado dão resultados diferentes, dependendo de a leitura ser de uma instrução ou de uma palavra de dados. Com uma cache dividida, ainda há apenas um espaço de endereço, só que caches diferentes armazenam partes diferentes desse espaço.

244

Modelos de memória

Ainda um outro aspecto do modelo de memória de nível ISA é a semântica da memória. É natural esperar que uma instrução LOAD que ocorre após uma instrução STORE, e que referencia o mesmo endereço, retornará o valor que acabou de ser armazenado. Todavia, como vimos em aulas anteriores, em muitos projetos as microinstruções são reordenadas.

245

Modelos de memória

Assim, há um perigo real de que a memória não terá o comportamento esperado. O problema fica ainda pior em um multiprocessador, no qual cada uma das várias CPUs envia uma sequência de requisições de escrita e leitura (possivelmente reordenadas) a uma memória compartilhada.

246

Modelos de memória

Projetistas de sistemas podem adotar qualquer uma das diversas abordagens para esse problema. Em um extremo, todas as requisições de memória podem ser serializadas, portanto cada uma é concluída antes de a próxima ser emitida. Essa estratégia prejudica o desempenho, mas resulta na semântica de memória mais simples. Todas as operações são executadas estritamente na ordem do programa.

247

Modelos de memória

No outro extremo, não são dadas garantias de espécie alguma. Para forçar uma ordenação na memória, o programa deve executar uma instrução SYNC, que bloqueia a emissão de todas as novas operações de memória até que todas as anteriores tenham sido concluídas. Esse projeto atribui uma grande carga aos compiladores, porque eles têm de entender, com detalhes, como a microarquitetura subjacente funciona, embora dê aos projetistas de hardware a máxima liberdade para otimizar a utilização da memória.

248

Modelos de memória

Também são possíveis modelos de memória intermediários nos quais o hardware bloqueia automaticamente a emissão de certas referências à memória - por exemplo, as que envolvem uma dependência RAW ou WAR - mas não bloqueia outras.

249

Modelos de memória

Embora seja um aborrecimento ter todas essas peculiaridades causadas pela microarquitetura expostas no nível ISA (ao menos para os escritores de compiladores e programadores de linguagem de montagem), essa é a tendência. Ela é causada pelas implementações subjacentes como reordenação de microinstruções, paralelismo profundo, vários níveis de cache e assim por diante. Veremos mais exemplos a seguir.

250

Referências

251

Livro(s) referência

A. Tanenbaum. Organização Estruturada de Computadores. Prentice Hall Brasil.

Capítulo 5

W. Stallings. Arquitetura e Organização de Computadores. SP. Prentice Hall.

Capítulo 9

252

Quais as funções da ULA?

A Unidade Lógica e Aritmética (ULA) é um circuito combinatório responsável pela execução de somas, subtrações e funções lógicas, em um sistema digital.

Quais as funções lógicas e aritméticas mínimas executadas por uma ULA?

Quais as funções lógicas é aritméticas mínimas executadas por uma ULA? A ULA executa as principais operações lógicas e aritméticas do computador. Ela soma, subtrai, divide, determina se um número é positivo ou negativo ou se é zero.

Quais são algumas das operações de soma que são implementadas na ULA dos processadores da Intel?

Muitas ULA podem realizar as seguintes operações: Operações aritméticas com inteiros. Operações lógicas bit a bit And, Not, Or, XOR. Operações de deslocamento de bits (deslocamento, rotação por um número específico de bits para esquerda ou direita, com ou sem sinal).

Qual é a função do Arithmetic Logic Unit e sua sigla?

A unidade lógica e aritmética (ULA), em inglês Arithmetic Logic Unit (ALU), é um circuito digital que realiza operações de adição e booleana AND. A ULA é uma peça fundamental da unidade central de processamento (UCP), e até dos mais simples microprocessadores.

Toplist

Última postagem

Tag