Programar em Assembly com GAS/Sistemas numéricos

Sistema decimal editar

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 editar

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 editar

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 editar

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 editar

Sistema hexadecimal editar

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 editar

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 editar

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 editar

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.