Por mais que os leigos insistam em considerar que os computadores são máquinas inteligentes, a realidade é bastante diferente. Computadores são máquinas como quaisquer outras que nada mais fazem senão aquilo que foram concebidas para fazer. Isso não quer dizer, naturalmente, que computadores sejam máquinas “inferiores”. Pelo contrário: se programadas corretamente, são capazes de executar tarefas extraordinariamente complexas com enorme rapidez e precisão quase inacreditável. Mas o ponto crucial reside justamente na expressão “se programadas corretamente”. Ou seja: computadores, sem a intervenção humana, são máquinas imprestáveis. Eles nada fazem sozinhos.
Ou quase nada. Para ser preciso, há apenas uma ação que os computadores executam “sozinhos”, ou seja, automaticamente, sem qualquer intervenção humana. É claro que só fazem isso porque foram concebidos para agir assim pelos humanos. Mas o fato é que fazem. Esta ação chama-se “ciclo de busca e execução” (em inglês, “fetch and execute cycle”). Desde o momento em que um computador é ligado até o momento em que a alimentação elétrica é interrompida, computadores nada mais fazem do que executar sucessiva, incansável e incessantemente um ciclo de busca e execução após outro. Mesmo quando, aparentemente, o computador está inerte, sem nada fazer, aguardando uma entrada de dados, ainda assim ele continua executando ciclos de busca e execução sucessivos, milhões de vezes por segundo. É por meio destes ciclos que os computadores conseguem executar programas. Porque quem leu a coluna “O que é uma UCP” sabe que um programa nada mais é que um conjunto encadeado de instruções com um propósito determinado. E o ciclo de busca e execução serve justamente para buscar uma instrução na memória principal e executá-la. Vamos ver como isso funciona.
Instruções, como sabemos, são números que o microprocessador interpreta como ordens (ou comandos) para executar determinadas ações que, em conjunto, constituem um programa. Para que possam ser introduzidas no microprocessador as instruções devem estar armazenadas em algum lugar. Esse lugar é obrigatoriamente a memória principal, ou MP (e este ponto é importante: por razões que veremos mais tarde, uma instrução só poderá ser executada se, antes, tiver sido armazenada na MP). Portanto, para que um programa seja executado, é preciso que as instruções que o compõem tenham sido previamente copiadas em um trecho da memória principal. Esta ação denomina-se “carregar o programa” e, na maioria dos casos, consiste em ler em um arquivo do disco rígido as instruções que formam o programa e copiá-las na MP (isso ocorre quando, por exemplo, se executa um clique duplo no ícone que representa o programa em um sistema operacional que usa interface gráfica, como Windows). Como isso é feito não nos interessa no momento. Interessa apenas o fato de que, para que um programa seja executado, as instruções que o compõem precisam estar ocupando um trecho da memória principal.
O ciclo de busca e execução é então um conjunto de ações que envolve apenas a UCP, a MP e o trecho do FSB (ou barramento frontal) que as une. Veja, na Figura 1, um diagrama esquemático destes componentes. Trata-se de um esquema de uma placa-mãe elementar cuja MP é constituída por apenas 256 posições de memória de oito células cada (8bits, ou um byte), identificadas por seus endereços que vão de zero a 255 (números em branco, mostrados tanto em decimal quanto em binário à esquerda da representação da MP). Os registradores da UCP por sua vez também são de oito bits. Por isso, tanto o barramento de dados quanto o de endereços têm apenas oito linhas cada. É uma placa-mãe tão simples que, com sua memória de apenas 256 posições, pode fazer muito pouco. Mas é o bastante para que possamos entender como funciona o ciclo de busca e execução. Afinal, do ponto de vista lógico, a sucessão de ações que descreveremos a seguir e que configuram o ciclo de busca e execução é rigorosamente a mesma seja nesta UCP elementar, seja na mais complexa UCP moderna. Então vamos a ela.
|
Figura 1: Diagrama esquemático mostrando UCP, MP e FSB. |
O ciclo de busca e execução consiste de três passos que são executados seqüencialmente e repetidos à exaustão. Vamos examiná-los um a um. Mas antes preparemos o cenário.
Imaginemos que, no momento em que começa a nossa observação há um programa sendo executado e a situação da UCP e MP seja a mostrada na Figura 2. O programa que está sendo executado já foi previamente carregado na memória principal e ocupa o trecho que abrange os endereços 246 e superiores. O conteúdo das posições de memória e dos registradores que nos interessam é exibido sob a forma de números binários. Repare especificamente no registrador denominado “Ponteiro de Instrução” (PI). Ele armazena o valor binário “11110111” (correspondente ao decimal “247”). E note que a posição da MP cujo endereço é 247 armazena o valor “00010111” (que deve ser uma instrução, já que está no trecho da MP ocupado pelo programa). As posições da memória principal situadas imediatamente acima desta contêm os valores mostrados na Figura 2 e que certamente serão as demais instruções do programa. O conteúdo das outras posições da MP, assim como dos demais registradores da UCP, não são relevantes para nossa discussão e podem ser quaisquer, por isso estão representados por “XXXXXXXX”.
|
Figura 1: UCP, MP e FSB |
Antes de prosseguirmos, uma observação importante. A única coisa que pode ser armazenada em uma posição de memória, esteja ela na MP ou nos registradores, é um número expresso no sistema binário (no exemplo, números de oito bits, ou um byte). Esse número, no entanto, pode ter diversos significados ou funções, dependendo de como seja interpretado.
Senão vejamos: todos os dados processados pelo computador são expressos sob a forma de números (ou seja, são digitalizados; veja as colunas anteriores sobre digitalização de imagens e sons).
Portanto, um número contido em uma posição de memória pode representar um dado.
Por outro lado, como acima mencionado, as instruções que o microprocessador decodifica e executa também são números. Nos primórdios da era dos computadores havia uma memória específica para conter instruções e uma outra, independente, apenas para conter dados. Porém, durante o final da primeira metade do século passado, um genial matemático nascido na Hungria e naturalizado americano, John von Neumann (pronuncia-se “fón nóiman”), percebeu que isso complicava desnecessariamente a “arquitetura” (ou organização interna) dos computadores e sugeriu que tanto os dados quanto as instruções passassem a ser armazenadas em um único conjunto de posições de memória. Esse conjunto é a MP. Essa concepção deu origem à chamada “arquitetura de von Neumann”. Hoje em dia, todos os computadores modernos são “máquinas de von Neumann”, ou seja, máquinas que adotam a arquitetura de Von Newmann, armazenando tanto dados quanto instruções no mesmo espaço de endereçamento de memória.
Portanto, um número contido em uma posição de memória também pode representar uma instrução.
Finalmente, como se pode perceber examinando as figuras anteriores, endereços de posições da memória principal também são números. E quando se deseja referenciar uma determinada posição da MP (ou seja, “apontar” para ela), armazena-se seu endereço em outra posição de memória. Posições de memória, quando utilizadas para armazenar endereços de posições de memória, recebem a designação genérica de “Ponteiro”.
Portanto, um número contido em uma posição de memória também pode representar um endereço.
Em suma: um número armazenado em uma posição de memória pode representar um dado, uma instrução ou um endereço, dependendo da forma pela qual for interpretado e utilizado.
Como sabemos que posições de memória que armazenam endereços de outras posições de memória recebem a designação genérica de “Ponteiro” fica fácil concluir que o registrador denominado “Ponteiro de instruções”, ou PI, contém um endereço. Mais especificamente: contém o endereço da posição da MP que armazena a próxima instrução a ser executada.
Então, o primeiro passo do ciclo de busca e execução consiste meramente em ir buscar esta instrução na MP. O que é feito através de uma operação de leitura da memória como a que examinamos na coluna anterior, “Leitura e escrita na MP”. O primeiro passo então simplesmente busca a instrução armazenada na memória principal e a transcreve no registrador denominado “Registrador de Instruções”, ou RI. É o passo da “busca”.
Uma operação de leitura da MP, como sabemos, começa escrevendo no Registrador de Endereços da Memória (REM) o endereço da posição de memória cujo conteúdo deverá ser lido. Em seguida transfere este endereço para o controlador da memória através do barramento de endereços, “aponta” os circuitos internos para a posição de memória correspondente e finalmente transfere seu conteúdo para o Registrador de Dados da Memória (RDM) de onde será copiado para o Registrador de Instruções (RI). Acompanhe o passo da busca da instrução no diagrama esquemático da Figura 3 seguindo as setas azul (que “aponta” o controlador da memória para a posição da MP cujo endereço está contido no PI através do REM) e verde (que transfere o conteúdo desta posição de memória para o RI através do RDM).
Figura 3: Primeiro passo: busca da instrução
|
Figura 1: UCP, MP e FSB |
Ao final deste passo, a instrução que estava na memória foi transferida para o Registrador de instruções.
Examinaremos os demais passos na próxima coluna.
B.
Piropo