Menu

Instruções Assembly diretamente no Debug

15 de agosto de 2015 - Praticando

Instruções Assembly diretamente no Debug

Vamos aprender novas instruções e como utiliza-las , na verdade não será aplicado todas as instruções, mas as principais; para aprender precisamos saber o básico, mesmo o básico já exige bastante, e também ficaremos um pouquinho aqui no ambiente do DEBUG.EXE para aprendermos as instruções fundamentais.

Da mesma forma, quando aprendemos a dirigir um carro sempre usamos um carrinho simples e popular, e também fazemos as aulas básicas e fundamentais, suficiente para dirigirmos mais tarde um BMW igual do Charlie Harper (two and half man), da mesma forma, estaremos aptos a dirigir em qualquer trânsito do mundo, sem precisar fazer aulas para dirigir no mundo todo para isto, é óbvio. Ficaremos aqui no “fusquinha” do ambiente assembly para aprender o fundamental, pelo menos no início.

 

Vamos agora ver como COMPARAR valores, e também como usar um contador para medir quantas vezes se passa por uma rotina.

O programa a seguir vai fazer o seguinte:

 

1- Exibir a frase “Digite a Senha”

2- Esoerar a senha pelo teclado

3- Comparar a senha (tamanho de 1 Byte) , com a letra K , vai ser necessário comparar o código do K e não o K , seu código é ASC é 75, e em hexa 4Bh

4- Se for a letra K,  passo 7 para terminar o programa

5- Se não for K, verificar se chegamos a 5a. tentativa, se chegou pular para 7

6 – Voltar ao passo 1 e tentar novamente

7- Termine o Programa

 

Já de cara, percebemos que precisamos de um contador, ele é necessário para contar quantas vezes estamos tentando, já que na 5a. vez precisaremos terminar o programa.

Outra coisa que ainda não foi explicado, é a instrução de compração “CMP” e a instrução para puilar se a comparação for verdaderia “JZ endereço“.

Outra coisa nova que pode ser feito enquanto estamos construindo o programa é a gravação em tamanho grande (R CX=200 por exemplo), como ele é grande, também está mais sujeito a erros de programação, para isto, podemos portanto gravar nosso programa com um tamanho grande, já que não sabemos o tamanho total no final, então quando estiver testado, ajustamos o tamanho do program (com R CX=tamanho).

 

instruções diretamente no debug

 

Aí esta o programa, as instruções novas estão destacadas em verde e são elas:

 

CMP AL, 4B

Esta instrução compara AL (a parte low do AX) , compara portanto com 4B , e o que será 4B ? é o código hexa de K ,
não cofunda, o código ASC de K é 75 , mas lá só vale o valor em hexa, então convertendo 75 em hexa, temos 4Bh

 

E de onde aparece este valor em AL ? após um Int 16 (Instrução anteriro), o sistema vai colocar em AL o valor digitado,

se for digitado a letra A, após o Int 16, AL vai valer 41h que é o código de A.

 

JZ 118

Esta instrução significa (Jump se Zero), ou seja, se a comparação anterior tiver sucesso, ou seja, se AL = 4B, então o Flag será setado em Zero ! então basta comprar com JZ, e se for zero mesmo, ele salta para o endereço 118, perceba que em no endereço 118 tem o INT 20 que é ? fim de programa.

 

INC CX

Se você pensou em Incrementation , acertou ! ele incrementa 1 valor no registrador CX , seria como (CX = CX + 1 ou CX++ como faríamos em C), e porque incrementa 1 ? para ir contando as tentativas, perceba que a instrução abaixo compara com 5.

 

CMP CX, 5

Esta é fácil ! já aprendemos o que faz o CMP, aqui ele compara CX co 5, e se for 5 mesmo, ele salta para o fim do programa

 

JNZ 103

Esta também sabemos, intuitivamente podemos perceber que se JZ salta para um endereço quando a comparação do CMP obteve sucesso, utilizando JNZ ele salta se NÂO obteve sucesso, neste caso a comparação da instrução anterior (CMP CX, 5) se CX não chegou a 5, ele salta para o inicio do programa e começa tudo de novo.

 

Observe também que antes da frase tem o código:  a,d,”Digite a senha:” , este a é o 10 (line feed), e o d é o 13 (Return), ou seja, enquanto o 10 pula para linha de baixo, o 13 volta para o inicio, é por isto que toda vez que erramos ele pula para linha de baixo e refaz o texto.

 

No exemplo o programa também é gerado com o nome digite.com e gravado no disco, podemos testa-lo no windows para ver o que acontece.

programa-assembly-direto-para-debug

 

Imagino que este programa começou a assustar, então está aqui uma opção de fazer download deste digite.com.

 

DOWNLOAD DO EXECUTÁVEL:[  digite.com   ]

SE PREFERIR ( e seu anti-virus exigir ! ) PEGUE A VERSÃO COMPACTADA:[  digite.rar ]

 

-=-
EDITANDO PROGRAMA PRONTO

 

Como alterar um programa já pronto ? vamos fazer isto utilizando o DEBUG, que tal alterar aquela frase do programa anterror ? e alterar também a senha, mudar deK para Y.

Primeiramente vamos ao código do Y maiúsculo, o código ASC é 89 decimal, então convertemos para Hexa que é 59h.

Para fazer a edição, basta digitar DEBUG digite.com , para se ver o programa, vamos utilizar a diretiva U do DEBUG , podemos vê-lo no help do DEBUG, para ver este Help pasta digitar ? no DEBUG.

debug-modo-real-instrucoes

 

Alterando o código da tecla senha de K para Y, para isto basta editar o endereço10E com a diretiva “A 10E” e digitar

a mova instrução assembly “CMP al, 59″.

 

debug-dos-diassembly

 

disassembly dos

O próximo passo é alterar a frase exibida, para isto basta repetir o último procedimento, porém com endereço diferente, desta vez para alterar o endereço de memória 103:

debug- dos

debug dos

Neste último exemplo foi demonstrado como alterar também o texto do endereço119, bastando digitar DB “novo texto”.

Para gravar esta alteração basta seguir os procedimentos que usamos quando criamos, utilizar a  diretiva do debug W para gravar esta alteração.

 

Deixe um comentário