Quais são as etapas que constituem o ciclo de execução de uma instrução?

O Conceito de Ciclo de Instrução

Sendo a função da CPU a de executar as instruções dos nossos programas deve haver um processo para descrever passo a passo as tarefas que a CPU deve realizar para cumprir sua função.

No projeto de uma CPU há a fase de escolher o conjunto de instruções que a CPU vai executar. A outra fase é descrever o processo de execução destas instruções ou ciclo de instruções.

O ciclo de instruções é então um processo com etapas que consiste basicamente em interpretar e executar cada instrução.

Mas também inclui a especificação e o projeto dos demais componentes da arquitetura que irão ajudar neste processo.

Para a execução de uma única instrução existem várias etapas que o processador deve realizar. Estas etapas compõem o ciclo de instrução da CPU.

Para facilitar o estudo, vamos considerar uma CPU fictícia e que é portanto mais simples do que uma CPU comercial.

Quais são as etapas que constituem o ciclo de execução de uma instrução?


Vamos considerar a execução de duas instruções do conjunto acima, as instruções LDA Op e ADD Op.

As Instruções LDA e ADD

Vamos considerar alguns valores iniciais existentes ao iniciar a execução do primeiro ciclo de instrução, da instrução LDA.

a ) A instrução LDA está armazenada na MP no endereço decimal 2, que é igual a 00000010 na base 2. A descrição da instrução LDA na base 2 é: 000110110100 ou 1B4 em hexadecimal.

Os 12 bits que constituem a instrução têm finalidades diferentes conforme o formato já definido para as instruções. Os primeiros 4 bits são usados para o código da operação ( C. Op. ) e os 8 bits restantes são usados para indicar o valor do campo operando, na verdade indicam o endereço de memória do dado a ser manipulado pela operação ( Op. ).

Assim temos que os 4 primeiros bits são para o código de operação, C.Op = 0001, e os 8 bits restantes são para o operando, Op. = 10110100. 

Observem que para este processador imaginário as instruções possuem apenas um operando.

Vamos supor agora que o valor armazenado no endereço de memória indicado no campo Op. seja igual a 423 na base 10.

b ) A instrução ADD está armazenada no endereço 3 na base 16, e seu valor na base 2 é igual a 001110110101. 

Da mesma forma que na instrução LDA, os primeiros 4 bits são usados para o código da operação ( C. Op. ) e os 8 bits restantes são usados para o operando ( Op. ).

c ) O valor armazenado no CI é 02 na base 16.

d ) O valor armazenado no RI é 317 na base 16, provavelmente o endereço da instrução executada no ciclo anterior.

e ) O valor armazenado no ACC é 20B na base 16, (  também é um valor obtido na execução da instrução anterior ).

e ) O valor armazenado no REM é B3 e o valor armazenado no RDM é 7BC.

Com isso vemos que:

-

Há vários componentes que participam da execução de um ciclo de instrução

. São eles:

  • CI - Contador de Instrução - Este registrador indica o endereço de memória da próxima instrução a ser processada.
  • RI - Registrador de Instrução - Este registrador contém a próxima instrução a ser executada.
  • ACC - Registrador de dados com 12 bits de tamanho. Tamanho conhecido como RDM.
  • REM -  Registrador de Endereço de Memória com oito bits de tamanho. O endereço de memória pode ser o endereço de uma instrução ou de um dado a ser processado.

Ao ser iniciado o Ciclo de Instrução

,

o valor de cada um destes registradores é o resultado da instrução executada anteriormente, ou seja, do ciclo de instrução anterior.  

Ao terminar um ciclo de instrução, a CPU inicia automaticamente outro ciclo de instrução. 

Agora que conhecemos os componentes envolvidos em um ciclo de instrução precisamos conhecer também os passos realizados pela CPU ao executar um ciclo de instrução. Todo ciclo de instrução é executado conforme o fluxograma abaixo:

Quais são as etapas que constituem o ciclo de execução de uma instrução?


De acordo com o fluxograma acima, podemos ver que o ciclo de instrução é formado por 2 etapas principais: a busca e a execução da instrução. Assim podemos, descrever, de forma simples, o ciclo de instrução nos passos abaixo:

  • RI <- CI Obter a próxima instrução a ser executada no contador de instrução ( CI ) e armazenar no registrador de instrução ( RI )
  • CI <- CI + 1 Incrementar o contador de instrução ( CI ) para que ele aponte para a próxima instrução a ser executada, ou em outras palavras, para o endereço de memória que contem a próxima instrução. Uma vez que as instruções estão armazenadas em endereços de memória em uma sequência basta adicionar um ao contador de instruções para se obter o endereço onde está a próxima instrução.
  • Interpretar a instrução a ser executada. O código da operação é buscado em um tabela de códigos de operação que mapeia o código de operação para uma operação primitiva do processador.
  • Buscar operandos da instrução, se houverem. Algumas instruções possuem operandos, outras não possuem. Por este motivo, esta etapa é opcional, e nem sempre é executada no ciclo de instruções.
  • Executar a instrução

