Informática Numaboa - Tutoriais e Programação
Criando uma mini-calculadora em Assembly para Win32
- Detalhes
-
Categoria: Assembly Numaboa (antigo oiciliS)
-
Atualização: Quinta, 15 Janeiro 2009 17:45
-
Autor: Felipe Costa
-
Acessos: 21433
Pagina 4 de 4
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заказ домаооо полигон плюсподключение ноутбукаказан алюминиевыйникос ресторан харьков лобановский александр