You are on page 1of 7

ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º Tutorial de Assembler de Adam Hyde 1.

0 ÇÄ¿ º º ³ º PARTE I º ³ º Traduzido por Renato Nunes Bastos º ³ ÈÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Versão : 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. Não que seja uma linhguagem fácil no início, mas quando você fica familiar com ela, você entende o quão lógica ela é. Assembler é uma linguagem de baixo nível, que você pode usar em seus programas para acelerar tarefas lentas. Basicamente ela consite de sentenças que representam instruções em linguagem de máquina, e, como ela está próxima ao código de máquina, ela é rápida. Há muito tempo atrás, quando o 8086 apareceu (sim, existiam humanos na Terra nessa época :), programar não era uma tarefa fácil. Quando os primeiros computadores foram desenvolvidos, a programação tinha que ser feita em código de máquina, que _não_ era uma tarefa fácil, e assim o Assembler nasceu. Por que usá-lo? ----------------Como eu disse antes, Assembler é veloz. Ele também permite a você falar com a máquina a nível 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 páginas de código aparentemente incompreensível. Não 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, então eu dei-lhes alguns Tutoriais de Assembler que eu tinha. Como esses tutoriais tinham toda a informação que você precisaria, eles não foram escritos para os principiantes entenderem facilmente, então, decidi escrever meu próprio. Se você está usando este tutorial e o acha útil e informativo, então, por favor escreva para mim.

