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: 22325		
 
 
				
			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заказ домаооо полигон плюсподключение ноутбукаказан алюминиевыйникос ресторан харьков лобановский александр