REPRESENTAÇÃO DE INSTRUÇÕES

CICLO DE INSTRUÇÃO
Primeiramente, o programa a ser executado precisa ser carregado (armazenado) na MP, o que é feito pelo Sistema Operacional, que também se encarrega de informar à UCP onde o programa começa. O Sistema Operacional faz isto "setando" o Contador de Instruções (isto é, colocando no CI o endereço da MP onde está localizada a primeira instrução daquele programa).
A partir daí se realiza o processamento automático, executando-se as instruções seqüencialmente uma a uma, o que é obtido através do incremento automático do CI.
Obs: Se o programa inclui uma instrução de desvio, o fluxo seqüencial pode ser alterado.
A UCP não diferencia um dado de uma instrução. A UCP não "executa" dados devido ao conteúdo do CI, que é incrementado pelo tamanho da instrução e fica sempre apontando para a próxima instrução. Mas se em um programa houver uma instrução de desvio para um endereço em que esteja contido um dado, a UCP interpretaria o valor binário do dado como se fosse o código de uma instrução, tentaria executar e o resultado seria imprevisível.

Ciclo de Instrução
1 - A UCP busca o código de operação na MP e armazena no Registrador de Instrução da UC
Fase: Busca da instrução - (Instruction Fetch) - ciclo de busca
RI <--- (CI)
Micro-operações:
- a UC lê o conteúdo do CI (endereço da próxima instrução ) e coloca o endereço no REM;
- a UC envia um sinal à memória de operação de leitura (memory read), via barramento de controle;
- a memória lê o endereço que está no REM, via barramento de endereços, e busca o conteúdo da célula referenciada;
- a memória coloca no RDM, via barramento de dados, o conteúdo da célula lida;
- a memória envia à UC, via barramento de controle, um sinal de "leitura concluída";
- a UC transfere o código de operação (o conteúdo do RDM) ao RI.

2 - A UC (decodificador de instruções) decodifica o Código de Operação.
Fase: Busca da instrução - (Instruction Fetch) - ciclo de busca
Micro-operações:
- o
Decodificador de Instruções decodifica o opcode;
- o Decodificador de Instruções determina quantas células a instrução ocupa;
- a
UC incrementa o CI para apontar para a próxima instrução: CI <--- (CI + n), onde n = nº de células que a instrução ocupa.
- a UC incrementa o REM para apontar para o operando: REM <--- (REM + 1);

3 - A UC busca (se houver) o(s) operando(s)
Fase: Busca de operandos (Operand Fetch) - ciclo de execução
RI <--- (Op)
Micro-operações:
- a UC envia um sinal à memória de operação de leitura (memory read), via barramento de controle;
- a memória lê o endereço que está no REM, via barramento de endereços, e busca o conteúdo da célula referenciada;
- a memória coloca no RDM, via barramento de dados, o conteúdo da célula lida;
- a memória envia à UC, via barramento de controle, um sinal de "leitura concluída";
- a UC transfere o operando (o conteúdo do RDM) ao RI.
* Se o operando é o próprio dado:
-- a UC transfere o dado (o conteúdo do RDM) ao ACC.
-- vai para operação 4; caso contrário:
* Se o operando é um ponteiro para onde o dado está armazenado:
-- a UC coloca no REM o endereço de onde o dado está armazenado;
-- a UC envia um sinal à memória de operação de leitura (memory read), via barramento de controle;
-- a memória lê o endereço que está no REM, via barramento de endereços, e busca o conteúdo da célula referenciada;
-- a memória coloca no RDM, via barramento de dados, o conteúdo da célula lida;
-- a memória envia à UC, via barramento de controle, um sinal de "leitura concluída";
-- a UC transfere o dado (o conteúdo do RDM) ao ACC;
-- vai para operação 4.

4 - A UC comanda a execução da instrução (a operação é executada sobre o dado).
Fase: Execução da instrução - ciclo de execução
- UAL executa a iinstrução.

5 - Se o programa tiver terminado, Para; senão, volta ao passo 1.

Exemplo 1:
Formato da Instrução de Máquina:

Código Operação Operando
8 bits 8 bits
tamanho da instrução = 16 bits

Conteúdo da Memória Principal:

MP

ENDEREÇO CONTEÚDO da CÉLULA
00 2A
01 0C
02 2B
03 04
04 56
..... .....
0C 01
0D 00

Nesta máquina, considere que o código de operação 2A significa LDA Op ==> ACC <--- (Op)
Obs.: A instrução do exercício LDA Op (LDA é um mnemônico para "load accumulator") significa "carrega no acumulador o conteúdo da posição de memória indicada no operando".

