Alguns dias atrás escrevi um texto visando de forma introdutória esclarecer os sistemas numéricos que precisamos conhecer para iniciar nossa jornada pelo mundo da programação Assembly e o resultado não foi tão satisfatório quanto eu almejei. Aqui reescrevo o mesmo conteúdo, mas com outra abordagem para tentar elucidar de uma vez este assunto.

Para mim é importantíssimo que vocês entendam plenamente cada um dos passos, não importa o quanto eu precise me desdobrar para isso.

Sistema numérico decimal: como nós contamos

Para começar, é necessário entender isso: os números são os nomes das quantidades.

A base de um sistema numérico, chamada “base numérica” é a quantidade de símbolos que o sistema possui para representar as quantidades.

O sistema numérico decimal tem esse nome “decimal” derivado do grego: “deca“, que significa 10. A base deste sistema numérico possui 10 símbolos disponíveis para representar as quantidades: 0, 1, 2, 3, 4, 5, 6, 7, 8 e 9.

Por conter 10 símbolos apenas (os números de zero a nove) é chamado decimal.

Desde o número 0 (zero), somando 1 até o limite sempre obtemos o próximo número (desculpem-me pelo óbvio, mas é necessário manter um raciocínio linear). Nesta linha a base numérica de 10 símbolos comporta até 10 quantidades, iniciando em (zero) nenhuma, até a nona (nove). Se somarmos 1, desde o 0 (zero) até o 8 (oito), poderemos representar os números com apenas 1 símbolo:

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

8 + 1 = 9

Mas se somarmos 1 ao último número disponível, como representar a quantidade 10? Usando uma regra sistemática: a numeração recomeça do 0 (zero) e uma casa à esquerda é aumentada.

9 + 1 - novo dígito - casa à esquerda é aumentada

No sistema numérico decimal, ou seja, com 10 números disponíveis apenas, quando o limite 9 é atingido em uma soma de 1, nós zeramos a base e aumentamos uma casa. O conjunto de regras que propiciam as operações sobre os números é chamado “sistema numérico“.

Neste momento isto parece extremamente óbvio e de fato é. Mas tenha calma que isso vai ficar muito complicado. 🙂 (Pelo menos para quem estiver experimentando seu primeiro contato com os outros sistemas numéricos).

Guarde esta regra em sua mente: Numa soma de 1, quando se atinge o número máximo, o 9, ZERAMOS A BASE e AUMENTAMOS UM NOVO DÍGITO, UMA NOVA CASA À ESQUERDA.

9 + 1 = 10

Sistema numérico binário: como o processador conta

Enquanto usamos caneta e papel para escrever, os números decimais nos bastam. Mas e se o meio usado para trabalhar informações fosse outro? E se fossem os recursos da eletrônica?

Em 1939, durante a Segunda Guerra Mundial, nos EUA iniciou-se um projeto que levaria à construção da bomba atômica. O chamado Projeto Manhattan. Neste projeto trabalhavam muitos cientistas, físicos, químicos, engenheiros, arquitetos e matemáticos. A construção de um projeto tão inovador e complexo exigia inúmeros cálculos que precisavam ser facilitados para se tornarem mais rápidos e eficientes, com menor margem de erros. Durante este projeto, um matemático húngaro chamado John von Neumann criou um máquina capaz de realizar cálculos por meios eletro-mecânicos, esta máquina de computar (um computador) foi chamado de Mark I ( lembram-se do nome da primeira armadura do Homem de Ferro? 😀 ). O projeto evoluiu e a eletro-mecânica foi substituída até chegar à eletrônica digital e em fevereiro de 1946 Neumann apresentou o ENIAC (Electronic Numerical Integrator and Computer). O ENIAC, o primeiro computador que funcionava com eletrônica digital estava pronto e apresentado ao mundo e desde então evoluiu até chegar ao smartphone ou notebook que você pode estar usando neste momento.

Essencialmente estas máquinas tem a função de computar dados, durante a segunda guerra os primeiros computadores usados já apresentavam capacidade para realizar 5.000 contas (operações matemáticas) por segundo e sem erros. Estas máquinas foram utilizadas para realizar cálculos balísticos com precisão.

Computar significa calcular e contar.

O computador é uma máquina que foi criada com esta finalidade: calcular e contar.

Agora que sabemos que o computador foi feito para calcular e contar e que ele faz isso por meio da eletrônica e portanto funciona com eletricidade, vamos entender como ele realiza suas atividades de contar e calcular.