Agora vamos ver passo a passo como estas duas etapas são realizadas quando o ciclo de instrução é executado:

1 ) Busca da instrução. RI <- CI.

A UC transfere os bits do CI para o REM pelo barramento interno

A UC ativa a leitura pelo barramento de controle, o qual é reconhecido pelo circuito decodificador de endereços da MP. 

Resultado: CI -> REM = 02

O dispositivo de controle da memória decodifica o endereço. Em seguida, aquele circuito transfere os bits da célula de endereço 02,  cujo valor é 1B4 para o barramento de dados e daí para o RDM.

No instante seguinte, o valor 1B4 é transferido do RDM para o RI, pelo barramento interno do processador.

Cada instrução ocupa uma célula da memória principal, sendo que as instruções são organizadas e executadas em sequência, a próxima instrução a ser executada deverá portanto ocupar a célula seguinte, cujo endereço será, então, 03. Portanto, 02 + 1 = 03, que é o endereço da próxima instrução.

É importante aqui entender que o CI armazena então o endereço da próxima instrução a ser executada. Por isso é feito um acesso à memória principal para que seja buscada, no endereço informado pelo CI, a instrução propriamente dita que é então transferida via barramento para o registrador de dados ( RDM).

2 ) Incrementa o Contador de Instrução. CI = CI + 1.

Como foi explicado acima, as instruções são armazenadas na memória em sequencia e portanto basta incrementar o registrador contador de instrução para que ele tenha o endereço da próxima instrução. Porem este incremento nem sempre será de 1 pois em arquiteturas nas quais uma instrução ocupe mais de uma célula na memória a realidade será:

CI = CI + n, sendo n = quantidade de células ocupadas por uma única instrução.

Considere ainda que existem arquiteturas em que o tamanho das instruções é variável, o valor de n é variável também e a UC deve estar preparada para isto.

3 ) Decodificação do código da operação

A UC emite o sinal apropriado para que o RI transfira para o decodificador os 4 bits mais significativos que correspondem ao valor do C. Op. Como já vimos, já que são muitas instruções, cada uma possui um código de operação que precisa ser decodificado para que a CPU execute a operação associada à instrução.

Resultado: decodificador <- 0001 na base 2.

4 ) Se a instrução tiver operandos, a UC deverá buscá-los, senão passa diretamente próximo passo.

Nem todas as instruções possuem operandos. Uma instrução de parada ( STOP ) ou de suspensão da execução de um programa ( SLEEP ) não possuem operandos e portanto podem pular este passo. Por isso esta etapa é opcional e nem sempre é executada. Porém quando é executada implica em transferência via barramento dos dados da memória principal para os registradores de dados.

5 ) Execução da instrução. 

A UC transfere o campo C. Op. para o REM pelo barramento interno.

Após ser decodificada a instrução é finalmente executada pela CPF e o seu resultado armazenado em ACC.  

Resultado: ACC = 1A7

Os passos 1 e 2 correspondem ao ciclo de busca e os passos 4 e 5 correspondem ao ciclo de execução da instrução.

O Desempenho de uma Instrução

O que diferencia o desempenho de uma instrução em relação à outra é a quantidade de ciclos de memória ( acessos ) realizados durante o ciclo de uma instrução

. Isto porque o ciclo de memória tem um tempo considerável se comparado ao ciclo de um processador. 

Uma instrução então que possui 3 operandos leva um tempo maior para ser executada do que uma instrução com 2 operandos visto que serão necessários 3 acessos à memória, via transferência de bits por barramento, para busca do valor dos operandos para a primeira instrução enquanto que serão necessários apenas 2 acessos para a segunda instrução.

Ao mencionar ciclo de memória estamos nos referindo ao conjunto de etapas que leva para concluir um ciclo de leitura ou um ciclo de escrita na memória principal.

Quais as etapas de um ciclo de instrução?

Agora vamos ver passo a passo como estas duas etapas são realizadas quando o ciclo de instrução é executado:.
Busca da instrução. ... .
Incrementa o Contador de Instrução. ... .
Decodificação do código da operação. ... .
Se a instrução tiver operandos, a UC deverá buscá-los, senão passa diretamente próximo passo..

Como funciona o ciclo de execução de uma instrução?

Um ciclo de instrução (também chamado de ciclo de busca e execução ou ciclo busca-execução) é o período de tempo no qual um computador lê e processa uma instrução em linguagem de máquina da sua memória ou a sequência de ações que a CPU realiza para executar cada instrução em código de máquina num programa.

Quais são as quatro etapas que as CPU's utilizam para executar instruções?

seguintes etapas são definidas:.
Busca da instrução..
Decodificação da instrução e busca dos..
Execução, cálculo do endereço de memória ou..
Etapa de acesso à memória ou conclusão de..
Etapa de conclusão da leitura da memória. (load).

O que e uma instrução como ela e formada?

Em ciência da computação, uma instrução é uma operação única executada por um processador e definida por um conjunto de instruções. Num sentido amplo, uma "instrução" pode ser qualquer representação de um elemento num programa executável, tal como um bytecode.