Programar em Assembly com GAS/Sistemas numéricos
Sistema decimal
Vamos falar um pouco sobre o sistema decimal porque normalmente todos o conhecemos. Por ser o primeiro sistema de numeração que aprendemos na infância é mais fácil deixar claro com um ou dois exemplos. Então vamos lá, no sistema decimal usamos números de 0 a 9 e um sistema de base 10 por ser constituído de dez dígitos.
No sistema decimal os dígitos menos significativos são posicionados do lado direito e os de maior importância do lado esquerdo. Veja o numero 501 o dígito 5 que está do lado esquerdo é mais importante do que o dígito 1. Mas se o número do lado esquerdo for 0 o valor não muda.
Vamos examinar um exemplo:
Vamos decompor 501 multiplicando cada dígito por 10 como são números de base 10. Também vamos ordenar esse número partindo da direita para esquerda. Exemplo: 5=2, 0=1 , 1=0. E vamos colocar esses números de posições como expoentes dos nossos multiplicadores.
Digito*Base n° ordem
501 = 5*102 + 0*101 + 1*10° 10.000 = 1*104 + 0*103 + 0*102 + 0*101 + 0*100
Sistema binário
Agora que vimos o sistema decimal vamos complicar um pouco. De um lado uma máquina super complexa mais muito lenta para calcular "seres humanos". De um outro uma máquina capaz de executar milhões de instruções por segundo. Mais só entende duas coisas.
- Presença de energia ou 1
- Ausência de energia ou 0
Como só precisamos trabalhar com 2 dígitos, 1 e 0, usamos o sistema binário ou de base 2. Em informática 0 ou 1 são chamados de bit (binary unit) ou unidade binária.
Binário a decimal
Vamos analisar então um byte que é igual a 8 bits.
- Byte 10010011
Para passar este valor a decimais vamos usar o mesmo algoritmo que usamos com os decimais mais agora em base 2.
10010011= 1*27+0*26+0*25+1*24+0*23+0*22+1*21+1*20
128+16+2+1 = 147 Decimal
Ajuda memória:
a0 = 1 a1 = a
Decimal a binário
Este método é relativamente fácil. Consiste em dividir sucessivamente o número decimal em 2. E dependendo do resultado colocar o valor par ou ímpar colocamos "1" ou "0" na coluna de binários.
Aqui tudo o que nos interessa é o resultado.
- Cada vez que o decimal for ímpar colocamos 1 do lado binário.
- Cada vez for par colocamos 0.
- Cada vez que o numero for ímpar restamos 1 para facilitar a divisão.
Passar o numero 147 decimal em binários.
Decimal Binário ímpar 147-1/2 -> 1 ímpar 73-1/2 1 par 36/2 0 par 18/2 0 ímpar 9-1/2 1 par 4/2 0 par 2/2 0 ímpar 1/2 1 = 10010011
Formamos o numero binário usando os dígitos da coluna "Binário" na ordem de baixo para cima.
Então um byte vai de 0 a 255 decimal .
Decimal Binário 255-1/2 1 127-1/2 1 63-1/2 1 31-1/2 1 15-1/2 1 7-1/2 1 3-1/2 1 1/2 1 11111111 Binário = 255 Decimal Isto quer dizer que com 1 byte ou xxxxxxxx Binário Aonde cada x e 0 ou 1 . Podemos formar 256 combinações diferentes.
Se você ainda não entendeu vou mostrar a divisão com um exemplo desorganizado. O número decimal é dividido em 2 e o resultado será divido novamente. O número 147 dividido 2 o resultado 73 e sobra 1. E o resultado será dividido novamente. E o resultado é constituído da mesma maneira que nos exemplos anteriores.
147 |_2 -146 73 |_2 1 -72 36 |_2 1 -36 18 |_2 0 -18 9 |_2 0 -8 4 |_2 1 -4 2 |_2 0 -2 1 0 = 10010011
Sistema octal
Sistema hexadecimal
O sistema hexadecimal é um sistema de numeração em base 16, este sistema de numeração usa os dez algarismos indo-arábicos para os seus dez primeiros dígitos e letras de "A" a "F" para os seis outros.
Um número que começa com "0x" em assembly trata-se de um número hexadecimal.
- Demostração
- 0 1 2 3 7 5 6 7 8 9 A B C D E F
Cada um dos dígitos deste sistema corresponde exatamente a quatro bits F = 1111. Utilizado por primeira vez em 1956 com a máquina Bendix G-15.
O sistema hexadecimal foi comercializado por primeira vez no ano 1963 pela empresa IBM. A notação hexadecimal é mais compacta do que a notação binária, por utilizar quatro vezes menos de dígitos. Tabela de conversões:
Binario | Hexadecimal | Decimal |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | A | 10 |
1011 | B | 11 |
1100 | C | 12 |
1101 | D | 13 |
1110 | E | 14 |
1111 | F | 15 |
Hexadecimal a decimal
No sistema hexadecimal em base 16 para passar a decimal usamos o mesmo princípio que vimos no primeiro exemplo com decimais. Ou seja, dando uma ordem para os números hexadecimais partindo da direita para a esquerda. E vamos colocar esses números de posições como expoentes dos nossos multiplicadores.
Vamos ver um exemplo com o numero 95 hexadecimal :
Digito*Base n° ordem
0x95 = 9*161 + 5*160 = 149 Decimal
144 + 5 = 149
Binário a hexadecimal
Para passar de binários a hexadecimal vamos fazer o seguinte:
- Dividir o binário em grupos de 4 bits partindo do primeiro bit do lado direito.
- E se o grupo não contem 4 dígitos completamos com zeros.
- Para formar o valor hexadecimal comparamos os grupos com a tabela.
Exemplo com o numero binário 1111011001.
1001 = 9 Partindo do primeiro 1 que está do lado direito 1101 = D 11 Vamos completar com zeros a esquerda 0011 = 3 Resultado partindo de cima para baixo = 0x9D3 hexadecimal
1111011001=0x3D9
Hexadecimal a binário
Para passar de hexadecimal a binário usamos o mesmo exemplo acima. Mais agora separamos o número hexadecimal e comparamos com a tabela.
Exemplo numero 9D3 Hexadecimal
9 = 1001 D = 1101 3 = 0011 -> 0011 1101 1001 = 001111011001 Binário
Para formar o resultado alinhamos os números partindo de baixo para cima.