sexta-feira, 16 de novembro de 2012


Continuação da primeira parte de Aprendendo Assembly. Caso você não tenha lido a primeira parte, leia aqui.
Na parte anterior, abordamos o operador aritmético de soma, assim como um breve exemplo do operador de subtração.
O operador de subtração, assim como todos os outros operadores, são feitos e tratados da mesma maneira.

__asm {
   mov num1, 5
   mov num2, 3
   mov eax, num1
   sub eax, num2
   mov res, eax
}

Na primeira linha, atribuimos o valor 5 para a variável num1, assim como, na segunda linha atribuimos 3 para num2.
Na terceira linha, movemos o valor de num1 para o registrador eax. Dessa maneira, eax possui 5.
Na quarta linha, subtraímos eax pelo valor de num2. Desta forma, nos da o resultado 2.
Na última linha, movemos o conteúdo de eax (2) para a variável res.
Desta forma, após declararmos num1, num2 e res como int, podemos exibir o resultado.

printf("%s%d", "NUM1 - NUM2 = ", res);

A única diferença em multiplicar e dividir valores, é que, não passamos dois parâmetros para o operador. Ex:

mov num1, 5
mov num2, 3
mov eax, num1
mul num2

Para multiplicação, usamos mul. E não usamos dois parâmetros como add e sub, pois quando chamamos o operador de multiplicação, ele faz a operação do parâmetro informado (num2) pelo conteúdo do acumulador (eax).
Então para multiplicarmos os dois valores, mover o primeiro valor para eax, e depois usar mul com o segundo valor.

Para divisão usamos a mesma lógica, porém, quando se trata de divisão, tratamos com números quebrados, normalmente float, double ou real.
Como definimos as variáveis num1, num2 e res como int, devemos converter esse valor para int, pois a divisão nos retorna um número "quebrado" (double).
Temos 3 tipos de conversão:

- Conversão de byte para word: cbw
- Conversão de double para quad word: cdq
- Conversão de word para double: cwd

Em nosso caso, devemos converter o valor de double para quad word.
Quad Word é uma variável do tipo inteiro de 64 bits, semelhante a um int64, word...

Então, antes de iniciar a divisão, devemos converter o valor do acumulador (eax) para quad word e dividir pelo segundo valor (num2).
Desta forma, temos:


mov num1, 14
mov num2, 2
mov eax, num1
cdq
div num2
mov res, eax

O resultado retornado é 7.

O desenvolvimento começa a ficar mais interessante, quando passamos a receber entrada de dados do usuário.
Antes de começarmos a próxima parte falando sobre como criar uma aplicação inteira em Assembly, mostrarei como é feito o input usando o C++ como linguagem "mãe".
Usaremos o scanf do C++ para fazer a leitura das teclas, e a partir daí, passaremos os dados para os registradores. Veja um exemplo:


int _tmain(int argc, _TCHAR* argv[])
{
int num1, num2, res;

printf("Digite um numero: ");
scanf("%d", &num1);
printf("Digite outro numero: ");
scanf("%d", &num2);
__asm {
mov eax, num1
add eax, num2
mov res, eax
    }
printf("%s%d", "Resultado = ", res);
getchar();
}

Usamos o scanf para fazer a leitura dos dados, e logo após ler os dois valores, passamos num1 para eax e adicionamos num2 para eax. Neste exemplo como podem perceber, foi usado uma soma.
Dessa forma, podemos manipular todos os dados com Assembly, até podemos criar uma aplicação inteira do zero.
Abraços e até o próximo capítulo.



               
Fundamentos em Programação Assembly


              










80x86 Assembly Language Architeture

5 comentários:

  1. Anônimo23.11.12

    Muito bom cara. to no aguardo da parte 3

    ResponderExcluir
  2. Muito Bom, Parabéns!!! espero o próximo!

    ResponderExcluir
  3. no meu caso aparece um erro, diz que _TCHAR* não foi declarado e asm tbm

    ResponderExcluir
  4. Muito bom vc é o cara aprendi assembly com vc!

    ResponderExcluir
  5. Anônimo27.4.22

    Aprendendo Assembly - Parte 2 ~ Programador Online >>>>> Download Now

    >>>>> Download Full

    Aprendendo Assembly - Parte 2 ~ Programador Online >>>>> Download LINK

    >>>>> Download Now

    Aprendendo Assembly - Parte 2 ~ Programador Online >>>>> Download Full

    >>>>> Download LINK Kk

    ResponderExcluir