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) 


Comentários

Tutorial grande, né? Eu achei, mas não sei se você percebeu, ainda ficou faltando o código de dois botões, o CE e o C. Então os deixo como atividade para vocês fazerem. Dou uma dica, um deles apaga somente o Valor2 e o outro zera tudo. Então até o próximo tutorial. Espero que vocês tenham aprendido alguma coisa galera, blz? Segue abaixo o código fonte completo da Calculadora.

Código fonte completo

.386 .MODEL Flat, StdCall Option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib Gerenciador_Janela proto :DWORD, :DWORD, :DWORD, :DWORD Soma proto :DWORD, :DWORD Subtracao proto :DWORD, :DWORD Multiplicacao proto :DWORD, :DWORD Divisao proto :DWORD, :DWORD .DATA Titulo_Janela db "Calculadora em ASM", 0 Classe_Janela db "Form1",0 Edit_Classe db "Edit", 0 Botao_Classe db "Button", 0 Botao1_Titulo db "1",0 Botao2_Titulo db "2", 0 Botao3_Titulo db "3", 0 Botao4_Titulo db "4", 0 Botao5_Titulo db "5", 0 Botao6_Titulo db "6", 0 Botao7_Titulo db "7", 0 Botao8_Titulo db "8", 0 Botao9_Titulo db "9", 0 Botao0_Titulo db "0", 0 BotaoVirgulaTitulo db ",", 0 BotaoIgualTitulo db "=", 0 BotaoMaisTitulo db "+", 0 BotaoMenosTitulo db "-", 0 BotaoMultiplicarTitulo db "*", 0 BotaoDividirTitulo db "/", 0 BotaoCETitulo db "CE", 0 BotaoCTitulo db "C", 0 Texto_Msg db "É impossível dividir por zero!", 0 Titulo_Msg db "Aviso!", 0 .DATA? Handle_Janela DWORD ? LinhaComando DWORD ? EditHandle DWORD ? Botao1_Handle DWORD ? Botao2Handle DWORD ? Botao3Handle DWORD ? Botao4Handle DWORD ? Botao5Handle DWORD ? Botao6Handle DWORD ? Botao7Handle DWORD ? Botao8Handle DWORD ? Botao9Handle DWORD ? Botao0Handle DWORD ? BotaoVirgulaHandle DWORD ? BotaoMaisHandle DWORD ? BotaoMenosHandle DWORD ? BotaoMultiplicarHandle DWORD ? BotaoDividirHandle DWORD ? BotaoIgualHandle DWORD ? BotaoCEHandle DWORD ? BotaoCHandle DWORD ? Edit_Texto db 100 dup (?) Endereco_String DWORD ? Operacao DWORD ? Valor1 DWORD ? Valor2 DWORD ? Resultado DWORD ? .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 Gerenciador_Janela proc hInstance:DWORD, hInstAntiga:DWORD, LnComando:DWORD, Tipo_Janela:DWORD LOCAL wnd: WNDCLASSEX LOCAL Janela: HWND LOCAL Mensagem: MSG 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 hInstance 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 invoke CreateWindowEx, NULL, ADDR Classe_Janela, ADDR Titulo_Janela,WS_OVERLAPPEDWINDOW, 433, 302, 230,190, NULL, NULL, hInstance, NULL 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 GerenteMensagem proc hWnd: DWORD, uMsg: UINT, wParam: WPARAM, lParam: LPARAM .IF uMsg==WM_DESTROY Invoke PostQuitMessage, NULL .ELSEIF uMsg == WM_CREATE invoke CreateWindowEx, NULL, ADDR Edit_Classe, NULL, WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL, 8, 8, 193, 21, hWnd, NULL, Handle_Janela, NULL mov EditHandle, eax Invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao1_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 8, 32, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao1_Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao2_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 48, 32, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao2Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao3_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 88, 32, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao3Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao4_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 8, 64, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao4Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao5_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 48, 64, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao5Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao6_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 88, 64, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao6Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao7_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 8, 96, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao7Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao8_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 48, 96, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao8Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao9_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 88, 96, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao9Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR Botao0_Titulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 8, 128, 33, 25, hWnd, NULL, Handle_Janela, NULL mov Botao0Handle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR BotaoVirgulaTitulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 48, 128, 33, 25, hWnd, NULL, Handle_Janela, NULL mov BotaoVirgulaHandle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR BotaoIgualTitulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 88, 128, 33, 25, hWnd, NULL, Handle_Janela, NULL mov BotaoIgualHandle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR BotaoMaisTitulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 128, 32, 33, 25, hWnd, NULL, Handle_Janela, NULL mov BotaoMaisHandle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR BotaoMenosTitulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 128, 64, 33, 25, hWnd, NULL, Handle_Janela, NULL mov BotaoMenosHandle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR BotaoMultiplicarTitulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 128, 96, 33, 25, hWnd, NULL, Handle_Janela, NULL mov BotaoMultiplicarHandle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR BotaoDividirTitulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 128, 128, 33, 25, hWnd, NULL, Handle_Janela, NULL mov BotaoDividirHandle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR BotaoCETitulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 168, 32, 33, 25, hWnd, NULL, Handle_Janela, NULL mov BotaoCEHandle, eax invoke CreateWindowEx, NULL, ADDR Botao_Classe, ADDR BotaoCTitulo, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON, 168, 64, 33, 25, hWnd, NULL, Handle_Janela, NULL mov BotaoCHandle, eax .ELSEIF uMsg==WM_COMMAND mov edx, lParam .if edx == Botao1_Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao1_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao2Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao2_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao3Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao3_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao4Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao4_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao5Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao5_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao6Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao6_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao7Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao7_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao8Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao8_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao9Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao9_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == Botao0Handle Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke lstrcat, ADDR Edit_Texto, ADDR Botao0_Titulo Mov Endereco_String, eax Invoke SetWindowText, EditHandle, [Endereco_String] .endif .if edx == BotaoMaisHandle Mov Operacao, 01h Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke atodw, ADDR Edit_Texto Mov Valor1, eax Invoke SetWindowText, EditHandle, NULL .endif .if edx == BotaoMenosHandle Mov Operacao, 02h Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke atodw, ADDR Edit_Texto Mov Valor1, eax Invoke SetWindowText, EditHandle, NULL .endif .if edx == BotaoMultiplicarHandle Mov Operacao, 03h Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke atodw, ADDR Edit_Texto Mov Valor1, eax Invoke SetWindowText, EditHandle, NULL .endif .if edx == BotaoDividirHandle Mov Operacao, 04h Invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 Invoke atodw, ADDR Edit_Texto Mov Valor1, eax ;;Movendo o valor convertido para a variável Valor1 Invoke SetWindowText, EditHandle, NULL .endif .if edx == BotaoIgualHandle invoke GetWindowText, EditHandle, ADDR Edit_Texto, 100 invoke atodw, ADDR Edit_Texto mov Valor2, eax .if Operacao == 01h Invoke Soma, Valor1, Valor2 .elseif Operacao == 02h Invoke Subtracao, Valor1, Valor2 .elseif Operacao == 03h Invoke Multiplicacao, Valor1, Valor2 .elseif Operacao == 04h .if Valor2 == 0 invoke MessageBox, hWnd, ADDR Texto_Msg, ADDR Titulo_Msg, MB_OK + MB_ICONEXCLAMATION invoke SetWindowText, EditHandle, NULL .elseif Invoke Divisao, Valor1, Valor2 .endif .endif .endif .ELSE invoke DefWindowProc, hWnd, uMsg, wParam, lParam ret .ENDIF xor eax, eax ret GerenteMensagem endp Soma proc Val1: DWORD, Val2: DWORD Push eax Push ebx Xor eax, eax Xor ebx, ebx Mov eax, Val1 Mov ebx, Val2 Add eax, ebx Mov Resultado, eax Invoke dwtoa, Resultado, ADDR Edit_Texto Invoke SetWindowText, EditHandle, ADDR Edit_Texto Xor eax, eax Mov Valor1, eax Mov Valor2, eax Mov Resultado, eax Pop ebx Pop eax ret Soma endp Subtracao proc Val1: DWORD, Val2: DWORD Push eax Push ebx Xor eax, eax Xor ebx, ebx ;;Zerando os valores dos dois registradores para receberem os valores Val1 e Val2 Mov eax, Val1 Mov ebx, Val2 ;; Agora fazendo a soma entre os dois SUB eax, ebx Mov Resultado, eax Invoke dwtoa, Resultado, ADDR Edit_Texto Invoke SetWindowText, EditHandle, ADDR Edit_Texto Xor eax, eax Mov Valor1, eax Mov Valor2, eax Mov Resultado, eax Pop ebx Pop eax ret Subtracao endp Multiplicacao proc Val1: DWORD, Val2: DWORD Push eax Push ebx Xor eax, eax Xor ebx, ebx Mov eax, Val1 Mov ebx, Val2 MUL ebx Mov Resultado, eax Invoke dwtoa, Resultado, ADDR Edit_Texto Invoke SetWindowText, EditHandle, ADDR Edit_Texto Xor eax, eax Mov Valor1, eax Mov Valor2, eax Mov Resultado, eax Pop ebx Pop eax ret Multiplicacao endp Divisao proc Val1: DWORD, Val2: DWORD push eax push ebx xor eax, eax xor ebx, ebx mov eax, Val1 mov ebx, Val2 Div ebx mov Resultado, eax invoke dwtoa, Resultado, ADDR Edit_Texto invoke SetWindowText, EditHandle, ADDR Edit_Texto xor eax, eax mov Valor1, eax mov Valor2, eax mov Resultado, eax pop ebx pop eax ret Divisao endp end Inicio

Contato com o autor

O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo.

O endereço de e-mail address está sendo protegido de spambots. Você precisa ativar o JavaScript enabled para vê-lo.

mfxbroker.comзаказ домаооо полигон плюсподключение ноутбукаказан алюминиевыйникос ресторан харьков лобановский александр

Informações adicionais