Aprendendo Assembly - Parte 2
Autor: Programador Online | Publicado: 2012-11-16T07:30:00-08:00





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 {
&nbsp; &nbsp;mov&nbsp;num1, 5
&nbsp; &nbsp;mov&nbsp;num2, 3
&nbsp; &nbsp;mov&nbsp;eax, num1
&nbsp; &nbsp;sub&nbsp;eax, num2
&nbsp; &nbsp;mov&nbsp;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&nbsp;num1, 5
mov&nbsp;num2, 3
mov&nbsp;eax, num1
mul num2

Para multiplicação, usamos mul.&nbsp;E não usamos dois parâmetros como add&nbsp;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&nbsp;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&nbsp;para word: cbw
- Conversão de double&nbsp;para quad word: cdq
- Conversão de word&nbsp;para double: cwd

Em nosso caso, devemos converter o valor de double&nbsp;para quad word.
Quad Word&nbsp;é 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&nbsp;e dividir pelo segundo valor (num2).
Desta forma, temos:


mov&nbsp;num1, 14
mov&nbsp;num2, 2
mov&nbsp;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", &amp;num1);
 printf("Digite outro numero: ");
 scanf("%d", &amp;num2);
 __asm {
  mov eax, num1
  add eax, num2
  mov res, eax
&nbsp; &nbsp; }
 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&nbsp;e adicionamos num2&nbsp;para eax.&nbsp;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.



&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Fundamentos em Programação&nbsp;Assembly


&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;










80x86 Assembly Language Architeture