Vous êtes sur la page 1sur 17

LISTA DE FIGURAS

FIGURA 1: A CPU COM BARRAMENTO NO SISTEMA 5


FIGURA 2: ESTRUTURA INTERNA DA CPU 3 5
FIGURA 3: CICLO DE INSTRUÇÕES COM INTERRUPÇÃO 11
FIGURA 4: CICLO DE INSTRUÇÃO 12
FIGURA 5: DIAGRAMA DE TRANSIÇÃO DE ESTADOS DO CICLO DE INSTRUÇÃO 13
FIGURA 6: FLUXO DE DADOS NO CICLO DE BUSCA 14
FIGURA 7: FLUXO DE DADOS NO CICLO INDIRETO 15
FIGURA 8: FLUXO DE DADOS NO CICLO DE INTERRUPÇÃO 15
SUMÁRIO

1 FUNCIONAMENTO DA ESTRUTURA DE UMA CPU ......................................... 4

1.1.1 ORGANIZAÇÃO DO PROCESSADOR .................................................. 4

1.1.2 ORGANIZAÇÃO DE REGISTRADORES ............................................... 6

1.1.3 CICLO DE INSTRUÇÃO ....................................................................... 11

2 FLUXO DE DADOS ........................................................................................... 14

3 OPERAÇÕES DE UMA CPU ATRAVÉS DA PROGRAMAÇÃO ........................ 16

3.1.1 UM EXEMPLO DE PROGRAMA .......................................................... 16

3.1.2 SIMULAÇÃO DO PROGRAMA ............................................................ 17

REFERÊNCIAS ......................................................................................................... 18
4

1 FUNCIONAMENTO DA ESTRUTURA DE UMA CPU

1.1.1 ORGANIZAÇÃO DO PROCESSADOR

Para entender a organização da CPU, devemos considerar as ações que ela deve
executar:
 Busca de instrução: a CPU lê uma instrução da memória.
 Interpretação de instrução: a instrução é decodificada para determinar a
ação requerida.
 Busca de dados: a execução de uma instrução pode requerer efetuar uma
operação aritmética ou lógica sobre os dados.
 Escrita de dados: os resultados da execução podem requerer escrever
dados na memória ou em um módulo de E/S.

Para executar essas ações, a CPU precisa armazenar alguns dados


temporariamente. Ela deve manter a posição de memória da última instrução, para
saber onde obter a próxima instrução, e precisa também armazenar instruções e
dados temporariamente, enquanto uma instrução está sendo executada. Em outras
palavras, a CPU necessita de uma pequena memória interna.
A Figura 1 é uma visão simplificada de uma CPU, que indica também sua conexão
com o resto do sistema, por meio do barramento de sistema. Uma interface
semelhante é necessária para qualquer das estruturas de interconexão descritas na
aula de Barramentos. Os componentes mais importantes da CPU são a unidade lógica
e aritmética ou ULA e a unidade de controle ou UC. A ULA efetua o processamento
de dados. A UC controla não só a transferência de dados e instruções para dentro e
para fora da CPU, como também a operação da ULA. A figura mostra, além desses
componentes, uma memória interna mínima, constituída de um conjunto de posições
de armazenamento denominadas registradores.
5

Figura 1: A CPU com barramento no sistema

A Figura 2 é uma visão um pouco mais detalhada da CPU. São indicados os


caminhos de transferência de dados e de sinais de controle, o que inclui um elemento
denominado barramento interno da CPU. Esse elemento é necessário pra transferir
dados entre os vários registradores e a ULA, uma vez que esta última apenas opera
sobre dados localizados na memória interna da CPU. A figura mostra ainda os
elementos básicos típicos de uma ULA. Note a semelhança entre a estrutura interna
do computador como um todo e a estrutura interna da CPU. Em ambos os casos,
existe uma pequena coleção de elementos importantes, conectados por caminhos de
dados.

Figura 2: Estrutura interna da CPU 1


6

1.1.2 ORGANIZAÇÃO DE REGISTRADORES

Um sistema de computação emprega uma hierarquia de memória. Nos níveis mais


altos da hierarquia, a memória é mais rápida, menor e mais cara (custo por bit). Dentro
da CPU, existe um conjunto de registradores que funciona como um nível da
hierarquia de memória acima da memória principal e da memória cache. Os
registradores da CPU têm duas funções:
 Registradores visíveis para o usuário: possibilitam ao programador de
