
          ͻ
                    Tutorial de Assembler de Adam Hyde 1.0        Ŀ
                                                                   
                                   PARTE I                         
                      Traduzido por Renato Nunes Bastos            
          ͼ 
            


Verso   :  1.2
Data     :  16-02-1996
Contato  :  blackcat@vale.faroc.com.au
            http://www.faroc.com.au/~blackcat
;Renato  :  bastos@lci.ufrj.br
            krull@geocities.com
            http://www.geocities.com/SiliconValley/Park/3174

 

 O que  Assembler?
--------------------

Assembler conseguiu ser uma das minhas linguagens favoritas para trabalhar.
No que seja uma linhguagem fcil no incio, mas quando voc fica familiar
com ela, voc entende o quo lgica ela .

Assembler  uma linguagem de baixo nvel, que voc pode usar em seus programas
para acelerar tarefas lentas. Basicamente ela consite de sentenas que
representam instrues em linguagem de mquina, e, como ela est prxima
ao cdigo de mquina, ela  rpida.

H muito tempo atrs, quando o 8086 apareceu (sim, existiam humanos na Terra
nessa poca :), programar  no era uma tarefa fcil.  Quando os primeiros
computadores foram desenvolvidos, a programao tinha que ser feita em cdigo
de mquina, que _no_ era uma tarefa fcil, e assim o Assembler nasceu.


 Por que us-lo?
-----------------

Como eu disse antes, Assembler  veloz. Ele tambm permite a voc falar com
a mquina a nvel de hardware, e lhe d muito maior controle e flexibilidade
sobre o PC. Uma das outras vantagens do Assembler  que ele permite a voc
impressionar seus amigos com pginas de cdigo aparentemente incompreensvel.
No est vendo eles aglomerados em volta de voc e impressionados/rindo
de sua nerdeza?   :)


 Como este tutorial apareceu?
------------------------------

Bem, Eu tinha uma dupla de amigos que queriam aprender Assembler para acelerar
seus programas em Pascal, ento eu dei-lhes alguns Tutoriais de Assembler que eu
tinha. Como esses tutoriais tinham toda a informao que voc precisaria, eles
no foram escritos para os principiantes entenderem facilmente, ento, decidi
escrever meu prprio.

Se voc est usando este tutorial e o acha til e informativo, ento, por
favor escreva para mim.



 LIO 1 - Registradores
--------------------------

Quando voc est trabalhando com Assembler, voc tem que usar registradores.
Voc pode imagin-los como sendo variveis j definidas para voc. Os mais
comuns esto listados abaixo:

    AX   - o acumulador.  Compreende AH e AL, os bytes alto e baixo
            de AX.  Comumente usado em operaes matemticas e de E/S.

    BX   - a base.  Compreende BH e BL.  Comumente usado como uma base ou
            registrador apontador.

    CX   - o contador.  Compreende CH e CL.  Usado frequentemente em loops.

    DX   - o deslocamento, similar ao registrador de base.  Compreende DH
            e DL. Acho que voc est pegando o esprito da coisa agora.

Estes registradores so definidos como registradores de uso geral pois podemos
realmente armazenar qualquer coisa que quisermos neles. So tambm
registradores de 16 bits, o que significa que podemos armazenar um inteiro
positivo de 0 a 65535, ou um inteiro com sinal de -32768 to 32768.

Incidentalmente, o assunto do alto e do baixo byte destes resgistradores
causou muita confuso no passado, logo, tentarei dar alguma explicao aqui.
AX tem um intervalo de 0 at FFFFh. Isto significa que voc tem um intervalo
de 0 at FFh para AH e AL.  (Se sabe pouco sobre hexadecimal, no se
preocupe. O prximo tutorial vai falar sobre ele.)

Agora, se ns tivermos que armazenar 0A4Ch em AX, AH conter 0Ah, e AL conter
4Ch.  Sacou?  Este  um conceito muito importante, e eu falarei sobre ele
mais profundamente no prximo tutorial.


Os registradores de segmento:  - ta da!

Estes so outros registradores que ns no vamos ver nos primeiros tutorias, 
mas vamos v-los em maior profundidade mais tarde. Eles so imensamente teis,
mas podem ser tambm perigosos.

    CS - o segmento de cdigo. O bloco de memria onde o cdigo  armazenado.
          NO brinque com esse, a menos que saiba o que est fazendo.

    DS - o segmento de dados. A rea na memria onde os dados so armazenados.
          Durante operaes de bloco, quando grandes blocos de dados so movidos,
          este  o segmento a que a CPU comumente se refere.

    ES - o segmento extra. Apenas outro segmento de dados, mas este 
          comumente usado quando se quer acessar o vdeo.

    SS - no, no  o exrcito alemo.  o segmento de pilha, em que a
          CPU armazena endereos de retorno de subrotinas. Tome cuidado com
          ele.  :)

