Sei sulla pagina 1di 12

Contedo:

Processo de criao de programas Registradores da CPU Programa debug Estrutura Assembly Criando um programa assembly simples Armazenando e carregando os programas Mais programas no debug

Processo de criao de programas


Para a criao de programas so necessrios os seguintes passos: 1. Desenvolvimento do algoritmo, estgio em que o problema a ser solucionado estabelecido e a melhor soluo proposta, criao de diagramas esquemticos relativos melhor soluo proposta; 2. Codificao do algoritmo, o que consiste em escrever o programa em alguma linguagem de programao; linguagem assembly neste caso especfico, tomando como base a soluo proposta no passo anterior; 3. A transformao para a linguagem de mquina, ou seja, a criao do programa objeto, escrito como uma seqncia de zeros e uns que podem ser interpretados pelo processador; e 4. O ltimo estgio a eliminao de erros detectados no programa na fase de teste. A correo normalmente requer a repetio de todos os passos, com observao atenta.

Registradores da CPU
Para o propsito didtico, vamos focar registradores de 16 bits. A CPU possui alguns registradores internos, entre eles AX, BX, CX e DX. So registradores de uso geral e tambm podem ser usados como registradores de 8 bits. Para tanto devemos referenci-los como, por exemplo, AH e AL, que so, respectivamente, o byte high e o low do registrador AX. Esta nomenclatura tambm se aplica para os registradores BX, CX e DX.

Os registradores, segundo seus respectivos nomes:


AX Registrador Acumulador BX Registrador Base CX Registrador Contador DX Registrador de Dados DS Registrador de Segmento de Dados ES Registrador de Segmento Extra SS Registrador de Segmento de Pilha CS Registrador de Segmento de Cdigo BP Registrador Apontador da Base SI Registrador de ndice Fonte DI Registrador de ndice Destino SP Registrador Apontador de Pilha IP Registrador Apontador da Prxima Instruo F Registrador de Flag

Programa Debug
Para a criao de um programa em assembly existem opes: uma delas usar o TASM Turbo Assembler da Borland, outra o Debug. Nesta primeira seo vamos usar o debug, uma vez que podemos encontr-lo em qualquer PC com o MS-DOS. Debug pode apenas criar arquivos com a extenso .COM, e por causa das caractersticas deste tipo de programa, eles no podem exceder os 64 Kb, e tambm devem iniciar no endereo de memria 0100H dentro do segmento especfico. importante observar isso, pois deste modo os programas .COM no so relocveis. Os principais comandos do programa debug so:

A Montar instrues simblicas em cdigo de mquina D Mostrar o contedo de uma rea da memria E Entrar dados na memria, iniciando num endereo especfico G Rodar um programa executvel na memria N Dar nome a um programa P Proceder, ou executar um conjunto de instrues relacionadas Q Sair do programa debug R Mostrar o contedo de um ou mais registradores T Executar passo a passo as instrues U Desmontar o cdigo de mquina em instrues simblicas

W Gravar um programa em disco

possvel visualizar os valores dos registradores internos da CPU usando o programa Debug. Debug um programa que faz parte do pacote do DOS, e pode ser encontrado normalmente no diretrio C:\DOS. Para inici-lo, basta digitar Debug na linha de comando: C:/>Debug [Enter] Voc notar ento a presena de um hfen no canto inferior esquerdo da tela. No se espante, este o prompt do programa. Para visualizar o contedo dos registradores, experimente:
-r[Enter] AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0100 NV UP EI PL NZ NA PO NC 0D62:0100 2E CS: 0D62:0101 803ED3DF00 CMP BYTE PTR [DFD3],00 CS:DFD3=03

mostrado o contedo de todos os registradores internos da CPU; um modo alternativo para visualizar um nico registrador usar o camando "r" seguido do parmetro que faz referncia ao nome do registrador:
-rbx BX 0000 :

Esta instruo mostrar o contedo do registrador BX e mudar o indicador do Debug de "-" para ":" Quando o prompt assim se tornar, significa que possvel, embora no obrigatria, a mudana do valor contido no registrador, bastando digitar o novo valor e pressionar [Enter]. Se voc simplesmente pressionar [Enter] o valor antigo se mantm.