Solução:
Neste exemplo:
O CI tem 8 bits porque o operando tem 8 bits; o mapa de memória também mostra isso, com os endereços ocupando 2 dígitos hexadecimais (cada dígito hexadecimal requer 4 bits).
A célula de memória tem 8 bits, conforme vemos pelo mapa de memória, em que os conteúdos das células ocupam 2 dígitos hexadecimais.
O RI tem 16 bits porque a instrução tem 16 bits.
ACC - não daria para assegurar porque depende do tamanho da palavra; vamos assumir 8 bits, de vez que como o operando, o opcode e a célula têm 8 bits, o RDM e o Acumulador provavelmente também terão 8 bits
A instrução LDA Op ocupará 2 células, logo o incremento do CI = n = 2

Vamos acompanhar o processamento da instrução LOAD (2A neste exemplo) => colocar o conteúdo do endereço indicado pelo operando no ACC (carrega dado no acumulador); T0, T1 e T2 representam os diversos estados dos registradores (nos respectivos tempos do ciclo de busca da instrução).
n=2 (2 acessos à MP para buscar instrução)

CICLO de TEMPO CI ACC REM RDM  RI (16 bits) OPERAÇÃO
T0 00 x 00 2A 2Axx opcode
T1 02 x 01 0C 2A0C Lê operando
T2 02 0C 01 0C 2A0C Carrega Acumulador

Obs.: usamos um x para indicar que o conteúdo de uma célula ou de parte da célula não importa ("don't care") e não é considerado (é desprezado) para a presente operação, podendo ser nulo ou então conter o resultado de uma operação anterior.

Exemplo 2:
Considerando a mesma máquina do exemplo anterior, qual seria o processamento da instrução

LDIA Op ==> ACC <--- ((Op))
Obs.: A instrução do exercício LDIA Op (LDIA é um mnemônico para "load accumulator indirect") significa "carrega no acumulador o conteúdo da posição de memória apontada pela posição indicada no operando". Portanto, a posição de memória indicada pelo Operando é um ponteiro para a posição onde está o dado e existe uma indireção. Esse assunto será tratado em detalhe na próxima seção - Modo de Endereçamento.

CICLO de TEMPO CI ACC REM RDM  RI (16 bits) OPERAÇÃO
T0 00 x 00 2A 2Axx opcode
T1 02 x 01 0C 2A0C Lê operando
T2 02 x 0C 01 2A0C Lê dado
T3 02 01 0C 01 2A0C Carrega dado no acumulador

Exemplo 3:
Numa máquina de 2 operandos, a MP tem 256 células com 20 bits, o RDM tem 20 bits e cada instrução ocupa 1 célula. Em seu conjunto de instruções, o código binário 6 tem o seguinte significado:
6 => ADD Op1, Op2 ==> (Op1) <---- (Op1) + (Op2) - soma o conteúdo da posição de memória indicada em Op1 com o conteúdo da posição de memória indicada em Op2 e coloca o resultado na posição de memória indicada em Op1.
Mostre o conteúdo dos registradores da UCP e das posições de memória que se alterarem após a execução da instrução dada.

Mapa da memória:

ENDEREÇO MP (T1)
10 6B2B3
.... .....
B2 03210
B3 04591
.... .....

 Solução:
A MP tem 256 células = 28 células ----> REM = 8 bits ----> CI = 8 bits
Célula = 20 bits e 1 instrução = 20 bits
RDM = 20 bits e RI = 20 bits
Operando = 8 bits ---> 8 bits x 2 operandos = 16 bits (cada instrução tem 2 operandos); logo, o opcode tem 4 bits.
Cada instrução ocupa uma célula, logo n=1 (o incremento do CI será sempre 1).

Formato da instrução: opcode operando 1 operando 2
(20 bits) 4 bits 8 bits 8 bits

- CI REM RDM ACC OPERAÇÃO
T0 10 10 6B2B3 0 Lê instrução (opcode + 2 operandos)
T1 11 B2 03210 03210 Lê 1º dado
T2 11 B3 04591 077A1 Lê 2º dado
T3 11 B2 077A1 077A1 Executa instrução

CÁLCULO DO VALOR DO ACUMULADOR
03210
04594+
--------
077A1

Resp.: A posição de memória B2 será alterada para o valor 077A1. Nenhuma outra posição de memória é alterada.

Exemplo 4:
Máquina com Instruções de 3 operandos
Resolver a expressão: X = A * (B + C * D - E/F)

Conjunto de Instruções:
ADD X,A,B ===> (X) <--- (A) + (B) => soma conteúdo das posições de memória A e B e coloca o resultado em X
SUB A,B,X ===> (X) <--- (A) - (B) => subtrai conteúdo da posição de memória B da A e coloca o resultado em X
MULT A,B,X ===> (X) <--- (A) * (B) => multiplica conteúdo das posições de memória A e B e coloca o resultado em X
DIV A,B,X ===> (X) <--- (A) / (B) => divide conteúdo da posição de memória A pela B e coloca o resultado em X

