Micro Cosmo
Volte
13/11/95

< Que Tal Um Programinha? >


Para resolver nosso pequeno mistério vamos apelar para duas importantes noções que já fazem parte do nosso cabedal de conhecimentos: o que é memória ROM e como os programas são executados. Reavivemos, pois, nossas lembranças.

Memória é um circuito eletrônico onde informações podem ser armazenadas sob a forma de bytes e lidas pelo microprocessador, ou CPU. E memória ROM, de “Read Only Memory”, ou memória apenas de leitura, é um tipo de circuito que não permite alterar os bytes que armazena - ao contrário da memória RAM, de “Random Access Memory”, cujos dados podem ser lidos e modificados pela CPU. A memória RAM, portanto, é mais flexível. Em contrapartida, precisa de energia elétrica para manter a integridade dos dados que armazena: ao se desligar a máquina, todo o conteúdo da memória RAM é perdido. Já a memória ROM, embora não permita alterar as informações que contém, é capaz de preservá-las mesmo sem energia. Em outras palavras: o conteúdo da memória ROM é gravado “de fábrica” e jamais se perde, mesmo ao se desligar o micro.

A memória, seja RAM ou ROM, só pode armazenar informações sob a forma de bytes. Essas informações, como já vimos, podem ser dados ou instruções que a CPU “sabe” executar. E um programa nada mais é que um conjunto de instruções encadeadas.

Cada byte ocupa uma “posição” de memória. Para que a CPU possa encontrar as informações armazenadas na memória, sejam elas instruções ou dados, cada posição de memória está associada a um número. Esse número chama-se “endereço” de memória. A primeira posição de memória assume o endereço zero e as demais são numeradas seqüencialmente. Portanto, para encontrar uma informação na memória, basta conhecer seu endereço. Note que tanto faz ser a memória RAM ou ROM: tanto em um caso quanto em outro, cada byte ocupa uma posição de memória e cada posição corresponde a um único endereço. Conhecido o endereço, a CPU vai até ele e lê a informação, seja em um chip de memória RAM, seja em um chip de memória ROM.

Além das posições de memória externas que podem ser acessadas por ela, a CPU tem posições de memória internas denominadas registradores. Nelas, bytes podem ser copiados de e para a memória e modificados pela própria CPU. Ao contrário das posições de memória externas, que nas máquinas modernas contam-se aos milhões (quantos Mb de memória RAM tem sua máquina?), os registradores são pouquíssimos. Seu número depende do tipo da CPU. Por exemplo: o microprocessador 8088, a CPU do primeiro PC, tem catorze registradores de dezesseis bits (ou dois bytes) cada.

Os registradores são posições de memória tão especiais que não têm endereço: têm nome. Um deles, como já vimos, chama-se IP, de Instruction Pointer, ou ponteiro de instruções. Outro chama-se CS, de Code Segment ou segmento de código. Combinando- se os dois (para ser exato: multiplicando-se o conteúdo de CS por dezesseis e somando-se o resultado com o conteúdo de IP), obtém-se um endereço de memória. Por essa razão diz-se que o IP (combinado com o CS) “aponta” para um endereço de memória.

Pois bem: seja qual for a situação da máquina e aconteça o que estiver acontecendo, esse endereço de memória armazena a próxima instrução a ser executada pela CPU. E depois que ela é executada, o IP soma uma unidade ao seu conteúdo, ou seja, aponta para o endereço seguinte. Como um programa nada mais é que uma série encadeada de instruções, para executar um programa inteiro basta transportar seu conjunto de instruções para a memória e “apontar” o IP (e o CS) para a primeira instrução (ou seja: escrever no IP e CS o endereço da posição de memória ocupada pela primeira instrução). Esse procedimento denomina-se “carregar um programa na memória”, ou simplesmente “carregar um programa”.

Embora as ações essenciais sejam exatamente as que foram descritas aí em cima, na verdade a coisa é um pouco mais complicada. Por exemplo: do jeito que foi descrito, toda vez que fosse carregado, o mesmo programa executaria sempre a mesma seqüência de instruções na mesma ordem. Mas você sabe que programas podem modificar seu comportamento (e portanto executar um conjunto de instruções diferente) conforme a vontade do usuário, obedecendo a comandos via teclado ou seleções em menus. Como isso pode acontecer? Ora, é simples: dentre as instruções que compõem um programa, há algumas capazes de alterar o conteúdo do próprio IP (e CS). Ou seja: a próxima instrução a ser executada (e as seguintes, evidentemente) pode ser alterada conforme a vontade do usuário (tecnicamente, diz-se que o comando emitido pelo usuário alterou o fluxo do programa).

Pronto. Agora você já sabe tudo o que precisa para descobrir como sua máquina começa a executar um programa no justo momento em que é ligada, mesmo sem que nada nem ninguém tenha carregado esse programa na memória.

Pense um pouco e veja se descobre até a semana que vem.

B. Piropo