Estrutura Assembly
Nas linhas do cdigo em Linguagem Assembly h duas partes: a primeira o nome da instruo a ser executada; a segunda, os parmetros do comando. Por exemplo: add ah bh Aqui "add" o comando a ser executado, neste caso uma adio, e "ah" bem como "bh" so os parmetros. Outro exemplo:

mov al, 25 No exemplo acima, estamos usando a instruo mov, que significa mover o valor 25 para o registrador al. O nome das instrues nesta linguagem constitudo de 2, 3 ou 4 letras. Estas instrues so chamadas mnemnicos ou cdigos de operao, representando a funo que o processador executar. s vezes instrues aparecem assim: add al,[170] Os colchetes no segundo parmetro indica-nos que vamos trabalhar com o contedo da clula de memria de nmero 170, ou seja, com o valor contido no endereo 170 da memria e no com o valor 170, isto conhecido como "endereamento direto".

Criando um programa simples em assembly


No nos responsabilizaremos pela m execuo ou possveis danos causados por quaisquer exemplos que de agora em diante aparecero, uma vez que os mesmos, apesar de testados, so de carter didtico. Vamos, ento, criar um programa para ilustrar o que vimos at agora. Adicionaremos dois valores: O primeiro passo iniciar o Debug, o que j vimos como fazer anteriormente. Para montar um programa no Debug, usado o comando "a" (assemble); quando usamos este comando, podemos especificar um endereo inicial para o nosso programa como o parmetro, mas opcional. No caso de omisso, o endereo inicial o especificado pelos registradores CS:IP, geralmente 0100h, o local em que programas com extenso .COM devem iniciar. E ser este o local que usaremos, uma vez que o Debug s pode criar este tipo de programa. Embora neste momento no seja necessrio darmos um parmetro ao comando "a", isso recomendvel para evitar problemas, logo:
a 100[enter] mov ax,0002[enter] mov bx,0004[enter] add ax,bx[enter] nop[enter][enter]

O que o programa faz? Move o valor 0002 para o registrador ax, move o valor 0004 para o registrador bx, adiciona o contedo dos registradores ax e bx, guardando o resultado em ax e finalmente a instruo nop (nenhuma operao) finaliza o programa. No programa debug, a tela se parecer com:
C:\>debug -a 100 0D62:0100 0D62:0103 0D62:0106 0D62:0108 0D62:0109 -t AX=0002 BX=0000 DS=0D62 ES=0D62 0D62:0103 BB0400 -t CX=0000 DX=0000 SP=FFEE SS=0D62 CS=0D62 IP=0103 MOV BX,0004 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

mov ax,0002 mov bx,0004 add ax,bx nop

Entramos com o comando "t" para executar passo a passo as instrues:

Vemos o valor 0002 no registrador AX. Teclamos "t" para executar a segunda instruo:
AX=0002 BX=0004 DS=0D62 ES=0D62 0D62:0106 01D8 -t AX=0006 BX=0004 DS=0D62 ES=0D62 0D62:0108 90 CX=0000 DX=0000 SS=0D62 CS=0D62 NOP SP=FFEE IP=0108 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PE NC CX=0000 DX=0000 SP=FFEE SS=0D62 CS=0D62 IP=0106 ADD AX,BX BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

Teclando "t" novamente para ver o resultado da instruo add:

Possivelmente a maioria dos registradores ter valores diferentes, entretanto AX e BX devem conter os mesmos valores acima descritos. Para sair do Debug usamos o comando "q" (quit).

Armazenando e carregando os programas


No seria prtico ter que digitar o programa cada vez que inicissemos o Debug. Ao invs disso, podemos armazen-lo no disco. S que o mais interessante nisso que um simples comando de salvar cria um arquivo com a extenso .COM, ou seja, executvel - sem precisarmos efetuar os processos de montagem e ligao, como veremos posteriormente com o TASM.

Eis os passos para salvar um programa que j esteja na memria: 1. Obter o tamanho do programa subtraindo o endereo final do endereo inicial, naturalmente que no sistema hexadecimal; 2. Dar um nome ao programa; 3. Colocar o tamanho do programa no registrador CX; e 4. Mandar o debug gravar o programa em disco. Usando como exemplo o seguinte programa, vamos clarear a idia de como realizar os passos acima descritos:
0C1B:0100 0C1B:0103 0C1B:0106 0C1B:0108 0C1B:010A mov mov add int ax,0002 bx,0004 ax,bx 20

