Você está na página 1de 5

Programao Assembly

Software necessrio
Para que possamos criar um programa, precisamos de algumas ferramentas:

por: alexszt

Primeiro de umclass="Apple-converted-space" editor para criar o programa fonte. Segundo de um montador, um programa que ir transformar nosso fonte num programa objeto. E, terceiro, de um linker (ligador) que ir gerar o programa executvel a partir do programa objeto. O editor pode ser qualquer um de que dispusermos. O montador ser o TASM macro assembler da Borland, e o linker ser o TLINK, tambm da Borland. Ns devemos criar os programas fonte com a extenso .ASM para que o TASM reconhea e oclass="Apple-converted-space" transforme no programa objeto, um "formato intermedirio" do programa, assim chamado porque ainda no um programa executvel e to pouco um programa fonte. O linker gera a partir de um programa .OBJ, ou da combinao de vrios deles, um programa executvel, cuja extenso normalmente .EXE, embora possa ser .COM dependendo da forma como for montado e ligado.

Programao assembly
Para construirmos os programas com o TASM, devemos estruturar o fonte de forma diferenciada ao que fazamos com o programa debug. importante incluir as seguintes diretivas assembly: .MODEL SMALL Define o melo de memria a usar em nosso programa .CODE Define as instrues do programa, relacionado ao segmento de cdigo .STACK Reserva espao de memria para as instrues de programa na pilha END Finaliza um programa assembly Vamos programar...

Primeiro Passo
Use qualquer editor para criar o programa fonte, desde que no formato ASCII. Entre com as seguintes linhas: Primeiro exemplo NOTA: ; usado para fazer comentrios em programas assembly .MODEL SMALL ;modelo de memria .STACK ;espao de memria para instrues do programa na pilha .CODE ;as linhas seguintes so instrues do programa mov ah,01h ;move o valor 01h para o registrador ah mov cx,07h ;move o valor 07h para o registrador cx int 10h ;interrupo 10h mov ah,4ch ;move o valor 4ch para o registrador ah int 21h ;interrupo 21h END ;finaliza o cdigo do programa Este programa assembly muda o tamanho do cursor.

Segundo Passo
Salvar o arquivo com o seguinte nome: exam1.asm No esquecer de salv-lo no formato ASCII.

Terceiro Passo
Usar o programa TASM para construir o programa objeto. Exemplo: C:\>tasm exam1.asm Turbo Assembler V2.0 Copyright (c) 1988, 1990 Borland International Assembling file: exam1.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 471k O TASM cria programas no formato .OBJ, que ainda no pode ser executado...

Quarto Passo
Usar o programa TLINK para criar o programa executvel. Exemplo: C:\>tlink exam1.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:\> Onde exam1.obj o nome do programa intermedirio, .OBJ. O comando acima gera diretamente o arquivo com o nome do programa intermedirio e a extenso .EXE. opcional a colocao da extenso .obj no comando.

Quinto Passo
Executar o programa executvel criado. C:\>exam1[enter] Lembre-se, este programa assembly muda o tamanho do cursor no DOS.

Segmentos
A arquitetura dos processadores x86 fora-nos a usar segmentos de memria para gerenciar a informao, o tamanho destes segmentos era de 64Kb, mas a partir dos PC's 80386 pode-se ter segmentos de tamanhos maiores, por simplicidade assumiremos o primeiro caso. A razo de ser destes segmentos que, considerando que o tamanho mximo de um nmero que o processador pode gerenciar dado por uma palavra de 16 bits ou registrador, assim no seria possvel acessar mais do que 65536 locais da memria usando apenas um destes registradores. Mas agora, se a memria do PC dividida em grupos de segmentos, cada um com 65536 locais, e podemos usar um endereo ou registrador exclusivo para encontrar cada segmento, e ainda fazemos cada endereo de um especfico slot com dois registradores, nos possvel acessar a quantidade de 4294967296 bytes de memria, que , atualmente, a maior memria que podemos instalar num PC.

Desta forma, para que o montador seja capaz de gerenciar os dados, se faz necessrio que cada informao ou instruo se encontre na rea correspondente ao seu segmento. O endereo do segmento fornecido ao montador pelos registradores DS, ES, SS e CS. Lembrando um programa no Debug, observe: 1CB0:0102 MOV AX,BX O primeiro nmero 1CB0, corresponde ao segmento de memria que est sendo usado, o segundo uma referncia ao endereo dentro do segmento, um deslocamento dentro do segmento, offset. O modo usado para indicar ao montador com quais segmentos vamos trabalhar fazendo uso das diretivas .CODE, .DATA e .STACK. O montador ajusta o tamanho dos segmentos tomando como base o nmero de bytes que cada instruo assembly precisa, j que seria um desperdcio de memria usar segmentos inteiros. Por exemplo, se um programa precisa de apenas 10Kb para armazenar dados, o segmento de dados seria apenas de 10Kb e no de 64Kb, como poderia acontecer se feito manualmente.

