Калькулятор с действиями умножения и деления - Assembler
Формулировка задачи:
Всем привет! Возникла необходимость написать калькулятор на форме с действиями умножения и деления.
Компилироваться должно в MASM32
В верхнее поле должен вводиться первый множитель/делимое, в среднее второй множитель/делимое, в нижнем - результат.
После заполнения двух строк необходимо нажать на кнопку "DIV" или "MUL" для вывода в последнюю строку результата
Очень надеюсь на Вашу помощь!
Код программы:
PS IDIV/IMUL сделаю по аналогии сам.
.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\gdi32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD RGB macro red,green,blue xor eax,eax mov ah,blue shl eax,8 mov ah,green mov al,red endm szText MACRO Name,Text:VARARG LOCAL lbl jmp lbl Name db Text,0 lbl: ENDM .const Edit3ID equ 8 Button5ID equ 7 Button4ID equ 6 Button3ID equ 5 Button2ID equ 4 Button1ID equ 3 Edit2ID equ 2 Edit1ID equ 1 .data? hwndEdit3 HWND ? hwndButton5 HWND ? hwndButton4 HWND ? hwndButton3 HWND ? hwndButton2 HWND ? hwndButton1 HWND ? hwndEdit2 HWND ? hwndEdit1 HWND ? hFontN HWND ? hInstance HINSTANCE ? CommandLine LPSTR ? .data TextEdit3 db 0,0 TextButton5 db "Result",0 TextButton4 db "IMUL",0 TextButton3 db "MUL",0 TextButton2 db "IDIV",0 TextButton1 db "DIV",0 TextEdit2 db 0,0 TextEdit1 db 0,0 szFontName db "MS Sans Serif",0 lf LOGFONT <> ;_______________ ClassName db "mbuilder",0 BtnClName db "button",0 StatClName db "static",0 EditClName db "edit",0 LboxClName db "listbox",0 CboxClName db "combobox",0 ReditClName db "richedit",0 RichEditLib db "riched32.dll",0 FormCaption db "Калькулятор",0 ;_______________ .code start: invoke GetModuleHandle,NULL mov hInstance,eax invoke GetCommandLine invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc :WNDCLASSEX LOCAL msg :MSG LOCAL hwnd :HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style,CS_BYTEALIGNCLIENT mov wc.lpfnWndProc,offset WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx,addr wc invoke CreateWindowEx,0,ADDR ClassName,ADDR FormCaption,WS_SYSMENU or WS_SIZEBOX,259,124,269,252,0,0,hInst,0 mov hwnd,eax INVOKE ShowWindow,hwnd,SW_SHOWNORMAL INVOKE UpdateWindow,hwnd .WHILE TRUE invoke GetMessage,ADDR msg,0,0,0 .BREAK .IF (!eax) invoke TranslateMessage,ADDR msg invoke DispatchMessage,ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .IF uMsg == WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg == WM_CREATE invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextEdit3,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,56,160,121,24,hWnd,Edit3ID,hInstance,0 mov hwndEdit3,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton5,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,72,120,91,25,hWnd,Button5ID,hInstance,0 mov hwndButton5,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton4,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,184,48,43,25,hWnd,Button4ID,hInstance,0 mov hwndButton4,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton3,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,128,48,43,25,hWnd,Button3ID,hInstance,0 mov hwndButton3,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton2,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,72,48,43,25,hWnd,Button2ID,hInstance,0 mov hwndButton2,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton1,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,24,48,35,25,hWnd,Button1ID,hInstance,0 mov hwndButton1,eax invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextEdit2,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,56,88,121,24,hWnd,Edit2ID,hInstance,0 mov hwndEdit2,eax invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextEdit1,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,56,16,121,24,hWnd,Edit1ID,hInstance,0 mov hwndEdit1,eax invoke lstrcpy,addr lf.lfFaceName,addr szFontName mov lf.lfWeight,500 mov lf.lfHeight,-11 invoke CreateFontIndirect,addr lf mov hFontN,eax invoke SendMessage,hwndEdit3,WM_SETFONT,hFontN,1 invoke SendMessage,hwndEdit2,WM_SETFONT,hFontN,1 invoke SendMessage,hwndEdit1,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton5,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton4,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton3,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton2,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton1,WM_SETFONT,hFontN,1 .ELSEIF uMsg == WM_COMMAND mov eax,wParam .IF lParam != 0 .IF ax == Button5ID shr eax,16 .IF ax == BN_CLICKED invoke MessageBox,hWnd,addr TextButton5,0,MB_ICONINFORMATION .ENDIF .ELSEIF ax == Button4ID shr eax,16 .IF ax == BN_CLICKED invoke MessageBox,hWnd,addr TextButton4,0,MB_ICONINFORMATION .ENDIF .ELSEIF ax == Button3ID shr eax,16 .IF ax == BN_CLICKED invoke MessageBox,hWnd,addr TextButton3,0,MB_ICONINFORMATION .ENDIF .ELSEIF ax == Button2ID shr eax,16 .IF ax == BN_CLICKED invoke MessageBox,hWnd,addr TextButton2,0,MB_ICONINFORMATION .ENDIF .ELSEIF ax == Button1ID shr eax,16 .IF ax == BN_CLICKED invoke MessageBox,hWnd,addr TextButton1,0,MB_ICONINFORMATION .ENDIF .ENDIF .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start
Решение задачи: «Калькулятор с действиями умножения и деления»
textual
Листинг программы
.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\gdi32.inc include \masm32\include\comdlg32.inc include \masm32\include\shell32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\masm32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD RGB macro red,green,blue xor eax,eax mov ah,blue shl eax,8 mov ah,green mov al,red endm szText MACRO Name,Text:VARARG LOCAL lbl jmp lbl Name db Text,0 lbl: ENDM .const Edit3ID equ 8 Button5ID equ 7 Button4ID equ 6 Button3ID equ 5 Button2ID equ 4 Button1ID equ 3 Edit2ID equ 2 Edit1ID equ 1 .data? hwndEdit3 HWND ? hwndButton5 HWND ? hwndButton4 HWND ? hwndButton3 HWND ? hwndButton2 HWND ? hwndButton1 HWND ? hwndEdit2 HWND ? hwndEdit1 HWND ? hFontN HWND ? hInstance HINSTANCE ? CommandLine LPSTR ? .data TextEdit3 db 0,0 TextButton5 db "Result",0 TextButton4 db "IMUL",0 TextButton3 db "MUL",0 TextButton2 db "IDIV",0 TextButton1 db "DIV",0 TextEdit2 db 0,0 TextEdit1 db 0,0 szFontName db "MS Sans Serif",0 lf LOGFONT <> buff1 dw 128 dup (?);**** buff2 dw 128 dup (?);**** buff3 dw 128 dup (?);**** ifmt db "%d", 0 ;<br> ClassName db "mbuilder",0 BtnClName db "button",0 StatClName db "static",0 EditClName db "edit",0 LboxClName db "listbox",0 CboxClName db "combobox",0 ReditClName db "richedit",0 RichEditLib db "riched32.dll",0 FormCaption db "Калькулятор",0 ;<br> .code start: ;invoke GetWindowTextA, 1001, addr buff1, 10;****** ;invoke GetWindowTextA, 1001, addr buff2, 10;****** invoke GetModuleHandle,NULL mov hInstance,eax invoke GetCommandLine invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc :WNDCLASSEX LOCAL msg :MSG LOCAL hwnd :HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style,CS_BYTEALIGNCLIENT mov wc.lpfnWndProc,offset WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInst pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx,addr wc invoke CreateWindowEx,0,ADDR ClassName,ADDR FormCaption,WS_SYSMENU or WS_SIZEBOX,259,124,269,252,0,0,hInst,0 mov hwnd,eax INVOKE ShowWindow,hwnd,SW_SHOWNORMAL INVOKE UpdateWindow,hwnd .WHILE TRUE invoke GetMessage,ADDR msg,0,0,0 .BREAK .IF (!eax) invoke TranslateMessage,ADDR msg invoke DispatchMessage,ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .IF uMsg == WM_DESTROY invoke PostQuitMessage,NULL .ELSEIF uMsg == WM_CREATE invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextEdit3,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,56,160,121,24,hWnd,Edit3ID,hInstance,0 mov hwndEdit3,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton5,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,72,120,91,25,hWnd,Button5ID,hInstance,0 mov hwndButton5,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton4,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,184,48,43,25,hWnd,Button4ID,hInstance,0 mov hwndButton4,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton3,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,128,48,43,25,hWnd,Button3ID,hInstance,0 mov hwndButton3,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton2,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,72,48,43,25,hWnd,Button2ID,hInstance,0 mov hwndButton2,eax invoke CreateWindowEx,0,ADDR BtnClName,ADDR TextButton1,WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,24,48,35,25,hWnd,Button1ID,hInstance,0 mov hwndButton1,eax invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextEdit2,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,56,88,121,24,hWnd,Edit2ID,hInstance,0 mov hwndEdit2,eax invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClName,ADDR TextEdit1,WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or WS_VISIBLE,56,16,121,24,hWnd,Edit1ID,hInstance,0 mov hwndEdit1,eax invoke lstrcpy,addr lf.lfFaceName,addr szFontName mov lf.lfWeight,500 mov lf.lfHeight,-11 invoke CreateFontIndirect,addr lf mov hFontN,eax invoke SendMessage,hwndEdit3,WM_SETFONT,hFontN,1 invoke SendMessage,hwndEdit2,WM_SETFONT,hFontN,1 invoke SendMessage,hwndEdit1,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton5,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton4,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton3,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton2,WM_SETFONT,hFontN,1 invoke SendMessage,hwndButton1,WM_SETFONT,hFontN,1 .ELSEIF uMsg == WM_COMMAND mov eax,wParam .IF lParam != 0 .IF ax == Button5ID shr eax,16 .IF ax == BN_CLICKED invoke MessageBox,hWnd,addr TextButton5,0,MB_ICONINFORMATION .ENDIF .ELSEIF ax == Button4ID shr eax,16 .IF ax == BN_CLICKED ;imul--------------------- invoke GetWindowText, hwndEdit1, ADDR buff1, 128;берем данные из edit1 и заносим в buff1 invoke GetWindowText, hwndEdit2, ADDR buff2, 128;берем данные из edit2 и заносим в buff2 invoke atol, addr buff2;преобразование строки в буфере в число mov ebx, eax invoke atol, addr buff1;преобразование строки в буфере в число imul ebx;умножаем ax на bx invoke ltoa, eax, addr buff3;преобразование числа в строку invoke SetWindowText, hwndEdit3, ADDR buff3;берем данные из buff3 и заносим в edit3 ;imul--------------------- .ENDIF .ELSEIF ax == Button3ID shr eax,16 .IF ax == BN_CLICKED ;mul--------------------- invoke GetWindowText, hwndEdit1, ADDR buff1, 128;берем данные из edit1 и заносим в buff1 invoke GetWindowText, hwndEdit2, ADDR buff2, 128;берем данные из edit2 и заносим в buff2 invoke atodw, addr buff2;преобразование строки в буфере в число mov ebx, eax invoke atodw, addr buff1;преобразование строки в буфере в число mul ebx;умножаем ax на bx invoke dwtoa, eax, addr buff3;преобразование числа в строку invoke SetWindowText, hwndEdit3, ADDR buff3;берем данные из buff3 и заносим в edit3 ;mul--------------------- .ENDIF .ELSEIF ax == Button2ID shr eax,16 .IF ax == BN_CLICKED ;idiv--------------------- invoke GetWindowText, hwndEdit1, ADDR buff1, 128;берем данные из edit1 и заносим в buff1 invoke GetWindowText, hwndEdit2, ADDR buff2, 128;берем данные из edit2 и заносим в buff2 invoke atol, addr buff2;преобразование строки в буфере в число mov ebx, eax invoke atol, addr buff1;преобразование строки в буфере в число cdq idiv ebx;делим ax на bx invoke ltoa, eax, addr buff3;преобразование числа в строку invoke SetWindowText, hwndEdit3, ADDR buff3;берем данные из buff3 и заносим в edit3 ;idiv--------------------- .ENDIF .ELSEIF ax == Button1ID shr eax,16 .IF ax == BN_CLICKED ;div--------------------- invoke GetWindowText, hwndEdit1, ADDR buff1, 128;берем данные из edit1 и заносим в buff1 invoke GetWindowText, hwndEdit2, ADDR buff2, 128;берем данные из edit2 и заносим в buff2 invoke atodw, addr buff2;преобразование строки в буфере в число mov ebx, eax invoke atodw, addr buff1;преобразование строки в буфере в число mov edx, 0 div ebx;делим ax на bx invoke dwtoa, eax, addr buff3;преобразование числа в строку invoke SetWindowText, hwndEdit3, ADDR buff3;берем данные из buff3 и заносим в edit3 ;div--------------------- .ENDIF .ENDIF .ENDIF .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д