Vamos aprender Assembly – Parte 1 – Depurando uma aplicação ASM 32bits no Visual Studio 2010

Posted on 22/05/2011

2


Olá pessoal, como estamos?

Depois de falar um bocado sobre Intermediate Language, resolvi iniciar uma série sobre Assembly. A proposta é nos aproximarmos mais da forma como a máquina funciona e interpreta nossos programas. No decorrer da série, indicarei como podemos verificar o código assembly gerado pelo JIT além de, claro, indicar como escrever programas novos (do zero).

Nessa série, vou transitar entre tópicos básicos e avançados. Hoje, em especial, mostro como depurar um código Assembly dentro do Visual Studio.

Todos os exemplos nessa série estarão disponíveis em: https://github.com/ElemarJR/VamosAprenderAssembly

(Ouvindo “Dark Side of the Moon (1973)” do Pink Floyd)

Código de trabalho

O código que apresento hoje é muito simples. Observe:


              
.586
.MODEL FLAT

.STACK 4096

.DATA
number  DWORD   10
sum             DWORD   ?
        
.CODE
main PROC
        MOV EAX, number
        ADD EAX, 5
        MOV sum, EAX

        MOV EAX, 0
        RET
main ENDP
        
END 

            

Não se preocupe agora em entender o funcionamento de cada uma das instruções. No lugar disso, tente “pegar” a idéia do código.

De forma simplificada, perceba que:

  1. “movemos” o valor da “variável” number para um registrador EAX (espaço de memória que opera dentro do processador).;
  2. adicionamos um número (5, para ser explícito) a este registrador;
  3. “movemos” o valor do registrador para a “variável”  sum;
  4. montamos um código de retorno (0, no caso);
  5. encerramos o programa.

Para rodar esse código no Visual Studio 2010

O .net SDK provê o assembler. Entretanto, ele não fica “disponível”, por default, para códigos que escrevemos dentro do Visual Studio. Mais adiante, vou indicar como compilar programas assembly na linha de comando. Hoje vou mostrar um truque para que consigamos fazer isso dentro do IDE.

Para começar, baixe o código de exemplo de hoje de https://github.com/ElemarJR/VamosAprenderAssembly.

Por enquanto, disponibilizei apenas duas pastas de conteúdo. Estamos interessados no projeto que está dentro da pasta Console32. Para poder utilizar o Visual Studio em seus projetos Assembly:

  1. copie a pasta Console32 do conteúdo baixado de https://github.com/ElemarJR/VamosAprenderAssembly;
  2. abra a solução Console32.sln com o Visual Studio 2010:

image

Escreva o código assembly que deseja executar dentro de main.asm e pronto!

image

Como você poderá perceber, o Visual Studio 2010 não provê nenhum code completion para Assembly. Então, por que usar?

  1. podemos rodar o programa (compilando) usando o F5;
  2. podemos depurar nosso código.

Depurando o código

Comecemos colocando um break point na primeira linha do procedimento main e execute o programa. Observe:

image

 

Surpresa! O Visual Studio 2010 interrompe a execução. Podemos seguir “passo-a-passo” usando o F10.

Podemos utilizar o Watch.

image

E podemos acompanhar o valor dos registradores (Debug –> Windows –> Registers (Ctrl + Alt + D)). Observe:

image

Lindo!

Sempre lembrando que há como fazer depuração avançada de nossos códigos visualizando o assembly.

Por hoje, era isso.

Smiley piscando

Etiquetado:Assembly
Posted in: Sem categoria