Executando o Programa (Parte 2)
As Instruções
Estamos a verificar graficamente a forma como a máquina executa com 0 e 1, através dos sinais de seleção, as instruções que lhe demos em C e em Assembly, encaminhando em cada ciclo de clock, os valores lógicos a partir dos Registadores sobre que atuarem e pelos circuitos que selecionarem, até às barreiras de fim de instrução, de novo os Registadores.
Em cada um dos gráficos poderemos visualizar os valores nos Registadores e na ULA bem como os circuitos intervenientes na UCP Op (operação máquina) referida. Acabámos o artigo anterior analisando como vai ser executada em Assembly a 4ª instrução C do programa que criámos e estamos a executar dentro da UCP.
4ª Instrução C
Assembly Linha 8 – UCP Op 4
CP 2
representada na Figura 22. A esta instrução Assembly corresponde a instrução em código máquina
100100000010
e a Operação 4 da UCP.
O Registador PI aponta agora para o endereço 00000100 (4) da MI, onde se encontra a instrução a executar.
É uma instrução do tipo CP valor.
O Opcode dá origem aos sinais de controlo:
- DEFB que é 0, selecionando a constante da instrução, que assim será o 2º operando da ULA.
- DEFULA que é 11, escolhendo a operação de comparação na ULA.
O 1º operando da ULA vem do RegA, onde se encontra já memorizado. O 2º operando da ULA vem da constante da instrução. Ambos se propagam para o interior da ULA onde a operação selecionada é executada ficando nas suas saídas de informação paralela o registo do estado do circuito de comparação Ig e R após a operação.
Esta Instrução transfere o valor da constante para o 2º Op. da ULA (linha Azul), transfere o valor do RegA para o 1º Op da ULA (linha Violeta), compara os dois valores registando os resultados R e Ig no RegULA (linha Verde) e incrementa o Registador PI (linha Preta).
Recomendamos a leitura da análise que fizemos sobre o circuito comparador no Capítulo “Operações aritméticas e lógicas“. O operando A desse circuito representa o 1º operando da ULA (RegA) e o operando B representa o 2º operando da ULA (constante). Como lá vimos:
- Se R = 1 então A ≥ B.
- Se R = 0 então A < B.
- Se Ig = 1 então A = B.
- Se Ig = 0 então A ≠ B.
A tarefa desta instrução fica cumprida quando os valores dos bits Ig e R ficam na entrada do RegULA (Registador da ULA), pois a avaliação do seu valor só é feita na instrução seguinte. Esta instrução só compara dois valores.
Assembly Linha 9 – UCP Op 5
JPM Fim
representada na Figura 23. A esta instrução Assembly corresponde a instrução em código máquina
111100001010
e a Operação 5 da UCP.
O Registador PI aponta agora para o endereço 00000101 (5) da MI, onde se encontra a instrução a executar.
É uma instrução do tipo JPM valor.
O Opcode dá origem ao sinal de controlo DEFPLI que é 11, selecionando a porta de MUX cuja entrada é ¬R, que foi encontrado na instrução anterior e que assim é atribuído a PL.
Quando PL é 1 o Registador PI salta para o endereço indicado pela constante (carrega o seu valor em paralelo) mas enquanto PL for 0 incrementa o endereço.
Esta instrução define o valor de ¬R (0) na entrada da porta ativa do MUX DEFPLI (linha ). Com base nesse valor a informação de PL (0) é enviada ao Registador PI (linha ), que incrementa.
Esta instrução implica um salto condicional e a condição é que A (RegA) seja menor do que B (constante). Tal acontece quando R for 0 e portanto ¬R for 1.
Mas foi na instrução anterior que A (RegA) foi considerado ou não menor que B (constante) e que R assumiu o valor 0 ou 1. Dissemos bem, na instrução anterior, pois foi aí que a comparação foi efetuada. Daí a razão da existência do RegULA. É necessário preservar os valores de Ig e R, que nesta instrução serão indefinidos, pois dependem dos valores que entretanto se propagaram incontroladamente para os operandos da ULA e estão agora a ser comparados. Com RegULA no meio isso não nos afeta, pois os valores encontrados para Ig e R quando nos interessava, estão agora defendidos nas suas saídas.
Assembly Linha 10 – UCP Op 6
MUL [Fctr]
representada na Figura 24. A esta instrução Assembly corresponde a instrução em código máquina
100001100100
e a Operação 6 da UCP.
O Registador PI aponta agora para o endereço 00000110 (6) da MI, onde se encontra a instrução a executar.
É uma instrução do tipo MUL [endereço].
A descodificação do Opcode dá origem aos sinais de controlo:
- DEFB que é 1, selecionando e encaminhando o valor na posição da MD cujo endereço é definido pela constante e corresponde à posição [Fctr]. Este valor fica de imediato no 2º operando da ULA pois a saída de DEFB está-lhe diretamente ligada.
- DEFULA que é 10, escolhendo a operação de multiplicação na ULA.
- DEFA que é 0, selecionando e encaminhando o resultado da ULA para o RegA.
- MEMA que é 1, memorizando no RegA valor do resultado da operação da ULA, que é encaminhado para ele por DEFA.
O 1º operando da ULA vem do RegA, onde se encontra já memorizado o mesmo valor que em [Temp].
O 2º operando da ULA vem da posição ([Fctr]) da MD cujo endereço é indicado pela constante da instrução.
Ambos se propagam para o interior da ULA onde a multiplicação é executada. Na saída da ULA fica o resultado dessa operação, o qual por sua vez se propaga ao RegA, onde será memorizado na queda do Clock.
Estamos perante uma operação máquina em que se cumprem várias acções:
- Leitura da instrução na MI.
- Descodificação do Opcode da instrução.
- Leitura do valor do 2º operando da ULA, na MD
- Multiplicação na ULA do valor em RegA pelo valor em [Fctr].
- Escrita no RegA do valor do resultado da multiplicação na ULA.
- Incremento do Registador PI.
Esta Instrução transfere o valor da MD para o 2º Op. da ULA (linha Violeta), transfere o valor do RegA para o 1º Op da ULA (linha Verde), multiplica os dois valores registando o resultado no RegA (linha Azul) e incrementa o Registador PI (linha Preta).
Fica memorizado no RegA o valor da variável fatorial correspondente ao cálculo do fatorial de N até esta iteração.
Assembly Linha 11 – UCP Op 7
LD [Fctr],A
representada na Figura 25. A esta instrução Assembly corresponde a instrução em código máquina
001001100100
e a Operação 7 da UCP.
O Registador PI aponta agora para o endereço 00000111 (7) da MI, onde se encontra a instrução a executar.
É uma instrução do tipo LD [endereço],A.
O Opcode desta instrução define WR como ativo (0), permitindo assim a escrita do valor memorizado em RegA na posição da MD cujo endereço é definido pela constante da instrução.
Esta instrução guarda na MD o valor em RegA (linha Azul) e incrementa o Registador PI (linha Preta).
O valor de fatorial fica atualizado na MD.
Assembly Linha 12 – UCP Op 8
LD A,[Temp]
representada na Figura 26. A esta instrução Assembly corresponde a instrução em código máquina
000101100101
e a Operação 8 da UCP.
O Registador PI aponta agora para o endereço 00001000 (8) da MI, onde se encontra a instrução a executar.
É uma instrução do tipo LD A,[endereço].
A descodificação do Opcode gera os sinais de controlo:
- DEFB que é 1, selecionando e encaminhando o valor na posição da MD cujo endereço é definido pela constante e corresponde à posição [Fctr].
- DEFA que é 1, selecionando e encaminhando o valor que vem de DEFB para o RegA.
- MEMA que é 1, memorizando no RegA o valor encaminhado por DEFA, o valor de temporário.
Esta instrução lê o valor de temporário da MD e regista-o no RegA (linha Azul) e incrementa o Registador PI (linha Preta).
Assembly Linha 13 – UCP Op 9
JP Repete
representada na Figura 27.
A esta instrução Assembly corresponde a instrução em código máquina 101100000010
e a Operação 9 da UCP.
O Registador PI aponta agora para o endereço 00001001 (9) da MI, onde se encontra a instrução a executar.
É uma instrução do tipo JP valor.
O Opcode gera o sinal de controlo DEFPLI com o valor 01, selecionando o valor 1 em DEFPLI que é atribuído a PL.
Quando PL é 1 o Registador PI salta para o endereço indicado pela constante (carrega o seu valor em paralelo)e que é a etiqueta Repete.
Portanto, esta instrução, forçando PL a 1, provoca um salto incondicional para a linha Assembly com a etiqueta Repete.
Vai iniciar-se nova iteração na linha 6 do programa Assembly.
Até ao final das iterações, as operações que se vão seguir têm gráficos iguais aos apresentados, só diferindo nos valores na MD, no RegA e na ULA. Vamos apresentar gráficos simplificados que evidenciam os valores e as ações principais de cada operação.
Para o início desta iteração a variável temporário tem o valor 3 e está guardada no RegA e na MD. A variável fatorial tem o valor 12 e está guardada na MD.
Assembly Linha 6 – UCP Op 10
SUB 1
representada anteriormente na Figura 20 e agora na Figura 28
com o código máquina 101100000010.
O valor em RegA é colocado no 1º Op da ULA (linha Verde). O valor da constante é colocado no 2º Op da ULA (linha Violeta). A operação de subtração é efetuada e o resultado (2) é memorizado no RegA (linha Azul).
A variável temporário passa a ter o valor 2 e fica guardada no RegA.
Assembly Linha 7 – UCP Op 11
Load [Temp],A
representada anteriormente na Figura 21 e agora na Figura 29
com o código máquina 001001100101.
A variável temporário (2) é guardada na MD (linha Azul), pois o seu valor em RegA vai ser usado e substituído.
Assembly Linha 8 – UCP Op 12
CP 2
representada anteriormente na Figura 22 e agora na Figura 30
com o código máquina 100100000010.
O valor de temporário (2) ainda no RegA é colocado no 1º Op da ULA (linha Verde). A constante (2) é colocada no 2º Op da ULA (linha Violeta). A comparação é feita e os resultados R (1) e Ig (1) colocados no RegULA (linha Azul).
Foi feita a verificação de que temporário ainda não é menor do que 2.
Assembly Linha 9 – UCP Op 13
JPM Fim
representada anteriormente na Figura 23 e agora na Figura 31
com o código máquina 100100000010.
O valor de R (1) é memorizado no RegULA e é enviado para o MUX como ¬R (0) (linha Cinza) onde DEFPLI dá instrução de não salto condicionado (linha Cinza) pelo valor de R. Não carrega, pois PL é 0
Como temporário ainda não é menor do que 2, o Registador PI incrementa.
Assembly Linha 10 – UCP Op 14
MUL [Fctr]
representada anteriormente na Figura 1-24 e agora na Figura 32
com o código máquina 100001100100.
O valor de fatorial (12) na MD é colocado no 2º Op da ULA (linha Violeta). O valor de temporário (2) que ainda está no RegA é colocado no 1º Op da ULA (linha Verde). Multiplica os dois, determinando o valor de fatorial para esta iteração (24) e guardando-o no RegA (linha Azul).
Assembly Linha 11 – UCP Op 15
LD [Fctr],A
representada anteriormente na Figura 1-25 e agora na Figura 33
com o código máquina 001001100100.
O valor de fatorial que ficou no RegA é guardado na MD, representando o cálculo do fatorial de 4 até esta iteração (linha Azul).
Assembly Linha 12 – UCP Op 16
LD A,[Temp]
representada anteriormente na Figura 1-26 e agora na Figura 34
com o código máquina 000101100101.
O valor de temporário é lido na MD e reposto no RegA para prosseguir o cálculo (linha Azul).
Assembly Linha 13 – UCP Op 17
JP Repete
representada anteriormente na Figura 1-27 e agora na Figura 35
om o código máquina 101100000010.
O sinal DEFPLI seleciona no seu MUX (linha Vermelha) a entrada sempre ativa (1). Assim PL é colocado a 1, provocando um salto para o endereço fornecido pela constante (Repete).
Assembly Linha 6 – UCP Op 18
SUB 1
representada anteriormente na Figura 20 e agora na Figura 36
com o código máquina 101100000010.
O valor em RegA é colocado no 1º Op da ULA (linha Verde). O valor da constante é colocado no 2º Op da ULA (linha Violeta). A operação de subtração é efetuada e o resultado (2) é memorizado no RegA (linha Azul).
A variável temporário passa a ter o valor 1 e fica guardada no RegA.
Assembly Linha 7 – UCP Op 19
Load [Temp],A
representada anteriormente na Figura 21 e agora na Figura 37
com o código máquina 001001100101.
A variável temporário (agora 1) é guardada na MD (linha Azul), mas mantém-se em RegA.
Assembly Linha 8 – UCP Op 20
CP 2
representada anteriormente na Figura 22 e agora na Figura 38
com o código máquina 100100000010.
O valor de temporário (1) ainda no RegA é colocado no 1º Op da ULA (linha Verde). A constante (2) é colocada no 2º Op da ULA (linha Violeta). A comparação é feita e os resultados R (0) e Ig (0) colocados no RegULA (linha Azul).
Foi feita a verificação de que temporário agora já é menor do que 2.
Assembly Linha 9 – UCP Op 21
JPM Fim
representada anteriormente na Figura 23 e agora na Figura 39
com o código máquina 100100000010.
O valor de R (0) segue como ¬R (1) do RegULA para o MUX (linha Vermelha) onde DEFPLI dá a instrução de salto condicionado (linha Vermelha). Ao valor de ¬R (1) corresponde um valor de PL 1 o que vai provocar o carregamento em paralelo do endereço da linha 3 do Registador PI .
Como temporário é menor do que 2, o Registador PI carrega o endereço fornecido pela constante (Fim).
Assembly Linha 14 – UCP Op 22
JP Fim
representada na Figura 40.
A esta instrução Assembly corresponde a instrução em código máquina 101100001010
e a Operação 9 da UCP.
É uma instrução de salto incondicional, pois DEFPLI é 01, selecionando a entrada do MUX ligada à alimentação, portanto sempre a 1.
O salto é feito pelo carregamento em paralelo do endereço fornecido pela constante . Só que este é o endereço desta mesma instrução, i.e. aponta para si própria.
Em cada ciclo de clock carrega o Registador PI carrega o endereço desta instrução como o endereço seguinte. A UCP vai ficar num ciclo infinito de Busca, Descodificação e Execução, até que o Sistema Operativo se apodere da situação e coloque outro programa no seu lugar.
Conclusão
Está concluído o pequeno programa que utilizámos para ilustrar como funciona uma UCP. O valor do fatorial de 4 está guardado na posição [Fctr] da memória de dados sob a forma da variável fatorial.
fatorial = [Fctr] = 24
Uma UCP onde a MI tinha 11 linhas, a MD 2 linhas e foram consideradas como circuitos interligados com o núcleo da UCP, onde a MI tinha uma largura de palavra diferente da MD, onde o ciclo de Busca, Descodificação e Execução de uma instrução se resolviam no mesmo ciclo de clock.
É evidente que tal UCP não tem aplicação real.Mas serviu para a compreensão da forma como a abstração se converte em realidade na UCP, de como as instruções de um programa são cumpridas pelas diferentes interligações de circuitos conseguidas pelos sinais de controlo.
Vamos agora analisar muito superficialmente uma UCP de última geração, com a profundidade que o acesso a elementos sobre o seu funcionamento e que o nível de conhecimentos a que chegámos nos permitem, prometendo continuar a utilizar a mesma UCP como caso de estudo, em situações posteriores em que o conhecimento da realidade possa contribuir para um melhor entendimento das análises teóricas.