Mais programas no debug

Nesta seção forneceremos alguns programas feitos no debug do DOS. Você não precisa digitar estes programas, uma vez que pode obtê-los pela documentação.
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        MOV     AX,0006
0D80:0103 BB0400        MOV     BX,0004
0D80:0106 01D8          ADD     AX,BX
0D80:0108 CD20          INT     20
-

Nota:

-n one.com

Utiliza-se para nomear o programa a ser carregado

-l

Carrega o programa

-u 100 109

Desmonta o código do endereço inicial ao endereço final especificado

Segundo passo

Digite o comando g
Por exemplo:

-g

Program terminated normally
-

Exemplos de programas no Debug

Primeiro exemplo

- a0100
297D:0100     MOV     AX,0006    ;Põe o valor 0006 no registrador AX
297D:0103     MOV     BX,0004    ;Põe o valor 0004 no registrador BX
297D:0106     ADD     AX,BX      ;Adiciona BX ao conteúdo de AX
297D:0108     INT     20         ;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 endereço 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 INT 21      ;Mostra a string 
0C1B:012F DEC CX      ;Subtrai 1 de CX 
0C1B:0130 JCXZ 0134   ;Se CX é igual a 0 salta para o endereço 0134 
0C1B:0132 JMP 012D    ;Salta ao endereço 012D 
0C1B:0134 INT 20      ;Finaliza o programa

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

Terceiro exemplo

-a100
297D:0100       MOV     AH,01    ;Função para mudar o cursor
297D:0102       MOV     CX,0007  ;Formata o cursor
297D:0105       INT     10       ;Chama interrupção do BIOS
297D:0107       INT     20       ;Finaliza o programa

Este programa muda o formato do cursor.

Quarto exemplo

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

Este programa usa a interrupção 21h do DOS. Usa duas funções da mesma: a primeira lê um caractere do teclado (função 1) e a segundo escreve um caractere na tela. O programa lê caracteres do teclado até encontrar um ENTER.

Quinto exemplo

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

Este programa mostra na tela um número binário através de um ciclo condicional (LOOP) usando a rotação do byte.

Sexto exemplo

-a100
297D:0100  MOV  AH,02  ;Função 2 (escreve caractere na tela)
297D:0102  MOV  DL,BL  ;Põe o valor de BL em DL
297D:0104  ADD  DL,30  ;Adiciona o valor 30 a DL
297D:0107  CMP  DL,3A  ;Compara 3A com conteúdo de DL sem afetá-lo
                       ;apenas modifica o estado do flag de carry
297D:010A  JL   010F   ;salta ao endereço 010f, se for menor
297D:010C  ADD  DL,07  ;Adiciona o valor 07 a DL
297D:010F  INT  21     ;Chama interrupção do DOS
297D:0111  INT  20     ;Finaliza o programa

Este programa imprime um valor zero em dígitos hexadecimais.

Sétimo exemplo

-a100
297D:0100  MOV  AH,02  ;Função 2 (escreve caractere na tela)
297D:0102  MOV  DL,BL  ;Põe o valor de BL em DL
297D:0104  AND  DL,0F  ;Transporta fazendo AND dos números bit a bit 
297D:0107  ADD  DL,30  ;Adiciona 30 a Dl
297D:010A  CMP  DL,3A  ;Compara Dl com 3A
297D:010D  JL   0112   ;Salta ao endereço 0112, se menor
297D:010F  ADD  DL,07  ;Adiciona 07 a DL
297D:0112  INT  21     ;Chama interrupção do DOS
297D:0114  INT  20     ;Finaliza o programa

Este programa é usado para imprimir dois dígitos hexadecimais.

Oitavo exemplo

-a100
297D:0100    MOV   AH,02   ;Função 2 (escreve caractere na tela)
297D:0102    MOV   DL,BL   ;Põe o valor de BL em DL
297D:0104    MOV   CL,04   ;Põe o valor 04 em CL  
297D:0106    SHR   DL,CL   ;Desloca os 4 bits mais altos do número
                           ;ao nibble mais à direita
