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.
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
Digite o comando g
Por exemplo:
-g Program terminated normally -

- 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.
- 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.
-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.
-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.
-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.
-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.
-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.
-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.
-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.
-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.
-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.