Para obter o tamanho de um programa, o comando "h" usado, j que ele nos mostra a adio e subtrao de dois nmeros em hexadecimal. Para obter o tamanho do programa em questo, damos como parmetro o valor do endereo final do nosso programa (10A), e o endereo inicial (100). O primeiro resultado mostra-nos a soma dos endereos, o segundo, a subtrao.
-h 10a 100 020a 000a

O comando "n" permite-nos nomear o programa.


-n test.com

O comando "rcx" permite-nos mudar o contedo do registrador CX para o valor obtido como tamanho do arquivo com o comando "h", neste caso 000a.
-rcx CX 0000 :000a

NOTA: Se o valor no couber em CX, utilize o registrador BX.

Finalmente, o comando "w" grava nosso programa no disco, indicando quantos bytes gravou.
-w Writing 000A bytes

Para j salvar um arquivo quando carreg-lo, 2 passos so necessrios: 1. Dar o nome do arquivo a ser carregado; e 2. Carreg-lo usando o comando "l" (load). Para obter o resultado correto destes passos, necessrio que o programa acima j esteja criado. Dentro do Debug, escrevemos o seguinte:
-n test.com -l -u 100 109 0C3D:0100 B80200 MOV AX,0002 0C3D:0103 BB0400 MOV BX,0004 0C3D:0106 01D8 ADD AX,BX

0C3D:0108 CD20 INT 20

O ltimo comando "u" usado para verificar que o programa foi carregado na memria. O que ele faz desmontar o cdigo e mostr-lo em assembly. Os parmetros indicam ao Debug os endereos inicial e final a serem desmontados. O Debug sempre carrega os programas na memria no endereo 100h, conforme j comentamos. Clique aqui para obter mais exemplos de programas no debug

1998 Jeferson B. do Amaral

Mais programas no debug


Nesta seo forneceremos alguns programas feitos no debug do DOS. Voc no precisa digitar estes programas, uma vez que pode obt-los pela documentao. Voc pode executar cada programa assembly usando o comando "g" (go), para ver o que cada programa faz. Primeiro passo Carregar o programa Por exemplo:
C:\>debug -n one.com -l -u 100 109 0D80:0100 B80600 0D80:0103 BB0400 0D80:0106 01D8 0D80:0108 CD20 -

MOV MOV ADD INT

AX,0006 BX,0004 AX,BX 20

Nota:
-n one.com

Utiliza-se para nomear o programa a ser carregado


-l

Carrega o programa
-u 100 109

Desmonta o cdigo do endereo inicial ao endereo final especificado Segundo passo Digite o comando g Por exemplo:
-g Program terminated normally -

Exemplos de programas no Debug Primeiro exemplo


- a0100 297D:0100 297D:0103 297D:0106 297D:0108 MOV MOV ADD INT AX,0006 BX,0004 AX,BX 20 ;Pe o valor 0006 no registrador AX ;Pe o valor 0004 no registrador BX ;Adiciona BX ao contedo de AX ;Finaliza o Programa

A nica coisa que este programa faz salvar dois valores em dois registradores e adicionar o valor de um ao outro.

Segundo exemplo
- a100 0C1B:0100 jmp 125 ;Salta para o endereo 125h 0C1B:0102 [Enter] - e 102 'Hello, How are you ?' 0d 0a '$' - a125 0C1B:0125 MOV DX,0102 ;Copia a string para registrador DX 0C1B:0128 MOV CX,000F ;Quantas vezes a string ser mostrada 0C1B:012B MOV AH,09 ;Copia o valor 09 para registrador AH

0C1B:012D 0C1B:012F 0C1B:0130 0C1B:0132 0C1B:0134

INT 21 DEC CX JCXZ 0134 JMP 012D INT 20

;Mostra a string ;Subtrai 1 de CX ;Se CX igual a 0 salta para o endereo 0134 ;Salta ao endereo 012D ;Finaliza o programa

Este programa mostra 15 vezes na tela a string de caracteres.