Tabela de equivalncia
Cada uma das partes numa linha de cdigo assembly conhecida como token, por exemplo: MOV AX,Var Aqui temos trs tokens, a instruo MOV, o operador AX e o operador Var. O que o montador faz para gerar o cdigo OBJ ler cada um dos tokens e procurar a equivalncia em cdigo de mquina em tabelas correspondentes, seja de palavras reservadas, tabela de cdigos de operao, tabela de smbolos, tabela de literais, onde o significado dos mnemnicos e os endereos dos smbolos que usamos sero encontrados. A maioria dos montadores so de duas passagens. Em sntese na primeira passagem temos a definio dos smbolos, ou seja, so associados endereos a todas as instrues do programa. Seguindo este processo, o assembler l MOV e procura-o na tabela de cdigos de operao para encontrar seu equivalente na linguagem de mquina. Da mesma forma ele l AX e encontra-o na tabela correspondente como sendo um registrador. O processo para Var um pouco diferenciado, o montador verifica que ela no uma palavra reservada, ento procura na tabela de smbolos, l encontrando-a ele designa o endereo correspondente, mas se no encontrou ele a insere na tabela para que ela possa receber um endereo na segunda passagem. Ainda na primeira passagem executado parte do processamento das diretivas, importante notar que as diretivas no criam cdigo objeto. Na passagem dois so montadas as instrues, traduzindo os cdigos de operao e procurando os endereos, e gerado o cdigo objeto. H smbolos que o montador no consegue encontrar, uma vez que podem ser declaraes externas. Neste caso o linker entra em ao para criar a estrutura necessria a fim de ligar as diversas possveis partes de cdigo, dizendo ao loader que o segmento e o token em questo so definidos quando o programa carregado e antes de ser executado.

Outros programas Primeiro Passo


Use qualquer editor e crie o seguinte: ;exemplo2 .model small .stack .code mov ah,2h ;move o valor 2h para o registrador ah

mov dl,2ah ;move o valor 2ah para o registrador dl ;( o valor ASCII do caractere *) int 21h ;interrupo 21h mov ah,4ch ;funo 4ch, sai para o sistema operacional int 21h ;interrupo 21h end ;finaliza o programa

Segundo Passo
Salvar o arquivo com o nome: exam2.asm No esquecer de salvar em formato ASCII.

Terceiro Passo
Usar o programa TASM para construir o programa objeto. C:\>tasm exam2.asm Turbo Assembler V2.0 Copyright (c) 1988, 1990 Borland International Assembling file: exam2.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 471k

Quarto Passo
Usar o programa TLINK para criar o programa executvel. C:\>tlink exam2.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:\>

Quinto Passo
Executar o programa: C:\>exam2[enter] * C:\> Este programa imprime o caracter * na tela.

Movimentos de dados
Em qualquer programa h necessidade de se mover dados na memria e em registradores da CPU; h vrios modos de se faz-lo: pode-se copiar os dados da memria para algum registrador, de registrador para registrador, de um registrador para a pilha, da pilha para um registrador, transmitir dados para um dispositivo externo e vice-versa. Este movimento de dados sujeito a regras e restries, entre elas: * No possvel mover dados de um local da memria para outro diretamente; necessrio primeiro mover o dado do local de origem para um registrador e ento do registrador para o local de destino. * No possvel mover uma constante diretamente para um registrador de segmento; primeiro deve-se mover para um registrador. possvel mover blocos de dados atravs de instrues movs, que copia uma cadeia de bytes ou palavras; movsb copia n bytes de um local para outro; e movsw copia n palavras. A ltima

das duas instrues toma os valores dos endereos definidos por DS:SI como o grupo de dados a mover e ES I como a nova localizao dos dados.

Para mover dados h tambm estruturas chamadas pilhas, onde o dado introduzido com a instruo push e extrado com a instruo pop Numa pilha o primeiro dado a entrar o ltimo a sair, por exemplo: PUSH AX PUSH BX PUSH CX Para retornar os valores da pilha referentes cada registrador necessrio seguir-se a ordem: POP CX POP BX POP AX Para a comunicao com dispositivos externos o comando de sada usado para o envio de informaes a uma porta e o comando de entrada usado para receber informao de uma porta. A sintaxe do comando de sada: OUT DX,AX Onde DX contm o valor da porta que ser usada para a comunicao e AX contm a informao que ser enviada. A sintaxe do comando de entrada: IN AX,DX Onde AX o registrador onde a informao ser armazenada e DX contm o endereo da porta de onde chegar a informao.

Operaes lgicas e aritmticas


As instrues de operaes lgicas so: and, not, or e xor. Elas trabalham a nvel de bits em seus operadores. Para verificar o resultado das operaes usamos as instrues cmp e test. As instrues usadas para operaes algbricas so: para adio add, para subtrao sub, para multiplicao mul e para diviso div. Quase todas as instrues de comparao so baseadas na informao contida no registrador de flag. Normalmente os flags do registrador que podem ser manuseados diretamente pelo programador so os da direo de dados DF, usado para definir as operaes sobre cadeias. Um outro que pode tambm ser manuseado o flag IF atravs das instrues sti e cli, para ativar e desativar as interrupes.

Saltos, laos e procedimentos


Saltos incondicionais na escrita de programas em linguagem assembly so dados pela instruo jmp; um salto usado para modificar a seqncia da execuo das instrues de um programa, enviando o controle ao endereo indicado, ou seja, o registrador contador de programa recebe este novo endereo. Um lao, tambm conhecido como interao, a repetio de um processo um certo nmero de vezes at atingir a condio de parada. Utiliza-se a instruo loop para construir laos.