linguagem de montagem ou de máquina minimizar referências à memória,
pela otimização do uso de registradores.
 Registradores de controle e de estado: são usados pela unidade de
controle para controlar a operação da CPU e por programas privilegiados
do sistema operacional para controlar a execução de programas.

Não existe uma separação clara entre os registradores dessas duas categorias.
Por exemplo, em algumas máquinas, o contador de programa é visível para o usuário
(no VAX), mas em muitas outras não é.

Registradores Visíveis para o Usuário


Um registrador visível para o usuário é aquele que pode ser referenciado pela
linguagem de máquina que a CPU executa. Esses registradores podem ser
classificados nas seguintes categorias:
 Registradores de propósito geral
 Registradores de dados
 Registradores de endereço
 Registradores de códigos de operação

Registradores de propósito geral podem ser usados pelo programador para uma
variedade de funções. Algumas vezes, seu uso no conjunto de instruções é ortogonal
ao código de operação, ou seja, qualquer registrador de propósito geral pode conter
um operando para qualquer código de operação. Esse é o real significado de propósito
geral. Entretanto, existem frequentemente algumas restrições. Por exemplo, podem
existir registradores dedicados para operações sobre números de ponto flutuante e
para operações sobre a pilha.
7

Em alguns casos, os registradores de propósito geral podem ser usados para


endereçamento. Em outros, existe uma separação clara ou parcial entre registradores
de dados e registradores de endereços. Registradores de dados podem ser usados
apenas para conter dados e não podem ser empregados no cálculo de endereços de
operandos. Registradores de endereço podem também ser empregados até certo
ponto como registradores de propósito geral ou podem ser dedicados para um
determinado modo de endereçamento. Alguns exemplos são:

 Registradores de segmento: em uma máquina com endereçamento


segmentado, um registrador de segmento é usado para conter o endereço
da base de um segmento. Podem existir múltiplos registradores de
segmento: por exemplo, um para o sistema operacional e um para o
processo corrente.
 Registradores de índices: são usados para endereçamento indexado,
possivelmente com auto indexação.
 Apontador de topo de pilha: se houver endereçamento de operandos na
pilha visível para o usuário, então tipicamente a pilha será alocada na
memória e existirá um registrador dedicado que aponta para o topo da pilha.
Isso possibilita um endereçamento implícito, ou seja, as instruções de
empilhar e desempilhar não requerem um operando explícito.

O projeto do conjunto de registradores envolve diversas questões. Uma questão


importante é decidir se os registradores serão de propósito geral ou se terão uso
específico. Com o uso de registradores especializados, o tipo de registrador
referenciado como operando de uma instrução geralmente é implícito, sendo
determinado pelo código de operação. O campo de operando apenas identifica um
registrador de um conjunto de registradores especializados, economizando, portanto,
alguns bits de instrução. Por outro lado, essa especialização limita a flexibilidade de
programação. Embora não exista melhor solução, para essa questão de projeto, a
tendência atual é usar registradores especializados.
Outra questão de projeto é o número de registradores a serem disponibilizados,
seja de propósito geral seja para registradores de dados e de endereços. Isso também
afeta o projeto do conjunto de instruções, uma vez que um número maior de
registradores requer maior número de bits para especificar um operando. O número
8

adequado parece ser entre 8 e 32 registradores. Um pequeno número de


registradores resulta em mais referências à memória, mas o uso de um número muito
grande de registradores, não reduz substancialmente o número de referências à
memória. Uma abordagem diferente é adotada na arquitetura RISC que obtém
vantagem com a utilização de centenas de registradores.
Finalmente, existe a questão do tamanho do registrador. Registradores de
endereço devem ter tamanho suficiente para conter o maior endereço usado no
sistema. Registradores de dados devem ser capazes de conter valores da maioria dos
tipos de dados. Algumas máquinas permitem o uso de dois registradores contíguos
para conter valores de tamanho duplo.
Uma última categoria de registradores que são visíveis para o usuário, pelo menos
parcialmente, contém códigos de condição (também conhecidos como flags).
Códigos de condição são bits atualizados pelo hardware da CPU como resultados de
operações. Por exemplo, em uma operação aritmética, esses bits podem indicar se o
resultado produzido é positivo, negativo, zero ou overflow. Além de o próprio resultado
da operação ser armazenado em um registrador ou na memória, são também
atualizados os registradores que contêm códigos de condição. Esses códigos podem
ser testados em seguida, por uma operação de desvio condicional.
Normalmente, os bits de código de condição fazem parte de um registrador de
controle, embora algumas vezes possam ser organizados em mais de um registrador.
As instruções de máquina geralmente possibilitam ler esses bits, por meio de uma
referência implícita, mas não permitem que eles sejam alterados pelo programador.

