Sítio do Piropo

B. Piropo

< PC@World >
Volte
11/1997

Endereços

 

Quem vem acompanhando esta série de colunas com atenção, talvez esteja encafifado com um probleminha. Seguinte: quando discutimos a lógica temporizada utilizada nos nossos micros, aprendemos como os dados trafegam entre CPU e memória. Mas no nosso estágio de conhecimento temos perfeita consciência que "memória", neste contexto, é um termo um tanto vago. Mesmo nos tempos do velho 8088 que usamos como exemplo na discussão da lógica temporizada e transferia dados um byte de cada vez, a memória podia armazenar mais de um milhão de bytes (nos micros modernos, são dezenas de milhões). E não faz sentido guardar um dado na memória se ele não puder ser encontrado mais tarde (do contrário, ela não mereceria o nome e ao invés de memória se chamaria "vaga lembrança"). Então, não basta dizer que o dado foi transferido para a memória. É preciso ainda saber exatamente onde, na memória, este dado foi armazenado. Como resolver esta questão?

Na discussão do problema, por amor à simplicidade, usemos ainda como exemplo o velho 8088, a CPU do primeiro PC da IBM. Por questões ligadas às suas características internas, ele tinha uma limitação: não podia manejar memória superior a 1 Mb. Ou seja: micros que usavam o 8088 podiam armazenar no máximo 1.048.576 bytes (1 Mb). Relativamente pouco, se comparado aos micros de hoje em dia, mas ainda assim um número respeitável. Se você não soubesse exatamente onde procurar, achar um dado perdido entre mais de um milhão de outros seria tão difícil quanto achar agulha em palheiro.

Então, adotou-se a seguinte convenção: dividiu-se a memória em compartimentos, de tal forma que em cada um coubesse um byte. Estes compartimentos receberam o nome de "posições de memória" e foram ordenados seqüencialmente. Em seguida, atribuiu-se um número a cada posição de memória. Em micros que usavam a CPU 8088, a primeira posição recebeu o número zero e a última o número 1.048.575. E estes números receberam os nomes de "endereços" de memória. Desta forma, cada posição de memória pode ser identificada da mesma forma que se identificam as casas de uma cidade: pelo seu endereço.

Isto feito, acrescentou-se aos circuitos eletrônicos que controlam o fluxo de dados na placa-mãe um conjunto especificamente para controlar endereços. E aos oito condutores elétricos (ou "linhas") do barramento destinadas à transportar dados, acrescentaram-se as linhas necessárias para o transporte dos endereços (já veremos porque endereços precisam ser "transportados"). No caso do 8088, que pode administrar um conjunto de 1 Mb de posições de memória, são necessárias vinte linhas para os endereços. E é fácil entender porque: o conjunto de linhas deve permitir transportar o maior endereço possível, no caso 1 Mb, um número que expresso em binário ocupa vinte algarismos, ou dígitos binários (bits). Como cada linha é responsável por um bit, o total de linhas necessárias é vinte. Diz-se, então, que o "barramento de endereços" de um micro cuja CPU é um 8088 tem vinte linhas. São as chamadas "linhas de endereçamento".

Pronto. Agora já podemos entender como a coisa funciona.

Quando discutimos a lógica temporizada, eu disse que os dados são enviados da CPU para a memória sucessivamente, obedecendo aos ciclos de operação do micro, um dado a cada ciclo. Hoje confesso, humildemente, que menti. Por uma causa justa, é verdade: menti por amor à didática, pois achei que aquele momento não era propício para acrescentar uma complicação desnecessária. Mas agora que já entendemos o processo, posso me redimir do feio pecado da mentira e reconstituir a verdade: nem todo ciclo é usado para transportar dados. Apenas ciclo sim, ciclo não. Pois não basta transportar o dado: é preciso ainda saber exatamente para onde ele será transportado. E o ciclo "não" é destinado justamente a este fim.

Explicando melhor: imagine que por exigência de um programa qualquer, a CPU recebeu a instrução de depositar um byte na memória. Como este byte corresponde a um dado que necessariamente será utilizado mais tarde (do contrário não haveria necessidade de armazená-lo), é preciso saber exatamente onde ele será guardado. Portanto, ao executar o transporte para a memória, a CPU determina o endereço no qual aquele dado será armazenado. E, imediatamente antes de enviar o dado, coloca os bits correspondentes a este endereço nas vinte linhas do barramento de endereços (faz isto, evidentemente, do mesmo modo que coloca os dados nas oito linhas do barramento de dados: aplicando, durante um ciclo de operação, um pulso de tensão positiva nas linhas correspondentes aos bits "um"). Esta informação (o endereço) é capturada pelo circuito controlador de endereços, que "aponta" o barramento de dados para a posição de memória correspondente. E somente então, no ciclo de operação seguinte, o dado é posto no barramento de dados. Que, por já estar ligado ao endereço correto, deposita o byte rigorosamente no devido destino.

Pronto: agora já dá para entender porque os dados não se perdem na memória. Imagine que a CPU inicie o processo de depositar cem mil bytes sucessivos na memória. No primeiro ciclo, a CPU emite os pulsos de corrente correspondentes ao endereço do primeiro byte pelas vinte linhas do barramento de endereços. No ciclo seguinte, a CPU emite os pulsos correspondentes ao byte pelas oito linhas do barramento de dados, transferindo-o assim para o devido endereço. Este procedimento é então repetido até que o último byte seja transferido. Se o processo não for interrompido, após duzentos mil ciclos os cem mil bytes serão transferidos. E cada um exatamente para seu endereço.

Evidentemente, para ler os dados da memória, o processo é repetido no sentido inverso. A CPU envia o endereço da posição de memória que armazena o byte pelo barramento de endereços. Este endereço é capturado pelo circuito controlador de endereços, que "aponta" para a posição de memória correspondente. No próximo pulso, a CPU verifica o estado daquela posição de memória, atribuindo o valor "um" aos bits onde encontrou uma carga positiva, zero aos que correspondem a uma carga nula. E assim os dados transitam entre CPU e memória.

 

B. Piropo