A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Criando uma mini-calculadora em Assembly para Win32

Qua

14

Jan

2009


20:06

(11 votos, média 4.45 de 5) 


Nível Intermediário

Bem, pessoal, este é o meu primeiro tutorial sobre alguma coisa, então, se for mal escrito ou mal explicado, já peço desculpas. Há um tempo atrás já tinha lido sobre assembly, mas não consegui aprender nada, aí dei uma lida em um tutorial da Vó Vicki, sobre como criar janelas em ASM e desenvolvi uma MINI-Calculadora em Assembly para Win32. Pode ter alguns erros ou falta programar algumas coisas, mas funciona e serve muito pra você aprimorar seus conhecimentos e muito mais.

Conhecimento preciso

Você precisa saber pelo menos o básico sobre como criar janelas em ASM, registrá-las e mostrá-las na tela. Se você tiver alguma dúvida sobre isto, veja o tutorial sobre como criar sua primeira janela. Clique no link abaixo:

Link para o tutorial sobre Janelas

Pronto! Você precisa deste tutorial para saber o básico sobre Janelas.

O programa que foi usado para fazer o desenvolvimento do aplicativo foi o Masm32, então acredito que você vai precisar dele também ou algum outro de sua preferência. Ah, e com certeza você também precisa de conhecimento em Assembly, não muito, mas você precisa.

Começando

Mini-calculadora

Eu sempre quis fazer primeiros algumas coisas para depois aprender como elas funcionam, mas não façam isso. Se você não souber nada ou pouca coisa sobre como criar janelas, volte um pouco e leia o tutorial indicado.

Bem, então vamos ver o que vai ser feito para ficarmos logo por dentro de tudo!

Essa aí seria a nossa calculadora, mas é claro que, depois de terminada, você pode implementar algumas coisas a mais como um menu com uma About Box, mas isto será feito em outra ocasião por você mesmo. Vamos primeiro tentar desenvolver esta calculadora básica.

Primeiro começamos com o cabeçalho do programa e, nesta calculadora, você não precisa mais do que instruções do processador .386. Então você já sabe o que fazer, né?

Aqui começa o código começa:

.386 .MODEL Flat, StdCall Option casemap:none

Logo no começo iremos precisar apenas das bibliotecas user32.lib e Kernel32.lib. Então, continuando com o código:

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

Agora vamos inserir o protótipo Gerenciador_Janela:

Gerenciador_Janela proto :DWORD, :DWORD, :DWORD, :DWORD

Você pode chamar esse protótipo da forma que quiser, desde que você saiba que ele servirá de modelo para o procedimento que criaremos mais à frente para gerenciar a janela smile

Como sabemos, a seguir vêm as variáveis inicializadas. No momento precisamos apenas das principais para criarmos a janela onde ficarão os botões. Indicamos o título da janela e o nome da classe da janela:

DATA Titulo_Janela db "Calculadora em ASM", 0 Classe_Janela db "Form1",0

A seguir vem o Handle de novas janelas e a Linha de Comando da janela (a linha de comando é opcional, mas, por via das dúvidas, vamos colocá–la), e depois os Handles dos botões e do edit: .DATA? Handle_Janela DWORD ? LinhaComando DWORD ?

Agora vem o código propriamente dito:

.CODE Inicio: Invoke GetModuleHandle, NULL Mov Handle_Janela, eax Invoke GetCommandLine Mov LinhaComando, eax Invoke Gerenciador_Janela, Handle_Janela, NULL, LinhaComando, SW_SHOWDEFAULT Invoke ExitProcess, 0

Programa começado, agora precisaremos escrever o procedimento que gerenciará nossa janela, criando-a e registrando-a.

Gerenciador_Janela proc hInstance :DWORD, hInstAntiga :DWORD, LnComando :DWORD, Tipo_Janela: DWORD

Nomearei a classe da minha janela de "wnd", abreviação de Window.

LOCAL wnd: WNDCLASSEX LOCAL Janela: HWND LOCAL Mensagem: MSG ;;Criando a janela e registrando mov wnd.cbSize, SIZEOF WNDCLASSEX mov wnd.style, CS_HREDRAW or CS_VREDRAW mov wnd.lpfnWndProc, offset GerenteMensagem mov wnd.cbClsExtra, NULL mov wnd.cbWndExtra, NULL push Handle_Janela pop wnd.hInstance invoke LoadIcon, NULL, IDI_WINLOGO mov wnd.hIcon, eax mov wnd.hIconSm, eax invoke LoadCursor, NULL, IDC_ARROW mov wnd.hCursor, eax mov wnd.hbrBackground, COLOR_BTNFACE+1 mov wnd.lpszMenuName, NULL mov wnd.lpszClassName, OFFSET Classe_Janela invoke RegisterClassEx, ADDR wnd

Bem, no tutorial de janelas você aprendeu a chamar a API do Windows (CreateWindowEx). Espero que você tenha entendido ela bem, por que nós a usaremos para criar os botões e os edits.

invoke CreateWindowEx, NULL, ADDR Classe_Janela, ADDR Titulo_Janela,WS_OVERLAPPEDWINDOW, 433, 302, 230,190, NULL, NULL, hInstance, NULL

Você talvez deva ter achado aqueles números na chamada estranhos, mas, para refrescar a memória, eles significam:

  • 433: Distância do começo de sua janela, que é o seu lado esquerdo, até o início esquerdo da tela do seu computador.
  • 302: Distância do topo de sua janela até o topo da tela do seu computador.
  • 230: Dimensão da largura da sua janela.
  • 190: Dimensão da Altura da sua janela.

Você pode defini-los como quiser.

mov Janela, eax invoke ShowWindow, Janela, SW_SHOWNORMAL invoke UpdateWindow, Janela .WHILE TRUE invoke GetMessage, ADDR Mensagem, NULL, 0,0 .BREAK .IF (eax < 1) invoke TranslateMessage, ADDR Mensagem invoke DispatchMessage, ADDR Mensagem .ENDW mov eax, Mensagem.wParam ret Gerenciador_Janela endp

Informações adicionais