Em eletrônica digital existe um conceito chamado “flip-flop” (que estudaremos com profundidade no curso de eletrônica quando chegar a hora certa). O flip-flop acontece quando o circuito recebe cargas de 2 voltagens possíveis: uma carga de voltagem baixa (0,5 volt) ou alta (5 volts) e para cada uma destas duas cargas possíveis registra o resultado como 0 (zero) ou 1 (um).

Se o circuito receber uma carga baixa, de meio volt (0,5 volt), registra 0 (zero).

Se receber uma carga alta, de cinco volts (5 volts), registra 1.

O flip-flop recebe a carga elétrica e armazena o estado que só pode ser 0 ou 1.

A estes 2 resultados possíveis do flip-flop chamamos “dígito binário“. O nome “binário” deriva da mesma origem do nome “decimal“, decimal é originado do grego “deca” que significa 10 e “binário“, também do grego “bi” que significa 2.

O nome “dígito binário” representa o resultado do flip-flop, que só pode ter 2 possibilidades, ou 0 (zero) ou 1.

Em inglês, “dígito binário” se escreve “binary digit” e na computação foi simplificado para “BIT“: BInary digiT.

O flip-flop consiste em gerar um bit.

Um bit é a unidade mínima de informação possível.

Agora que sabemos como o computador lida eletronicamente com a unidade mínima de informação, vamos compará-lo ao nosso sistema numérico decimal.

Já sabemos que pelas limitações da eletrônica, só é possível armazenar 2 estados: 0 e 1.

Sendo possível armazenar apenas 2 estados, temos com isso apenas 2 números possíveis: 0 e 1.

Com apenas 2 números possíveis a “base numérica” (conforme explicada no início do texto) é 2, é uma base binária.

Enquanto nós humanos precisamos apenas pensar para fazer somas, o computador por outro lado precisa de circuitos. Nossos pensamentos não tem composição material, mas os circuitos sim. Nós podemos pedir 1 quilo de circuitos em uma loja de eletrônica, mas não podemos pesar 1 quilo de pensamentos. O pensamento é imaterial, o circuito é material. Podemos tocar um circuito com as mãos, mas não podemos apalpar um pensamento.

Por causa destas limitações, para cada novo dígito que pensamos, nenhum requisito novo nos é requerido, apenas que pensemos.

Por exemplo, se somarmos 9 + 1, apenas com o pensamento obteremos 10. O que significa que sem qualquer mudança física, material, nós conseguimos um novo dígito à esquerda e assim, efetuamos um número ilimitado de cálculos.

Para o computador, quando o limite do circuito que realiza o flip-flop é atingido, se precisarmos de mais um dígito binário, precisaremos de mais um circuito integrado ao anterior.

Com apenas 1 bit, podemos escrever apenas 2 números: 0 e 1.

Se somarmos 1 ao 0 (zero), o resultado será 1. Mas e se somarmos 1 ao 1, como o computador escreverá este número se ele não consegue registrar o número 2 por sua limitação eletrônica?

Conforme explicado no início do texto, em um sistema numérico, quando se atinge o limite de seus números (no caso do decimal é o 9), nós usamos as regras: ZERAMOS A BASE e AUMENTAMOS UM NOVO DÍGITO, UMA NOVA CASA À ESQUERDA ( eu pedi para não esquecer lá no início do texto. 🙂 ).

Como só existem 2 números no sistema binário, o último número é o 1, então o 1 é também o limite. Basta aplicar a regra e fazer como no exemplo abaixo.

1 + 1 - novo dígito - casa à esquerda é aumentada

Uma sequência de somas seria como demonstrada a seguir:

0 + 1 = 1
1 + 1 = 10
10 + 1 = 11
11 + 1 = 100

Se estiver ficando confuso, lembre-se que quem está contando aqui é o computador e ele não conhece (eletronicamente) mais números além do 0 (zero) e do 1, portanto não se trata do número decimal dez (10) e sim de uma sequência “um, zero“. Não se trata do decimal onze (11) e sim de uma sequência “um, um“. Não se trata do decimal 100 (cem) e sim da sequência “um, zero, zero“. Assim sucessivamente: são sequências de zeros e uns.

Talvez o exemplo abaixo te ajude a entender melhor.

binario decimal

Para poder armazenar a quantidade 2, o computador precisa de 2 dígitos, e portanto 2 bits. Neste caso o computador precisa de mais um circuito para poder registrar mais 1 dígito. Para cada novo dígito, um novo bit e para cada novo bit, mais um circuito capaz de realizar o flip-flop.

Os números 0 e 1 precisam de apenas 1 bit para serem representados no sistema binário.