Registradores de Controle e de Estado


Vários registradores da CPU são empregados para controlar a operação da CPU.
Na maioria das máquinas, eles não são visíveis para o usuário. Alguns deles podem
ser visíveis para instruções de máquinas executadas em um modo de controle ou de
sistema operacional.
É claro que máquinas diferentes têm organizações de registradores diferentes e
usam uma terminologia distinta. Quatro registradores são essenciais para a execução
de instruções:
 Contador de programa (PC): contém o endereço da instrução a ser
buscada.
 Registrador de instrução (IR): contém a última instrução buscada.
9

 Registrador de endereçamento à memória (MAR): contém o endereço de


uma posição de memória.
 Registrador de armazenamento temporário de dados (MBR): contém
uma palavra de dados a ser escrita na memória ou a palavra lida mais
recentemente.
Tipicamente, o contador de programa é atualizado pela CPU depois de cada
busca de instrução, de modo que ele sempre indique a próxima instrução a ser
executada. Uma instrução de desvio ou de salto também modifica o conteúdo do
contador de programa. A instrução buscada é carregada no IR, onde o código de
operação e as referências a operando são analisadas. A troca de dados com a
memória é feita usando o MAR e o MBR. Em um sistema com barramento, o MAR é
conectado diretamente ao barramento de endereço e o MBR, ao barramento de
dados. Registradores visíveis ao usuário, por sua vez, trocam dados com o MBR.
Os quatro registradores relacionados são usados para transferência de dados
entre a CPU e a memória. Dentro da CPU, os dados devem ser apresentados à ULA
para processamento. A ULA pode ter acesso direto ao MBR e aos registradores
visíveis para o usuário. Alternativamente, podem existir registradores adicionais para
armazenamento temporário de dados, que servem como registradores de entrada e
de saída da ULA e trocam dados com o MBR e os registradores visíveis para o
usuário.
Todo o projeto da CPU inclui um registrador, ou conjunto de registradores,
frequentemente conhecido como palavra de estado de programa (PSW), que contém
informação de estado. Tipicamente, o registrador PSW contém códigos de condição
e outras informações de estado, incluindo os seguintes campos:
 Sinal: contém o bit de sinal do resultado da última operação aritmética.
 Zero: atualizado com o valor 1 se o resultado da última operação for 0.
 ‘Vai-um’: atualizado com o valor 1 se uma operação resultar em um ‘vai-
um’ para fora do bit de ordem superior (adição) ou em um ‘vem-um’ para o
bit de ordem superior (subtração). É usado por operações aritméticas de
múltiplas palavras.
 Igual: atualizado com valor 1 se uma comparação lógica resultar em
igualdade.
 Overflow: usado para indicar overflow aritmético.
10

 Habilitar/desabilitar interrupção: usada para habilitar ou desabilitar


interrupções.
 Supervisor: indica se a CPU está executando em modo supervisor ou em
modo de usuário. Certas instruções privilegiadas apenas podem ser
executadas no modo supervisor, assim como certas áreas de memória
apenas podem ser acessadas no modo supervisor.

O projeto de uma CPU pode também incluir outros registradores relacionados ao


estado e ao controle. Além do registrador PSW, deve existir um registrador que aponta
para um bloco de memória que contém informação de estado adicional (por exemplo,
blocos de controle de processo). Em máquinas que usam vetor de interrupções, pode
existir um registrador de vetor de interrupções. Se for usada uma pilha para
implementar certas funções (por exemplo, chamada de sub-rotina), será necessário
um registrador indicador de topo de pilha. EM um sistema com memória virtual, um
registrador é usado para apontador para a tabela de páginas. Finalmente, podem
também ser usados registradores para o controle de operações de E/S.
Diversos fatores devem ser considerados no projeto da organização de
registradores de controle e de estado. Uma questão-chave é o suporte para o sistema
operacional. Certos tipos de informação de controle são úteis especificamente para o
sistema operacional. Se o projetista da CPU tem entendimento funcional sobre o
sistema operacional a ser usado, a organização dos registradores pode ser feita
razoavelmente de acordo com o sistema operacional.
Outra decisão de projeto importante é a alocação de informação de controle entre
registradores e memória. É comum reservar as primeiras (de endereço mais baixo)
centenas ou milhares de palavras da memória para armazenar informações de
controle. O projetista deve decidir que parte das informações de controle deve ser
mantida em registradores e que parte deve ficar na memória, levando-se em conta o
custo e a velocidade de acesso.
11