e AL conterá 4Ch. em que a CPU armazena endere os de retorno de subrotinas. São também registradores de 16 bits.o segmento de código. Acho que você está pegando o espírito da coisa agora. Compreende DH e DL.a base.não. þ ES . Os registradores de segmento: . Compreende CH e CL.o segmento extra. O bloco de mem¢ria onde o código armazenado.o acumulador. þ CS . . Estes registradores são definidos como registradores de uso geral pois podemos realmente armazenar qualquer coisa que quisermos neles. Incidentalmente. . Compreende AH e AL.o segmento de dados. A área na memória onde os dados são armazenados. tentarei dar alguma explicação aqui. os bytes alto e baixo de AX. Eles são imensamente úteis. o que significa que podemos armazenar um inteiro positivo de 0 a 65535. AH conterá 0Ah. É o segmento de pilha. þ DS . Usado frequentemente em loops. você tem que usar registradores.Registradores -------------------------Quando você está trabalhando com Assembler. ou um inteiro com sinal de -32768 to 32768. Durante operações de bloco. mas vamos vê-los em maior profundidade mais tarde. .o deslocamento. :) Alguns outros que você vai comumente usar: þ SI . AX tem um intervalo de 0 até FFFFh.o contador. não é o exército alemão. Comumente usado como uma base ou registrador apontador. e eu falarei sobre ele mais profundamente no próximo tutorial. logo. Compreende BH e BL.o índice de fonte. O próximo tutorial vai falar sobre ele.ta da! Estes são outros registradores que nós não vamos ver nos primeiros tutorias. mas este é comumente usado quando se quer acessar o vídeo.LIÇÃO 1 . þ SS . não se preocupe. Isto significa que você tem um intervalo de 0 até FFh para AH e AL. Os mais comuns estão listados abaixo: þ AX þ BX þ CX þ DX . quando grandes blocos de dados são movidos. Você pode imaginá-los como sendo vari€veis já definidas para você. o assunto do alto e do baixo byte destes resgistradores causou muita confusão no passado. mas podem ser também perigosos. Apenas outro segmento de dados. Sacou? Este é um conceito muito importante.) Agora. NÃO brinque com esse. Frequentemente usado para movimentações de blocos . Comumente usado em operações matemáticas e de E/S. se nós tivermos que armazenar 0A4Ch em AX. (Se sabe pouco sobre hexadecimal. Tome cuidado com ele. a menos que saiba o que está fazendo. similar ao registrador de base. este é o segmento a que a CPU comumente se refere.

é usado para escrita pela CPU. geralmente ES. Por exemplo.o apontador da pilha.o apontador da base. Ex.MOVE. é usado pela CPU para leitura. As seguintes instruções podem ser usadas em todas as CPU's do 8086 para cima. Esta instrução permite MOVER um valor para uma posição na mem¢ria. Há outros registradores também. entre outras coisas. þ DI . comumente usado com o segmento de pilha. Um outro ponteiro que.: (Em Pascal) AX := $13.255. Você pode pensar nisso como sendo quase uma procedure. Ex. então você já aprendeu sobre registradores. se AX = 13h .o índice de destino. primeiro você precisa de algumas instruções. e coisas conhecidas como flags. como usá-los. Esta instrução gera uma interupção. o que isso faria depende do conteúdo do registrador AH.: MOV AX. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ COISAS PARA FAZER: 1) Aprender os vários registradores de cor.ou pelo menos uma tabela ASCII. Nós não vamos usá-lo muito. geralmente DS. de 0h a FFh. NÃO brinque com isso de jeito nenhum. 2) Arrumar uma calculadora que suporte hexadecimal .INTERRUPÇÃO. com um segmento. Este é um ponteiro que. Ex. ou. Isso cobre 0 . 13h Isso deveria mover 13h (19 em decimal) para o registrador AX.: INT 10h Geraria a interrupção 10h (16 em decimal). <valor> . Agora. þ MOV <dest>. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ LIÇÃO 2 . ele agora seria 13h. Novamente. : Por enquanto você deveria saber o que são registradores. com um segmento. ISSO APENAS MOVE UM VALOR PARA UM REGISTRADOR. mas. você o usará muito. e como se codifica em Assembler? Bem.de instruções. þ INT <número> . se AX valia antes 0.O conjunto de instruções do 8086: ---------------------------------------------Okay. usado em conjunto com o segmento de pilha. mas nós não iremos a eles agora. NÃO FAZ NADA MAIS. þ BP . þ SP . Logo.

NÃO SE PREOCUPE COM ISSO POR ENQUANTO! NÓS FALAREMOS NISSO MAIS TARDE. AX agora é igual a 13h DEC AX . AX agora é igual a 13h (19 dec) SUB AX. þ CALL <procedimento> . NÃO SE PREOCUPE SE ISTO É UM POUCO CONFUSO . Contudo. Acho que dá pra você adivinhar o que isso faz. Ex: MOV AX. FALAREMOS NELAS MAIS TARDE.seleciona a subfunção do modo. COM MAIS DETALHES.SUBTRAI.e a interrupção 10h foi gerada. isso instruiria a CPU para checar se alguma tecla pressionada está no buffer do teclado. se AH = 2h. não? þ SUB <dest> <valor> .. o vídeo seria colocado no modo 320x200x256. Begin { MyProc } . þ ADD <dest> <valor> . Ex: MOV AX.CHAMA uma subfunção. INC AX . e BH = 0h e a interrupção 10h foi gerada. 10h . AX agora é igual a 0h ADD AX. Se AH = 2h. Ex: MOV AX. AX agora é igual a 0Eh (14 dec) þ DEC <registrador> . EG: JMP 020Ah .DECREMENTA algo. AX = AX + 1 þ JMP <posição> . e a interrupção 16h foi gerada. Adivinha. e AL seria igual a 13h . Pula para @MyLabel. Ex: MOV AX. TALVEZ MAIS. 13h . Pula para a instrução em 020Ah JMP @MyLabel . então a CPU moveria o cursor para a posição X em DL e posição Y DH.PULA para uma posição. 13h .. 13h . AX agora é igual a 15h Bem simples. AX agora é igual a 5h ADD AX. 5h .modo gráfico 320x200x256. AX agora é igual a 12h þ INC <registrador> .INCREMENTA algo. Esta instrução soma um número ao valor armazenado em dest. 5h . EG: Procedure MyProc.VAI FICAR PIOR! HÁ OUTRAS 28 INSTRUÇÕES JUMP PARA APRENDER.ADICIONA. 0h . Mais precisamente: AH seria igual a 00 .

(lembra que nós falamos sobre isso antes. NÆo decremente-o você mesmo (DEC CX). . Chama subfunção em F6E0h þ LOOP <rótulo/label> . Meu procedimento PutPixel colocar€ um byte em ES:DI. Assim. Agora. ISSO DEVERIA SE REPETIR 16 vezes .Faz LOOPS (repetição) durante um certo tempo. sobre SI ser o índice de fonte?). 10h = 16 @MyLabel: . . .poderia ser ES por exemplo. Isto é o porque de CX ser . De qualquer modo. É claro. 10 em hexadecimal. EG: MOV CX. . e executasse STOSB. mais coisa LOOP @MyLabel . imagine que temos a seguinte configuração na mem¢ria: Posição na memória ³ 06 ³ 07 ³ 08 ³ 09 ³ 10 ³ 11 ³ 12 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄ Valor ³ 50 ³ 32 ³ 38 ³ 03 ³ 23 ³ 01 ³ 12 Quando nós usamos LODSB ou STOSB. alguma coisa . aponta para a localização de onde queremos obter os dados. colocando. . } End. { MyProc } Begin { Main } Asm CALL MyProc End...e. e DS:DI aponta para onde colocaremos informações.. chamado de registro CONTADOR. Adivinha o que isso faz! Ou: CALL F6E0h .{ .i. não somos obrigados a usar DS . 10h . At que CX = 0 Note: CX é decrementado a cada vez. O registrador DS:SI. AL seria agora igual a 32. ele retorna ou pega um número de AL. þ LODSB LODSW STOSB STOSW Carrega um byte Carrega uma word Armazena um byte Armazena uma word Estas instruções são usadas para pôr ou conseguir algo numa posição na memória. . então teríamos o seguinte resultado: Posição na Memória ³ 06 ³ 07 ³ 08 ³ 09 ³ 10 ³ 11 ³ 12 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄ Valor ³ 50 ³ 32 ³ 38 ³ 03 ³ 23 ³ 50 ³ 12 . diria. se DS:SI apontava para 07 e executássemos uma instrução LODSB. se nós apontássemos DS:DI para 11. End. 50 no registrador AL.

AH. apenas. þ REP . . AINDA ASSIM.Move um byte MOVSW .REPETE o número de vezes especificado no registrador CX. Logo: Se CX = 5. quando usarmos LODSW ou STOSW. þ MOVSB . o resultado em ES:DI pareceria com: Em ES:DI: Posição de Memória ³ 06 ³ 07 ³ 08 ³ 09 ³ 10 ³ 11 ³ 12 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄ Valor ³ 10 ³ 11 ³ 20 ³ 02 ³ 67 ³ 32 ³ 12 ESPERO QUE VOCÊ PEGUE A IDÉIA GERAL. POSIÇÕES DE MEMÓRIA NÃO SÃO ARRUMADOAS EM FORMA DE ARRAY. QUANDO FOR MOVER/PEGAR/COLOCAR. COISAS A FAZER: 1) Memorizar todas as instruções acima .OBS.não é tão difícil assim e não há tantas lá. ou AX. Podemos armazenar um número de 8 bits em AL. VOCE ESTARÁ MEXENDO COM UMA POSIÇÃO TAL COMO: 100:102H. VOCÊ DEVERIA PEGAR A IDÉIA. Em DS:SI: Posição de Memória ³ 06 ³ 07 ³ 08 ³ 09 ³ 10 ³ 11 ³ 12 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄ Valor ³ 50 ³ 32 ³ 38 ³ 03 ³ 23 ³ 50 ³ 12 Em ES:DI: Posição de Memória ³ 06 ³ 07 ³ 08 ³ 09 ³ 10 ³ 11 ³ 12 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄÄÅÄÄÄ Valor ³ 10 ³ 11 ³ 20 ³ 02 ³ 67 ³ 00 ³ 12 Se apontarmos DS:SI para a posição 07. Isto porque estaremos mexendo com um número de 8 bits (um byte). EMBORA EU DESEJASSE MUITO QUE FOSSEM. então REP STOSB armazenaria o que estava no registrador AL na posição 1000:1000h 5 vezes. NÃO É TÃO SIMPLES.: Quando usamos LODSB/STOSB. nós devemos usar AX e não AL. já que estaremos pegando/colocando um número de 16 bits. usamos AL. e se ES:DI apontava para 1000:1000h. É CLARO. Um REP na frente de um MOVSB/LODSB/STOSB causaria a repetição da instrução. apontarmos ES:SI para a posição 11 e executarmos MOVSB. mas não podemos armazenar um número de 16 bits em AH ou AL porque eles são REGISTRADORES DE 8 BITS. Como resultado.Move uma word Como exemplo vamos pegar um byte de DS:SI e mandá-lo para ES:DI. CONTUDO.

e eu vou ver o que eu posso fazer. Talvez um PutPixel. " Essa noite não.nós falamos nisso nesse tutorial. þ Mais algumas instruções. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Não perca!!! Baixe o tutorial da próxima semana na minha home-page: þ http://www. e código que você pode usar em seus programas. querida .faroc. þ Segmentos e offsets (deslocamentos) .com. " . então escreva-me.Renato Nunes Bastos . ClrScr. þ Alguns programas de exemplo.2) Tenha certeza que você entendeu a teoria por trás delas.Adam.geocities. Se você deseja ver um tópico discutido em um tutorial futuro. algo que eu ache útil.eu tenho um modem.au/~blackcat þ http://www.com/SiliconValley/Park/3174 . ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ NA PRÓXIMA SEMANA: ---------------------þ Hexadecimal e o que é isso.