O número 2 decimal, é escrito no sistema binário como 10 (não como “dez“, mas como “um, zero“, uma sequência). Como o número precisa de dois dígitos binários, logo ele possui 2 bits.

Para cada dígito binário, mais um bit é necessário.

Com 1 bit podemos escrever apenas 0 (zero) e 1.

Com 2 bits podemos escrever do 00 (zero, zero)  até o 11 (um, um), que nos decimais representa do 0 (zero) até o 3.

00 = 0
01 = 1
10 = 2
11 = 3

Quanto mais bits mais dígitos. Quanto mais dígitos maiores quantidades podem ser representadas.

Com 3 bits (e portanto 3 dígitos) podemos escrever do 000 (zero, zero, zero) até o 111 (um, um, um).

000 = 0
001 = 1
010 = 2
011 = 3
100 = 4
101 = 5
110 = 6
111 = 7

Com 3 dígitos binários (3 bits) podemos escrever até o número 7 decimal e portanto representar 7.

Se fossem 4 bits (4 dígitos binários) poderíamos escrever do 0000 (zero, zero, zero, zero) até o 1111 (um, um, um, um).

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = 10
1011 = 11
1100 = 12
1101 = 13
1110 = 14
1111 = 15

Os primeiros processadores possuíam registradores eletrônicos de até 4 bits. Eram 4 circuitos de flip-flop atuando em conjunto para armazenar números.

Em Assembly vamos inicialmente manipular registradores de 4 bits. Portanto trabalharemos com estas medidas e é importante que você tenha entendido tudo até aqui, para então avançarmos.

Sistema numérico hexadecimal: como o processador apresenta

Aprendemos como processador conta, mas ele o faz como circuito eletrônico. Se ele fosse nos apresentar os números da mesma forma que conta, não nos teria utilidade alguma, pois seria muito trabalhoso ficar convertendo numeração binária para decimal e decimal para binária manualmente, seria mais fácil então abandonar o computador e voltar ao papel e caneta. O processador usa zeros e uns, nós usamos de zero a nove, não seria nada produtivo trabalhar dessa forma, que exigiria uma terrível adaptação ao sistema binário.

Também aprendemos que um registrador, nas primeiras tecnologias podia carregar até 4 bits em sequência e que com 4 bits podemos escrever até 16 números, de 0 a 15.

Acontece que o computador lê uma entrada de dados por vez, a cada tecla digitada ele lê um número e o registra na memória e isto causou um problema:

Como escrever e ler, 4 bits por vez, sendo que com 4 bits registra-se de 0 (zero) até 15, enquanto nós humanos usamos o sistema decimal que só possui de 0 (zero) até 9?

Alguém poderia dizer: “usando os números 10 até 15”, e pareceria óbvio. Mas não pode ser feito porque se você digitasse “10”, ele leria o número binário “0001” e o gravaria, em seguida leria binário “0000” e o gravaria, desta forma você teria 2 registradores trabalhando e dois números decimais: 1 e 0 (um e zero), ao invés do 10 (dez). Para informar ao processador que estamos digitando os números 10 a 15, em binário, precisamos fazer isso de uma vez só.

Observe o problema:

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = ?
1011 = ?
1100 = ?
1101 = ?
1110 = ?
1111 = ?

A cada 4 bits, podemos escrever e ler 16 números: precisamos então de uma nova base numérica.

Uma base que tenha 16 símbolos ao invés de 10.

A solução encontrada para este problema foi:

  1. Continuar usando os caracteres de 0 (zero) a 9.
  2. Usar letras de A até F para os caracteres de 10 até 15.

Observe a solução:

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = A
1011 = B
1100 = C
1101 = D
1110 = E
1111 = F

Para representar em um único caractere os números de 10 até 15, foram necessárias letras de A até F.

A nova base numérica, com 16 caracteres para representar os números foi chamada de “hexadecimal“, da mesma origem grega, “hexa” significa 6 e “deca” significa 10.

Assim obtivemos o sistema numérico hexadecimal.

A tabela abaixo contém a correspondência da base dos 3 sistemas numéricos:

assembly decimal binário hexadecimal

Com o nascimento desta base numérica para proporcionar uma interação entre o homem e o computador, também o hexadecimal se tornou um sistema.

As regras deste sistema são as mesmas dos anteriores:

Quando se atinge o limite de seus números (no caso do hexadecimal é o F), nós usamos as regras: ZERAMOS A BASE e AUMENTAMOS UM NOVO DÍGITO, UMA NOVA CASA À ESQUERDA. Lembram-se?

A quantidade máxima permitida para ser representa em um único caractere, no sistema decimal é o caractere “9“, no binário é o caractere “1” e no hexadecimal é o caractere “F“.

