Antes de mergulharmos na linguagem de programação Assembly, devemos ter em mente que estaremos conversando diretamente com o processador, a memória RAM e demais dispositivos no mais baixo nível possível: linguagem de máquina.

Toda conversa requer um idioma. Um idioma supõe a existência de caracteres, ou seja, símbolos pré-definidos que sejam capazes de identificar alguma coisa e de regras e limites claros. Nós falamos nossos idiomas, o português, o inglês, o espanhol, etc. No português os caracteres são o alfabeto da letra “a” até a letra “z”, os números são os 10 caracteres que vão de “0” até “9” e ainda contamos com uma série de símbolos como vírgulas, pontos, acentuações e demais.

Os caracteres do idioma do computador são a tabela ASCII (do inglês “American Standard Code for Information Interchange” cuja tradução é “Código Padrão Americano para o Intercâmbio de Informação“), que contém 128 caracteres, símbolos.

tabela ascii

A quantidade de 128 não é por acaso. O motivo é que o processador trabalha com cargas elétricas. Com apenas 2 cargas elétricas. Ele só entende 2 medidas: recebe uma carga de 0,5 volt e entende o número 0 (zero), recebe uma carga de 5 volts e entende 1. Esta operação se chama “flip-flop” e o número que ela armazena é o zero ou o um. Aqui é onde tudo começa, o zero e o um. Zero representa meio volt e significa “desligado”. Um representa 5 volts e significa “ligado”. Isto é um “bit”, o mínimo que um computador consegue trabalhar e onde tudo começa a fazer sentido para o programador.

Com apenas 1 bit, um computador consegue registrar apenas os números 0 e 1. Trabalhando apenas com estes dois números não é possível fazer muita coisa. Para fazer algo maior é necessário trabalhar com mais do que estas duas possibilidades. O que fazer então? Combinar bits.

Antes de sair combinando bits, é necessário ter em mente que um processador só entende estes dois números. Se o limite do processador são estes dois números então temos agora uma base numérica de 2.

Em nosso idioma temos 10 números, vão de 0 até 9: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9. Como temos 10 dedos nas mãos é mais familiar pensar nessa base de 10 números, chamada base decimal.

O processador entende apenas 2 números, que vai de 0 até 1: 0, 1. É como se o coitado tivesse apenas 2 dedos 🙂 .

Se em nosso idioma somarmos 1 a qualquer número partindo do zero, teremos sempre seu próximo:

0 + 1 = 1
1 + 1 = 2
2 + 1 = 3

8 + 1 = 9

E quando chegamos no 9, se somarmos 1, ganharemos mais um caractere ao seu lado, o número 10 precisa de 2 caracteres para ser representado, pois esgotou a capacidade de armazenamento e representação dos números disponíveis. Isto acontece dessa forma no sistema decimal, com 10 números possíveis. E no sistema binário? Como isso acontece? Afinal, o limite é o número 1. Se somarmos mais 1 ao número 1 (1 + 1), como representaremos o 2, se ele não existe? Da mesma forma. Após esgotar o limite da base numérica, a representação ganha mais um caractere ao lado.

0 + 1 = 1
1 + 1 = 10
10 + 1 = 11
11 + 1 = 100
101 + 1 = 101
110 + 1 = 110

E assim por diante. Num sistema numérico de base binária, ou seja, com apenas dois caracteres disponíveis as representações de quantidades (os números) só poderiam ser apresentadas em sequências de zeros e uns.

Aqui temos um problema: se o processador só consegue trabalhar com zero e um para representar as cargas elétricas de meio volt e cinco volts, então só poderá representar ou o zero, ou o um e não poderá fazer nada além disso. Como solucionar este problema? Como romper esta barreira?

Voltando ao assunto que havíamos parado há pouco: Combinando bits.

Agora sim vamos combiná-los em uma sequência.

Os primeiros processadores conseguiam registrar até 4 bits em sequência e os números podiam ser escritos desde o “0000” até o “1111”. O que possibilitava escrever de zero até quinze, um total de 16 números.

Assim, aumentando o número de bits em um registrador, de 1 para 4, conseguimos representar 16 números em sequências de 0 e 1. E se o processador conseguia representar 16 números por vez, é como se ele tivesse duas mãos com 8 dedos cada, agora ele tinha 16 dedos.

Acontece que no nosso sistema decimal, os números vão de 0 a 9, e podemos representar com isto apenas 10 quantidades, de nenhuma (zero) até a nona (nove). Como representar em um único caractere cada número que sobra do 10 até o 15? Usando letras do nosso alfabeto. As letras A, B, C, D, E e F.

Decimal
(Nós contamos)
Binário
(Processador conta)
Hexadecimal
(Processador apresenta)
0 0 0
1 1 1
2 10 2
3 11 3
4 100 4
5 101 5
6 110 6
7 111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F

Isto acontecia para os processadores mais antigos cujo registradores tinham apenas 4 bits, ou seja, conseguiam registrar até zeros ou uns em uma sequência. Esta representação de 4 bits que necessitou das letras A até F para expressar os números inaugurou na computação a base numérica 16, assim chamada de “hexadecimal”: hexa = 6, decimal = 10.

Pouco tempo depois (estamos falando de quando os dinossauros lutavam com os meteoros 🙂 ) alguém combinou mais um registrador de 4 bits e a este conjunto de 8 bits (dois registradores de 4 bits cada), chamamos byte. Nascia a unidade de medida que usaríamos para limitar e medir o mundo dos códigos nos computadores.

0000 0000 (8 bits, isto é um byte).

Se num registrador de 4 bits podíamos escrever de 0 até F (0 até 15), em dois registradores combinados podemos escrever de 0 até FF (0 até 255).

A tabela ASCII apresentada lá no começo do texto, trata de um código binário (cadeias de bits: 0’s e 1’s, sequências de zeros e uns). É a ferramenta, o recurso, que o computador tem para que nos comuniquemos com ele.

Este texto foi apenas introdutório. No próximo texto, vou iniciar a aritmética com estas bases numéricas, como convertê-las para representação.

Em caso de dúvidas escrevam para meu e-mail: ricardo.roveran@hotmail.com

Um abraço. 🙂

Anúncios