1.1.3 CICLO DE INSTRUÇÃO

Conforme podemos ver na figura 4, o ciclo de instrução inclui os seguintes


subciclos:
 Busca: lê a próxima instrução da memória para a CPU.
 Execução: interpreta o código de operação e efetua a operação indicada.
 Interrupção: se as interrupções estão habilitadas e ocorreu uma
interrupção, salva o estado do processo atual e processa a interrupção.

Figura 3: Ciclo de instruções com interrupção


12

Podemos agora detalhar um pouco mais o ciclo de instrução. Primeiramente,


devemos introduzir um subciclo adicional, conhecido como ciclo indireto.

Ciclo Indireto
A execução de uma instrução pode envolver um ou mais operandos, cada um dos
quais requerendo um acesso à memória. Além disso, se for usado endereçamento
indireto, serão requeridos acessos à memória adicionais.
Podemos imaginar a busca de endereços indiretos como mais um subciclo de
instrução. O resultado é mostrado na figura 5. A linha principal de atividade consiste
em alternar as atividades de busca de instruções e de execução de instrução. Depois
que uma instrução é buscada, ela é examinada para determinar se algum
endereçamento indireto está envolvido. Se isso ocorrer, os operandos requisitados
são buscados, usando endereçamento indireto. Seguindo a execução, pode ocorrer
processamento de uma interrupção, antes da busca da próxima instrução.

Figura 4: Ciclo de instrução

Outra maneira de ver esse processo é apresentada na figura 6. Essa figura mostra
mais corretamente a natureza do ciclo de instrução. Quando uma instrução é buscada,
seus campos de referência a operandos devem ser identificados. Cada operando de
entrada localizado na memória é então buscado, podendo esse processo requerer
endereçamento indireto. Operandos localizados em registradores não precisam ser
buscados. Depois que a operação é executada, pode ser requerido um processo
semelhante para armazenar o resultado na memória.
13

Figura 5: Diagrama de transição de estados do ciclo de instrução


14

2 FLUXO DE DADOS

A sequência exata de eventos durante um ciclo de instrução depende do projeto


da CPU. É possível, entretanto, indicar o que pode acontecer em termos gerais.
Suponha que a CPU empregue um registrador de endereço de memória (MAR), um
registrador de armazenamento temporário de dados (MBR), um contador de programa
(PC) e um registrador de instrução (IR).
Durante o ciclo de busca, uma instrução é lida a partir da memória. A figura 7
mostra o fluxo de dados durante esse ciclo. O contador de programa contém o
endereço da próxima instrução a ser buscada. Esse endereço é movido para o MAR
e colocado no barramento de endereço. A unidade de controle requisita uma leitura
na memória, e o resultado é colocado no barramento de dados e copiado no MBR e
então movido para o IR. Enquanto isso, o contador de programa é incrementado de
1, para preparar a próxima busca de instrução.

Figura 6: Fluxo de dados no ciclo de busca

Uma vez que o ciclo de busca termina, a unidade de controle examina o conteúdo
do IR para determinar se a instrução específica algum operando com endereçamento
indireto. Se isso ocorrer, um ciclo indireto é efetuado. Como mostra a figura 8, esse
ciclo é bastante simples. Os N bits mais à direita do MBR, que contém a referência ao
15

endereço, são transferidos para o MAR. Então, a unidade de controle requisita uma
leitura de memória, para transferir o endereço do operando desejado para o MBR.

Figura 7: Fluxo de dados no ciclo indireto

O ciclo de busca e o ciclo indireto são simples e previsíveis. O ciclo de execução


pode ter muitas formas, dependendo de qual das várias instruções de máquina está
contida no IR. Ele pode envolver transferência de dados entre registradores, leitura e
escrita na memória ou em dispositivos de E/S e invocação da ULA.
Assim como o ciclo de busca e o ciclo indireto, o ciclo de interrupção é simples e
previsível (Figura 9). O conteúdo corrente do PC deve ser salvo, para que a CPU
possa retomar sua atividade normal depois de processar a interrupção. Assim, o
conteúdo do PC é transferido para o MBR, para depois ser escrito na memória. A
posição especial da memória reservada para esse propósito é carregada no MAR pela
unidade de controle. Ela pode ser, por exemplo, a posição apontada pelo registrador
de topo de pilha. O PC é carregado com o endereço da rotina de interrupção. Como
resultado, o próximo ciclo de instrução começará buscando a instrução apropriada.