Terceiro exemplo
-a100 297D:0100 297D:0102 297D:0105 297D:0107 MOV MOV INT INT AH,01 CX,0007 10 20 ;Funo para mudar o cursor ;Formata o cursor ;Chama interrupo do BIOS ;Finaliza o programa

Este programa muda o formato do cursor.

Quarto exemplo
-a100 297D:0100 297D:0102 297D:0104 297D:0106 297D:0108 297D:010A 297D:010C 297D:010E MOV INT CMP JNZ MOV MOV INT INT AH,01 21 AL,0D 0100 AH,02 DL,AL 21 20 ;Funo 1 (l caractere do teclado) ;Chama interrupo do DOS ;Compara se o caractere lido um ENTER ;Se no , l um outro caractere ;Funo 2 (escreve um caractere na tela) ;Character to write on AL ;Chama interrupo do DOS ;Finaliza o programa

Este programa usa a interrupo 21h do DOS. Usa duas funes da mesma: a primeira l um caractere do teclado (funo 1) e a segundo escreve um caractere na tela. O programa l caracteres do teclado at encontrar um ENTER.

Quinto exemplo
-a100 297D:0100 297D:0102 297D:0105 297D:0107 297D:0109 297D:010C 297D:010E 297D:0110 MOV MOV MOV RCL ADC INT LOOP INT AH,02 CX,0008 DL,00 BL,1 DL,30 21 0105 20 ;Funo 2 (escreve caractere na tela) ;Pe o valor 0008 no registrador CX ;Pe o valor 00 no registrador DL ;Rotaciona o byte em BL um bit para a esquerda ;Converte o registrador de flag para 1 ;Chama interrupo do DOS ;Salta se CX > 0 para o endereo 0105 ;Finaliza o programa

Este programa mostra na tela um nmero binrio atravs de um ciclo condicional (LOOP) usando a rotao do byte.

Sexto exemplo

-a100 297D:0100 297D:0102 297D:0104 297D:0107 297D:010A 297D:010C 297D:010F 297D:0111

MOV MOV ADD CMP JL ADD INT INT

AH,02 DL,BL DL,30 DL,3A 010F DL,07 21 20

;Funo 2 (escreve caractere na tela) ;Pe o valor de BL em DL ;Adiciona o valor 30 a DL ;Compara 3A com contedo de DL sem afet-lo ;apenas modifica o estado do flag de carry ;salta ao endereo 010f, se for menor ;Adiciona o valor 07 a DL ;Chama interrupo do DOS ;Finaliza o programa

Este programa imprime um valor zero em dgitos hexadecimais.

Stimo exemplo
-a100 297D:0100 297D:0102 297D:0104 297D:0107 297D:010A 297D:010D 297D:010F 297D:0112 297D:0114 MOV MOV AND ADD CMP JL ADD INT INT AH,02 DL,BL DL,0F DL,30 DL,3A 0112 DL,07 21 20 ;Funo 2 (escreve caractere na tela) ;Pe o valor de BL em DL ;Transporta fazendo AND dos nmeros bit a bit ;Adiciona 30 a Dl ;Compara Dl com 3A ;Salta ao endereo 0112, se menor ;Adiciona 07 a DL ;Chama interrupo do DOS ;Finaliza o programa

Este programa usado para imprimir dois dgitos hexadecimais.

Oitavo exemplo
-a100 297D:0100 297D:0102 297D:0104 297D:0106 297D:0108 297D:010B 297D:010E 297D:0110 297D:0113 297D:0115 MOV MOV MOV SHR ADD CMP JL ADD INT INT AH,02 DL,BL CL,04 DL,CL DL,30 DL,3A 0113 DL,07 21 20 ;Funo 2 (escreve caractere na tela) ;Pe o valor de BL em DL ;Pe o valor 04 em CL ;Desloca os 4 bits mais altos do nmero ;ao nibble mais direita ;Adiciona 30 a DL ;Compara Dl com 3A ;Salta ao endereo 0113, se menor ;Adiciona 07 a DL ;Chama interrupo do DOS ;Finaliza o programa

Este programa imprime o primeiro de dois dgitos hexadecimais.