Alguns outros que voc vai comumente usar:

    SI - o ndice de fonte. Frequentemente usado para movimentaes de blocos
          de instrues. Este  um ponteiro que, com um segmento, geralmente
          DS,  usado pela CPU para leitura.

    DI - o ndice de destino. Novamente, voc o usar muito. Um outro
          ponteiro que, com um segmento, geralmente ES,  usado para escrita
          pela CPU.

    BP - o apontador da base, usado em conjunto com o segmento de pilha. Ns
          no vamos us-lo muito.

    SP - o apontador da pilha, comumente usado com o segmento de pilha. NO 
          brinque com isso de jeito nenhum.  :|

Por enquanto voc deveria saber o que so registradores. H outros
registradores tambm, e coisas conhecidas como flags, mas ns no iremos 
a eles agora.


 

COISAS PARA FAZER:

 1) Aprender os vrios registradores de cor.
 2) Arrumar uma calculadora que suporte hexadecimal - ou pelo menos uma
    tabela ASCII. Isso cobre 0 - 255, ou, de 0h a FFh.


 

 LIO 2 - O conjunto de instrues do 8086:
----------------------------------------------

Okay, ento voc j aprendeu sobre registradores, mas, como us-los,
e como se codifica em Assembler? Bem, primeiro voc precisa de algumas
instrues. As seguintes instrues podem ser usadas em todas as CPU's
do 8086 para cima.

    MOV <dest>, <valor> - MOVE. Esta instruo permite MOVER um valor
                           para uma posio na memria.

                           Ex.: MOV AX, 13h

                           Isso deveria mover 13h (19 em decimal) para o
                           registrador AX. Logo, se AX valia antes 0, ele
                           agora seria 13h.

                           ISSO APENAS MOVE UM VALOR PARA UM REGISTRADOR,
                           NO FAZ NADA MAIS.

                           Ex.: (Em Pascal) AX := $13;

    INT <nmero>        - INTERRUPO. Esta instruo gera uma interupo.
                           Voc pode pensar nisso como sendo quase uma
                           procedure.

                           Ex.: INT 10h

                           Geraria a interrupo 10h (16 em decimal). Agora, 
                           o que isso faria depende do contedo do registrador
                           AH, entre outras coisas. Por exemplo, se AX = 13h
                           e a interrupo 10h foi gerada, o vdeo seria
                           colocado no modo 320x200x256.

                           Mais precisamente:

                           AH seria igual a 00  - seleciona a subfuno do
                                                  modo, e
                           AL seria igual a 13h - modo grfico 320x200x256.

                           Contudo, se AH = 2h, e a interrupo 16h foi
                           gerada, isso instruiria a CPU para checar se
                           alguma tecla pressionada est no buffer do
                           teclado.

                           Se AH = 2h, e BH = 0h e a interrupo 10h foi
                           gerada, ento a CPU moveria o cursor para a
                           posio X em DL e posio Y DH.

                           NO SE PREOCUPE COM ISSO POR ENQUANTO! NS
                           FALAREMOS NISSO MAIS TARDE, COM MAIS DETALHES.

    ADD <dest> <valor>  - ADICIONA. Esta instruo soma um nmero ao valor
                           armazenado em dest.

                           Ex: MOV AX, 0h  ; AX agora  igual a 0h
                               ADD AX, 5h  ; AX agora  igual a 5h
                               ADD AX, 10h ; AX agora  igual a 15h

                           Bem simples, no?

    SUB <dest> <valor>  - SUBTRAI. Acho que d pra voc adivinhar o que isso
                           faz.

                           Ex: MOV AX, 13h  ; AX agora  igual a 13h  (19 dec)
                               SUB AX, 5h   ; AX agora  igual a 0Eh  (14 dec)

    DEC <registrador>   - DECREMENTA algo.

                           Ex: MOV AX, 13h  ; AX agora  igual a 13h
                               DEC AX       ; AX agora  igual a 12h

    INC <registrador>   - INCREMENTA algo.

                           Ex: MOV AX, 13h  ; Adivinha...
                               INC AX       ; AX = AX + 1

    JMP <posio>       - PULA para uma posio.

                           EG: JMP 020Ah    ; Pula para a instruo em 020Ah
                               JMP @MyLabel ; Pula para @MyLabel.

                           NO SE PREOCUPE SE ISTO  UM POUCO CONFUSO - VAI 
                           FICAR PIOR! H OUTRAS 28 INSTRUES JUMP PARA
                           APRENDER, TALVEZ MAIS. FALAREMOS NELAS MAIS TARDE.

    CALL <procedimento> - CHAMA uma subfuno.

                           EG: Procedure MyProc;

                               Begin   { MyProc }
                                  { ... }
                               End;    { MyProc }

                               Begin   { Main }
                                  Asm
                                     CALL MyProc   ; Adivinha o que isso faz!
                                  End;
                               End.

                           Ou: CALL F6E0h  ; Chama subfuno em F6E0h

    LOOP <rtulo/label> - Faz LOOPS (repetio) durante um certo tempo.

                           EG: MOV CX, 10h  ; Isto  o porque de CX ser
                                            ; chamado de  registro CONTADOR.
                                            ; 10h = 16

                               @MyLabel:

                               ; alguma coisa
                               ; mais coisa

                               LOOP @MyLabel   ; At que CX = 0
                                               ; Note: CX  decrementado
                                               ; a cada vez. No decremente-o
                                               ; voc mesmo (DEC CX).

                           ; ISSO DEVERIA SE REPETIR 16 vezes - i.e., 10
                             em hexadecimal.

    LODSB               - Carrega um byte
     LODSW               - Carrega uma word
     STOSB               - Armazena um byte
     STOSW               - Armazena uma word

     Estas instrues so usadas para pr ou conseguir algo numa posio na
     memria.  O registrador DS:SI, (lembra que ns falamos sobre isso antes,
     sobre SI ser o ndice de fonte?),  aponta para a localizao de onde
     queremos obter os dados, e DS:DI aponta para onde colocaremos informaes.

      claro, no somos obrigados a usar DS - poderia ser ES por exemplo.
     Meu procedimento PutPixel colocar um byte em ES:DI.

     De qualquer modo, imagine que temos a seguinte configurao na memria:

     Posio na memria  06  07  08  09  10  11  12
     
     Valor               50  32  38  03  23  01  12

     Quando ns usamos LODSB ou STOSB, ele retorna ou pega um nmero de AL.
     Assim, se DS:SI apontava para 07 e executssemos uma instruo LODSB,
     AL seria agora igual a 32.

     Agora, se ns apontssemos DS:DI para 11, colocando, diria, 50 no
     registrador AL, e executasse STOSB, ento teramos o seguinte resultado:

     Posio na Memria  06  07  08  09  10  11  12
     
     Valor               50  32  38  03  23  50  12

     OBS.:  Quando usamos LODSB/STOSB, usamos AL. Isto porque estaremos
            mexendo com um nmero de 8 bits (um byte), apenas. Podemos
            armazenar um nmero de 8 bits em AL, AH, ou AX, mas no podemos
            armazenar um nmero de 16 bits em AH ou AL porque eles so
            REGISTRADORES DE 8 BITS.

            Como resultado, quando usarmos LODSW ou STOSW, ns devemos usar
            AX e no AL, j que estaremos pegando/colocando um nmero de
            16 bits.


    MOVSB - Move um byte
     MOVSW - Move uma word

     Como exemplo vamos pegar um byte de DS:SI e mand-lo para ES:DI.

     Em DS:SI:

     Posio de Memria  06  07  08  09  10  11  12
     
     Valor               50  32  38  03  23  50  12


     Em ES:DI:

     Posio de Memria  06  07  08  09  10  11  12
     
     Valor               10  11  20  02  67  00  12

     Se apontarmos DS:SI para a posio 07, apontarmos ES:SI para a posio
     11 e executarmos MOVSB, o resultado em ES:DI pareceria com:

     Em ES:DI:

     Posio de Memria  06  07  08  09  10  11  12
     
     Valor               10  11  20  02  67  32  12


     ESPERO QUE VOC PEGUE A IDIA GERAL. CONTUDO,  CLARO, NO  TO SIMPLES.
     POSIES DE MEMRIA NO SO ARRUMADOAS EM FORMA DE ARRAY, EMBORA EU
     DESEJASSE MUITO QUE FOSSEM. QUANDO FOR MOVER/PEGAR/COLOCAR, VOCE ESTAR
     MEXENDO COM UMA POSIO TAL COMO: 100:102H. AINDA ASSIM, VOC DEVERIA
     PEGAR A IDIA.

    REP - REPETE o nmero de vezes especificado no registrador CX.
           Um REP na frente de um MOVSB/LODSB/STOSB causaria a repetio da
           instruo. Logo:

           Se CX = 5, e
           se ES:DI apontava para 1000:1000h,

           ento REP STOSB armazenaria o que estava no  registrador AL na
           posio 1000:1000h 5 vezes.

COISAS A FAZER:

1) Memorizar todas as instrues acima - no  to difcil assim e no h tantas
   l.

2) Tenha certeza que voc entendeu a teoria por trs delas.


 

                             NA PRXIMA SEMANA:
                            ----------------------

            Hexadecimal e o que  isso.

            Segmentos e offsets (deslocamentos) - ns falamos nisso nesse
             tutorial.

            Mais algumas instrues.

            Alguns programas de exemplo, e cdigo que voc pode usar
             em seus programas.

             Talvez um PutPixel, ClrScr, algo que eu ache til.

Se voc deseja ver um tpico discutido em um tutorial futuro, ento escreva-me,
e eu vou ver o que eu posso fazer.


 

No perca!!!  Baixe o tutorial da prxima semana na minha home-page:

   http://www.faroc.com.au/~blackcat
   http://www.geocities.com/SiliconValley/Park/3174


- Adam.   " Essa noite no, querida - eu tenho um modem. "
- Renato Nunes Bastos