Com um único caractere, no sistema decimal escrevemos de 0 (zero) a 9, no binário de 0 (zero) a 1 e no hexadecimal de 0 (zero) a F.

Podemos assim representar 10 quantidades no decimal, 2 quantidades no binário e 15 quantidades no hexadecimal.

Vamos então aplicar as mesmas regras de contagem (zerar a base e aumentar um novo dígito, uma nova casa à esquerda) para o hexadecimal:

1 + F - novo dígito - casa à esquerda é aumentada

A contagem fica da seguinte forma:

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

8 + 1 = 9
9 + 1 = A
A + 1 = B
B + 1 = C
C + 1 = D
D + 1 = E
E + 1 = F
F + 1 = 10
10 + 1 = 11

19 + 1 = 1A
1A + 1 = 1B

1E + 1 = 1F
1F + 1 = 20

E assim sucessivamente.

A tecnologia que veio a seguir, acrescentou mais 4 bits ao processador. Assim foi possível registrar 8 bits de cada vez.

Com 8 bits, é possível registrar oito zeros e uns em sequência e contar de “0000 0000” até “1111 1111“, o dobro dos 4 bits de antes.

Portanto, com 8 bits é possível registrar também 2 caracteres hexadecimais de uma vez: de “00” até “FF“.

A esta unidade de 8 bits, deu-se o nome de byte. Portanto 1 byte é uma sequência de 8 bits.

Com 1 byte, ou 8 bits, o computador já conseguia contar de 0 até 255 (“00” até “FF“) e desta forma foi possível melhorar ainda mais a comunicação do homem com o computador: foi criada a tabela ASCII. Esta tabela será um dos próximos assuntos, nos próximos textos, não trataremos dela neste instante. O hexadecimal é importante para o programador apenas, para o usuário final ele não faz qualquer sentido. Para o usuário final, o que importa é a tabela ASCII que falaremos em breve.

O objetivo deste texto foi apenas apresentar os 3 sistemas numéricos, decimal, binário e hexadecimal e entender o seu funcionamento.

As relações se dão no seguinte molde e pelas razões apresentadas abaixo:

assembly - relacionamentos - decimal binário hexadecimal

Isto é o que você precisa ter entendido até aqui: nós, no nosso dia-a-dia usamos o sistema decimal para contar e calcular, o computador como é eletrônico usa o sistema binário. O sistema binário portanto herda do decimal apenas o 0 (zero) e o 1. Acontece que para ser possível uma comunicação entre o homem e o computador, considerando o limite inicial de 4 bits por vez, foi necessário o uso de uma base com 16 símbolos. A esta base chamamos hexadecimal. Usando o hexadecimal podemos ler e escrever conjuntos de 4 bits usando um único caractere.

Esclarecimentos extras:

Uma base numérica, é a quantidade de símbolos e a coleção dos seus caracteres. Observe:

  • A base decimal possui 10 símbolos e seus caracteres são os seguintes: “0, 1, 2, 3, 4, 5, 6, 7, 8, 9“.
  • A base binária possui 2 símbolos e seus caracteres são os seguintes: “0, 1“.
  • A base hexadecimal possui 16 símbolos e seus caracteres são: “0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, F“.

Um sistema numérico por outro lado é a forma como ele funciona com a base numérica, aqui expus uma regra, que serve como exemplo de “sistematização” das bases.

Numa soma constante de “1“, ao atingirmos o limite, no último caractere, nós realizamos os seguintes passos:

  1. Zeramos a base
  2. Aumentamos um novo dígito, uma nova casa à esquerda.

Esta é apenas uma regra usada para contar, mas ao conjunto das regras de contagem chamamos “sistema“.

Espero que tenha ficado claro até aqui.

Testes:

Só avance se for capaz de responder às seguintes questões.

  1. O que significa “base numérica“?
  2. O que significa “sistema numérico“?
  3. Como funciona o sistema decimal?
  4. Como funciona o sistema binário?
  5. Como funciona o sistema hexadecimal?
  6. Por que motivo surgiu o sistema binário?
  7. Por que motivo surgiu o sistema hexadecimal?

Se sozinho você não conseguir respondê-las, não prossiga, tire suas dúvidas até que realmente entenda o assunto e só depois prossiga.

No texto seguinte vamos entrar na aritmética e conversões entre as bases.

Em caso de dúvidas peço que me escrevam sem hesitar: ricardo.roveran@hotmail.com

Assembly – Sistemas numéricos (binário, decimal e hexadecimal) e suas relações: Vídeo aula complementar

Links indicados no vídeo:

Anúncios