Ir para conteúdo
Entre para seguir isso  
Fernando Mercês

Hello world em MASM no Windows

Posts Recomendados

Segue um "Hello, world" em MASM no Windows para os interessados. A graça do MASM é que, mesmo programando em Assembly, é possível chamar as funções da API do Windows (e de outras bibliotecas) usando o comando invoke.

1. Baixar e instalar o MASM32 SDK do site oficial (já vem o compilador, linker e também um editor).

2. Depois de instalado, abra o MASM32 Editor. Copie e cole o seguinte código:

; fonte: https://stackoverflow.com/questions/4568306/outputting-hello-world-in-masm-using-win32-functions

.386
.model flat, stdcall
option casemap: none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
    szCaption   db  'Hello', 0
    szText      db  'Hello, World!', 0

.code
    start:
            invoke MessageBox, NULL, offset szText, offset szCaption, MB_OK
            invoke ExitProcess, NULL        
    end start

3. Salve o arquivo como hello.asm, clique em Project -> Assemble & Link. Um hello.exe será gerado.

Explicando:

.386 define o conjunto de instruções suportados pelo teu programa. O mínimo pra um EXE de 32-bits é .386, mas o MASM tem suporte à vários outros conjuntos de instruções (.386, .486, .586, .686, .mmx, etc).

.model flat, stdcall

flat diz respeito ao modelo de endereçamento de memória linear e vai fazer o compilador gerar EXE de 32-bits. Já stdcall, diz respeito à calling convention (como o Assembler vai gerar o código para chamadas de função, limpeza da pilha, passagem de argumentos, etc). Da documentação do MASM:

59d289e451bd2_ScreenShot2017-10-02at15_31_32.thumb.png.6c8f31316d1a6acd4e8874fca6cc55f5.png

option casemap:none

Ativa o case sensitive, necessário para chamar as funções da API do Windows já que seus nomes são sensíveis ao caso.

include

Inclui as os headers (como se fossem os .h do C) já prontos do MASM para usar as bibliotecas do Windows.

inbludelib

Inclui o código compilado necessário para chamar tais bibliotecas da maneira que o MASM chama. É que quem desenvolve o MASM já escreveu e deixou tudo isso pronto para uso.

.data

Cria uma nova seção de dados no arquivo. O db define um ou mais bytes. À esquerda dele é o nome (como se fosse o nome de uma variável) que você escolhe e à direita os dados em si, no caso, uma sequência de bytes representando uma string terminada em NULL (byte 0x00). Há também o dw (para dword), dd (para double word), etc.

.code

Inicia uma seção de código. O label .start marca o início dela (o MASM requer o end start no fim).

invoke

Sendo parte da linguagem de alto nível do MASM, permite chamar as funções de acordo com a calling convention definida sem se preocupar em como os parâmetros serão passados, quem vai limpar a pilha, etc. Basicamente te permite programar em Assembly no estilo do C (o compilador trata das convenções). Os parâmetros são passados para a função depois do nome delas, separados por vírgula.

O código fica lindo ó:

masmhelloolly.thumb.png.9b7676d2bea7c80853f833ce806e415f.png

Seria bem trabalhoso fazer tudo isso com outro assembler. Sei que o fasm tem umas facilidades também mas em nasm por exemplo seria loko.

Só para colocar mais lenha na fogueira (de quem não gosta de HLA - High Level Assembly), o MASM tem umas macros maneiras pra ajudar quando criando loops, condicionais... Por exemplo, a macro .if/.endif substitui os loops com instruções CMP e Jcc:

    start:
            mov eax, 0deadbeefh
            .if eax == 2017
                invoke MessageBox, NULL, offset szText, offset szCaption, MB_OK
            .endif
            invoke ExitProcess, NULL        
    end start

O resultado é:

beef.thumb.png.879cf9482ef9b2711f5336b2513bc927.png

Claro que para quem está estudando Assembly é legal também trabalhar sem as macros e para isso o MASM funciona normalmente - basta usar as instruções direto. Você tem o poder da escolha se vai querer seus fontes raiz ou Nutella. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa, cara!

Eu vou testar mais tarde. Valeu por compartilhar. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

Entre para seguir isso  

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×