             i----------------------------------------------
              RBT      Curso de Assembly      Aula N 02 
             ----------------------------------------------

Por: Frederico Pissarra


i-------------
 ASSEMBLY II 
-------------

    Mais  alguns  conceitos  so  necessrios  para  que  o pretenso
programador ASSEMBLY  saiba  o  que  est  fazendo.   Em  eletrnica
digital  estuda-se  a  algebra  booleana  e  aritimtica com nmeros
binrios.  Aqui esses conceitos  tambm  so  importantes...   Vamos
comear pela aritimtica binria:

    A  primeira  operao  bsica  -   a   soma  -  no  tem  muitos
mistrios...  basta recorrer ao equivalente decimal.  Quando somamos
dois nmeros  decimais,  efetuamos  a  soma  de  cada  algarismo  em
separado,  prestando  ateno  aos  "vai  um"  que  ocorrem entre um
algarismo e outro. Em binrio fazemos o mesmo:

  +---------------------------------------------------------------+
   1010b + 0110b = ?                                             
                                                                 
      111         <- "Vai uns"                                   
       1010b                                                     
     + 0110b                                                     
     ---------                                                   
      10000b                                                     
  +---------------------------------------------------------------+

    Ora, na base decimal, quando se soma - por exemplo - 9 e 2, fica
1 e "vai um"...  Tomemos o  exemplo do odmetro (aquele indicador de
quilometragem do carro!): 09 -> 10 -> 11

    Enquanto  na  base  decimal  existem 10 algarismos (0 at 9), na
base binria temos 2 (0 e 1).  O odmetro ficaria assim:
00b -> 01b -> 10b -> 11b

    Portanto, 1b + 1b = 10b ou, ainda, 0b e "vai um".

    A  subtrao    mais complicada de entender...  Na base decimal
existem os nmeros  negativos...   em  binrio nao!  (Veremos depois
como  "representar" um nmero negativo em binrio!).  Assim, 1b - 1b
= 0b (lgico), 1b - 0b  =  1b  (outra  vez, evidente!), 0b - 0b = 0b
(hehe...  voc deve estar achando que eu estou te sacaneando,  n?),
mas e 0b - 1b = ?????

    A soluo  a  seguinte:  Na  base  decimal quando subtraimos um
algarismo menor de outro maior costumamos "tomar um emprestado" para
que a conta fique correta.  Em binrio a  coisa  funciona  do  mesmo
jeito,  mas  se  no  tivermos de onde "tomar um emprestado" devemos
indicar que foi tomado um de qualquer forma:

  +---------------------------------------------------------------+
   0b - 1b = ?                                                   
                                                                 
       1         <- Tomamos esse um emprestado de algum lugar!   
        0b                            (no importa de onde!)     
     -  1b                                                       
     ------                                                      
        1b                                                       
  +---------------------------------------------------------------+

    Esse "1" que apareceu por mgica  conhecido como BORROW.  Em um
nmero binrio maior basta usar o mesmo artificio:

  +---------------------------------------------------------------+
   1010b - 0101b = ?                                             
                                                                 
        1 1         <- Os "1"s que foram tomados emprestados so 
        1010b          subtrados no proximo digito.             
      - 0101b                                                    
     ---------                                                   
        0101b                                                    
  +---------------------------------------------------------------+

    Faa  a  conta:  0000b   -   0001b,   vai  acontecer  uma  coisa
interessante!  Faa a mesma conta usando um programa, ou calculadora
cientifica,  que  manipule  nmeros binrios...  O resultado vai ser
ligairamente diferente por causa da limitao dos digitos suportados
pelo software (ou calculadora).  Deixo  a  concluso  do  "por  que"
desta diferena para voc...   (Uma  dica,  faa  a conta com os "n"
digitos suportados pela calculadora e ter a explicao!).

i------------------------------------------------------------------
 Representando nmeros negativos em binrio                       
------------------------------------------------------------------

    Um artificio da algebra  booleana  para  representar  um  nmero
interiro  negativo    usar  o ltimo bit como indicador do sinal do
nmero.  Mas, esse  artificio  gera  uma segunda complicao...

    Limitemos esse estudo ao tamanho  de  um  byte (8 bits)...  Se o
bit 7 (a contagem comea pelo bit 0 - mais a direita) for 0 o nmero
representado  positivo, se for 1,  negativo.  Essa   a  diferena
entre um "char" e um "unsigned char" na linguagem C - ou um "char" e
um  "byte"  em  PASCAL (Note que um "unsigned char" pode variar de 0
at 255 - 00000000b at 11111111b  -  e um "signed char" pode variar
de -128 at 127 - exatamenta a mesma faixa, porm um tem sinal  e  o
outro no!).

    A complicao que falei acima   com relao  representao dos
nmeros  negativos.   Quando  um  nmero  no     nagativo,   basta
convert-lo para base decimal que voc saber qual  esse nmero, no
entanto,  nmeros  negativos  precisam ser "complementados" para que
saibamos o nmero que est sendo representado.  A coisa NO funciona
da seguinte forma:

 +----------------------------------------------------------------+
   00001010b   =   10                                            
   10001010b   =  -10     (ERRADO)                               
 +----------------------------------------------------------------+

    No basta "esquecermos" o bit 7  e lermos o restante do byte.  O
procedimento  correto  para   sabermos   que   nmero   est   sendo
representado negativamente no segundo exemplo :

     Inverte-se todos os bits
     Soma-se 1 ao resultado

  +---------------------------------------------------------------+
   10001010b   ->  01110101b + 00000001b   ->  01110110b         
   01110110b   =   118                                           
   Logo:                                                         
   10001010b   =  -118                                           
  +---------------------------------------------------------------+

    Com isso podemos explicar a diferena entre os extremos da faixa
de um "signed char":

     Os  nmeros positivos contam  de 00000000b at 01111111b, isto
      , de 0 at 127.
     Os nmeros negativos  contam  de 10000000b at 11111111b, isto
      , de -128 at -1.

    Em "C" (ou PASCAL), a mesma lgica pode ser aplicada aos "int" e
"long" (ou INTEGER e  LONGINT),  s  que  a  quantidade de bits ser
maior ("int" tem 16 bits de tamanho e "long" tem 32).

    No se preocupe MUITO com a representao de  nmeros  negativos
em binrio...  A CPU toma conta de tudo  isso  sozinha...   mas,  as
vezes,  voc  tem  que  saber que resultado poder ser obtido de uma
operao aritimtica em seus programas, ok?

    As outras duas operaes matemticas  bsicas  (multiplicao  e
diviso) tanbm esto presentes nos processadores 80x86...  Mas, no
necessitamos ver como o processo  feito a nvel binrio.  Confie na
CPU!  :)