Solução:
MULT C, D, X ----> (X) <--- (C) * (D)
DIV E, F, T ------> (T) <--- (E) / (F) (sendo T uma variável temporária - nenhuma variável deve ser sobrescrita)
ADD B, X, X ----> (X) <--- (B) + [(C) * (D)]
SUB X, T, X -----> (X) <--- (B) + [(C) * (D)] - [(E) / (F)]
MULT A, X, X ----> ((X) <--- (A) * {(B) + [(C) * (D)] - [(E) / (F)]}

Obs: o número de instruções é igual ao número de operações da expressão.

Exemplo 4:
Máquina com Instruções de 2 operandos
Resolver a expressão: X = A * (B + C * D - E/F)

Conjunto de Instruções:
ADD X,A ===> (X) <--- (X) + (A) ===> Soma o conteúdo de X e A e coloca o resultado em X
SUB X,A ===> (X) <--- (X) - (A)
MULT X,A ===> (X) <--- (X) * (A)
DIV X,A ===> (X) <--- (X) / (A)
MOV X,A ===> (X) <--- (A) ==> copia o conteúdo de A para X.

Obs.: observar que, ao não dispor do 3º operando (o qual indica uma terceira posição de memória, onde será colocado o resultado), o conteúdo do 1º operando é sobrescrito (portanto, é destruído) pela instrução, pois o resultado vai para ele; desta forma, é necessário uma outra instrução, para mover o conteúdo de uma posição de memória para outra posição, de forma a permitir salvar o conteúdo de uma variável e também mover o resultado, se necessário:

Solução:
MOV X, C ==> (X) <--- (C) (copiou o conteúdo de C para X)
MULT X, D ==> (X) <--- (C) * (D) (desta forma não se perde o conteúdo de C)
MOV T, E ==> (T) <--- (E) (copiou o conteúdo de E para uma variável temporária T)
DIV T, F ==> (T) <--- (E) / (F)
ADD X, B ==> (X) <--- (B) + [(C) * (D)]
SUB X, T ==> (X) <--- (B) + [(C) * (D)] - [(E) / (F)]
MULT X, A ==> (X) <--- (A) * {(B) + [(C) * (D)] - [(E) / (F)]}

OBS: o número de instruções é maior que o número de operações da expressão

Exemplo 5:
Máquina com Instruções de 1 operando
Resolver a expressão: X = A * (B + C * D - E/F)

Conjunto de Instruções:
ADD X ==> ACC <--- ACC + (X) ==> soma os conteúdos do acumulador e de X e coloca o resultado no acumulador.
SUB X ==> ACC <--- ACC - (X)
MPY X ==> ACC <--- ACC * (X)
DIV X ==> ACC <--- ACC / (X)
LOAD X ==> ACC <---- (X) ==> carrega o conteúdo de X no acumulador
STORE X ==> (X) <--- ACC ==> salva o conteúdo do acumulador na posição de memória X.

Obs.: Observe que, ao dispor de apenas 1 operando (portanto, teria a indicação de apenas 1 dado da operação), o 2º dado e o local onde será colocado o resultado são substituídos pelo ACUMULADOR que funciona como um OPERANDO IMPLÍCITO. O conteúdo do acumulador é sobrescrito (destruído) pela instrução, pois o resultado vai para ele; desta forma, são necessárias duas outras instruções, para carregar o conteúdo de uma posição de memória para o acumulador e para salvar o conteúdo do acumulador para outra posição de memória, de forma a permitir mover dados e o resultado da instrução, entre o acumulador e a a memória:

Solução:
LOAD E ==> ACC <--- (E) (carregou o conteúdo de E no acumulador)
DIV F ==> ACC <--- (E) / (F) (não se perde o conteúdo de E ou F)
STORE X ==> (X) <--- (E) / (F) (salvou o conteúdo do acumulador em X)
LOAD C ==> ACC <--- (C) (carregou o conteúdo de C no acumulador)
MULT D ==> ACC <--- (C) * (D) (não se perde o conteúdo de C ou D)
ADD B ==> ACC <--- (B) + [(C) * (D)]
SUB X ==> ACC <--- (B) + [(C) * (D)] - [(E) / (F)]
MULT A ==> ACC <--- (A) * {(B) + [(C) * (D)] - [(E) / (F)]}
STORE X ==> (X) <--- (A) * {(B) + [(C) * (D)] - [(E) / (F)]} (salva o conteúdo do acumulador na posição de memória X)

OBS: o número de instruções é maior que o número de operações da expressão. Não foi necessário utilizar qualquer variável temporária.

Exercício 6
Compare os exemplos anteriores em relação ao tempo de execução, número de instruções e memória. Experimente resolver as expressões executando as instruções em ordem diferente, e seus efeitos em relação ao número de instruções e de variáveis temporárias usadas.

(Os exemplos 3, 4, 5 e 6 foram adaptados do livro Introdução à Organização Estruturada de Computadores - Mário A. Monteiro)

>