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:
- “movemos” o valor da “variável” number para um registrador EAX (espaço de memória que opera dentro do processador).;
- adicionamos um número (5, para ser explícito) a este registrador;
- “movemos” o valor do registrador para a “variável” sum;
- montamos um código de retorno (0, no caso);
- 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:
- copie a pasta Console32 do conteúdo baixado de https://github.com/ElemarJR/VamosAprenderAssembly;
- abra a solução Console32.sln com o Visual Studio 2010:
Escreva o código assembly que deseja executar dentro de main.asm e pronto!
Como você poderá perceber, o Visual Studio 2010 não provê nenhum code completion para Assembly. Então, por que usar?
- podemos rodar o programa (compilando) usando o F5;
- 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:
Surpresa! O Visual Studio 2010 interrompe a execução. Podemos seguir “passo-a-passo” usando o F10.
Podemos utilizar o Watch.
E podemos acompanhar o valor dos registradores (Debug –> Windows –> Registers (Ctrl + Alt + D)). Observe:
Lindo!
Sempre lembrando que há como fazer depuração avançada de nossos códigos visualizando o assembly.
Por hoje, era isso.
André Abrantes
23/05/2011
Parabéns por tratar esses assuntos no VS ! Atualmente estou programando um PIC e uso o VS como IDE, pois a IDE “default” do fabricante é muito “fraca”.
Fico muito feliz em ter pessoas como você na comunidade .NET !
Congratz !!!
elemarjr
23/05/2011
Obrigado. Faço o possível para escrever posts com bom nível técnico.