Nono exemplo
-a100 297D:0100 297D:0102 297D:0104 297D:0106 MOV MOV MOV SHR AH,02 DL,BL CL,04 DL,CL ;Funo 2 (escreve caractere na tela) ;Pe o valor de BL em DL ;Pe o valor 04 em CL ;Desloca os 4 bits mais altos do nmero ;ao nibble mais direita

297D:0108 297D:010B 297D:010E 297D:0110 297D:0113 297D:0115 297D:0117 297D:011A 297D:011D 297D:0120 297D:0122 297D:0125 297D:0127

ADD CMP JL ADD INT MOV AND ADD CMP JL ADD INT INT

DL,30 DL,3A 0113 DL,07 21 DL,BL DL,0F DL,30 DL,3A 0125 DL,07 21 20

;Adiciona 30 a DL ;Compara Dl com 3A ;Salta ao endereo 0113, se menor ;Adiciona 07 a DL ;Chama interrupo do DOS ;Pe o valor de BL em DL ;Transporta fazendo AND dos nmeros bit a bit ;Adiciona 30 a DL ;Compara Dl com 3A ;Salta ao endereo 0125, se menor ;Adiciona 07 a DL ;Chama interrupo do DOS ;Finaliza o programa

Este programa imprime o segundo de dois dgitos hexadecimais.

Dcimo exemplo
-a100 297D:0100 297D:0102 297D:0104 297D:0106 297D:0109 297D:010C 297D:010E 297D:0111 297D:0113 297D:0115 297D:0117 297D:0119 297D:011B 297D:011D 297D:011F 297D:0121 MOV INT MOV SUB CMP JLE SUB MOV SHL INT SUB CMP JLE SUB ADD INT AH,01 21 DL,AL DL,30 DL,09 0111 DL,07 CL,04 DL,CL 21 AL,30 AL,09 011F AL,07 DL,AL 20 ;Funo 1 (l caractere do teclado) ;Chama interrupo do DOS ;Pe o valor de AL em DL ;Subtrai 30 de DL ;Compara DL com 09 ;Salta ao endereo 0111, se menor ou igual ;Subtrai 07 de DL ;Pe o valor 04 em CL ;Insere zeros direita ;Chama interrupo do DOS ;Subtrai 30 de AL ;Compara AL com 09 ;Salta ao endereo 011f, se menor ou igual ;Subtrai 07 de AL ;Adiciona AL a DL ;Finaliza o programa

Este programa pode ler dois dgitos hexadecimais.

Dcimo primeiro exemplo


-a100 297D:0100 297D:0103 -a200 297D:0200 297D:0201 297D:0203 297D:0205 297D:0207 297D:0209 297D:020B 297D:020D 297D:020F CALL INT PUSH MOV INT CMP JB CMP JA CMP JA 0200 20 DX AH,08 21 AL,30 0203 AL,46 0203 AL,39 021B ;Chama um procedimento ;Finaliza o programa ;Pe o valor de DX na pilha ;Funo 8 ;Chama interrupo do DOS ;Compara AL com 30 ;Salta se CF ativado ao endereo 0203 ;Compara AL com 46 ;Salta ao endereo 0203, se diferente ;Compara AL com 39 ;Salta ao endereo 021B, se diferente

297D:0211 297D:0213 297D:0215 297D:0217 297D:0219 297D:021A 297D:021B 297D:021D 297D:021F 297D:022 297D:0223 297D:0225 297D:0227 297D:0228

MOV MOV INT SUB POP RET CMP JB MOV MOV INT SUB POP RET

AH,02 DL,AL 21 AL,30 DX AL,41 0203 AH,02 DL,AL 21 AL,37 DX

;Funo 2 (escreve caractere na tela) ;Pe o valor de AL em DL ;Chama interrupo do DOS ;Subtrai 30 de AL ;Extrai o valor de DX da pilha ;Retorna o controle ao programa principal ;Compara AL com 41 ;Salta se CF ativado ao endereo 0203 ;Funo 2 (escreve caractere na tela) ;Pe o valor AL em DL ;Chama interrupo do DOS ;Subtrai 37 de AL ;Extrai o valor de DX da pilha ;Retorna o controle ao programa principal

Este programa se mantm lendo caracteres at receber um que possa ser convertido para um nmero hexadecimal.

1998 Jeferson B. do Amaral

Potrebbero piacerti anche