297D:0108    ADD   DL,30   ;Adiciona 30 a DL
297D:010B    CMP   DL,3A   ;Compara Dl com 3A
297D:010E    JL    0113    ;Salta ao endereço 0113, se menor
297D:0110    ADD   DL,07   ;Adiciona 07 a DL
297D:0113    INT   21      ;Chama interrupção do DOS
297D:0115    INT   20      ;Finaliza o programa

Este programa imprime o primeiro de dois dígitos hexadecimais.

Nono exemplo

-a100
297D:0100    MOV   AH,02   ;Função 2 (escreve caractere na tela)
297D:0102    MOV   DL,BL   ;Põe o valor de BL em DL
297D:0104    MOV   CL,04   ;Põe o valor 04 em CL  
297D:0106    SHR   DL,CL   ;Desloca os 4 bits mais altos do número
                           ;ao nibble mais à direita
297D:0108    ADD   DL,30   ;Adiciona 30 a DL
297D:010B    CMP   DL,3A   ;Compara Dl com 3A
297D:010E    JL    0113    ;Salta ao endereço 0113, se menor
297D:0110    ADD   DL,07   ;Adiciona 07 a DL
297D:0113    INT   21      ;Chama interrupção do DOS
297D:0115    MOV   DL,BL   ;Põe o valor de BL em DL
297D:0117    AND   DL,0F   ;Transporta fazendo AND dos números bit a bit 
297D:011A    ADD   DL,30   ;Adiciona 30 a DL
297D:011D    CMP   DL,3A   ;Compara Dl com 3A
297D:0120    JL    0125    ;Salta ao endereço 0125, se menor
297D:0122    ADD   DL,07   ;Adiciona 07 a DL
297D:0125    INT   21      ;Chama interrupção do DOS
297D:0127    INT   20      ;Finaliza o programa

Este programa imprime o segundo de dois dígitos hexadecimais.

Décimo exemplo

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

Este programa pode ler dois dígitos hexadecimais.

Décimo primeiro exemplo

-a100
297D:0100     CALL    0200   ;Chama um procedimento
297D:0103     INT     20     ;Finaliza o programa

-a200
297D:0200    PUSH   DX     ;Põe o valor de DX na pilha
297D:0201    MOV    AH,08  ;Função 8
297D:0203    INT    21     ;Chama interrupção do DOS
297D:0205    CMP    AL,30  ;Compara AL com 30
297D:0207    JB     0203   ;Salta se CF é ativado ao endereço 0203
297D:0209    CMP    AL,46  ;Compara AL com 46
297D:020B    JA     0203   ;Salta ao endereço 0203, se diferente
297D:020D    CMP    AL,39  ;Compara AL com 39
297D:020F    JA     021B   ;Salta ao endereço 021B, se diferente
297D:0211    MOV    AH,02  ;Função 2 (escreve caractere na tela)
297D:0213    MOV    DL,AL  ;Põe o valor de AL em DL
297D:0215    INT    21     ;Chama interrupção do DOS
297D:0217    SUB    AL,30  ;Subtrai 30 de AL
297D:0219    POP    DX     ;Extrai o valor de DX da pilha
297D:021A    RET           ;Retorna o controle ao programa principal
297D:021B    CMP    AL,41  ;Compara AL com 41
297D:021D    JB     0203   ;Salta se CF é ativado ao endereço 0203
297D:021F    MOV    AH,02  ;Função 2 (escreve caractere na tela)
297D:022     MOV    DL,AL  ;Põe o valor AL em DL
297D:0223    INT    21     ;Chama interrupção do DOS
297D:0225    SUB    AL,37  ;Subtrai 37 de AL
297D:0227    POP    DX     ;Extrai o valor de DX da pilha
297D:0228    RET           ;Retorna o controle ao programa principal

Este programa se mantém lendo caracteres até receber um que possa ser convertido para um número hexadecimal.

©1998 Jeferson B. do Amaral