Figura 8: Fluxo de dados no ciclo de interrupção


16

3 OPERAÇÕES DE UMA CPU ATRAVÉS DA PROGRAMAÇÃO

3.1.1 UM EXEMPLO DE PROGRAMA

Vejamos um exemplo de programa de computador e de como ele é executado por


um processador. Nosso computador imaginário possui uma memória que consiste de
células numeradas; a primeira célula é a de índice 0, a segunda a de índice 1, e assim
por diante. Cada célula pode guardar 32 bits de informação. Portanto, em cada célula
podemos guardar cada um dos números inteiros de 0 a \(2^{32} - 1\).

Nosso processador imaginário pode executar as seguintes instruções:


Instrução Efeito
mov num $pos coloca o número num na célula de índice pos
add $pos1 soma o número na posição pos2 ao número na posição pos1 e
$pos2 guarda o resultado na posição pos1
dec $pos subtrai 1 do número na posição pos
pula para a instrução ip se o número na posição de memória pos é
jz $pos ip
zero
jmp ip pula para a instrução ip
nop no operation: não faz nada!
O problema que queremos resolver é o seguinte: somar os números de 1 a 5 e
guardar o resultado na posição de memória 500. A seguinte sequência de instruções
(um programa) resolve este problema; note que cada instrução possui um número de
0 a 6:

0: mov 5 $40 ; Colocamos 100 na célula 40


1: mov 0 $500 ; Colocamos 0 na célula 500
2: add $500 $40 ; Somamos o conteúdo da célula 40 à célula 500
3: dec $40 ; Subtraímos 1 da célula 40
4: jz $40 6 ; Se $40 = 0, pulamos para instrução 6
5: jmp 2 ; Se $40 não é zero, pulamos para 2
6: nop ; Neste ponto, $500 = 1 + 2 + 3 + 4 + 5
Note que usamos a célula de memória 40 em nosso programa. Essa escolha foi
arbitrária. Cabe ao programador ter certeza de que a célula 40 não guarda nada
importante para outros programas rodando no nosso computador.
17

O programa acima está descrito numa linguagem de programação, uma notação


para a descrição de programas de computador que pode ser mais facilmente
compreendida por seres humanos.
3.1.2 SIMULAÇÃO DO PROGRAMA

Para que nosso programa seja executado ele deve ser carregado na memória do
computador. Nosso programa tem 6 instruções, numeradas de 0 a 6. Para iniciar a
execução, o processador é instruído (pelo sistema operacional, por exemplo) a ler a
instrução de número 0. A partir daí o programa é executado.

Célula 40 Célula 500 Instrução


? ? mov 5 $40
5 ? mov 0 $500
5 0 add $500 $40
5 5 dec $40
4 5 jz $40 6
4 5 jmp 2
4 5 add $500 $40
4 9 dec $40
3 9 jz $40 6
3 9 jmp 2
3 9 add $500 $40
3 12 dec $40
2 12 jz $40 6
2 12 jmp 2
2 12 add $500 $40
2 14 dec $40
1 14 jz $40 6
1 14 jmp 2
1 14 add $500 $40
1 15 dec $40
0 15 jz $40 6
0 15 nop

Cada linha acima mostra a instrução executada e o conteúdo das células 40 e


500 antes da execução da instrução. Assim, no início, o conteúdo das células é
qualquer número que nelas estava contido. Após a execução da primeira instrução, o
conteúdo da célula 40 torna-se 5, e assim por diante. Quando chegamos à instrução
6 do programa, a célula 500 contém a soma dos números de 1 a 5
18

REFERÊNCIAS

IME, fmario. Disponível em: < https://www.ime.usp.br/~fmario/mac2166/intro.html>.


Acesso em 21 de outubro de 2018.

Scribd, Estrutura e Funcionamento Da Cpu. Disponível em: <


https://pt.scribd.com/doc/7028962/4-Estrutura-e-Funcionamento-Da-Cpu>. Acesso
em 21 de outubro de 2018.