Калькулятор с действиями умножения и деления - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем привет! Возникла необходимость написать калькулятор на форме с действиями умножения и деления. Компилироваться должно в MASM32 В верхнее поле должен вводиться первый множитель/делимое, в среднее второй множитель/делимое, в нижнем - результат. После заполнения двух строк необходимо нажать на кнопку "DIV" или "MUL" для вывода в последнюю строку результата Очень надеюсь на Вашу помощь! Код программы:
    .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
PS IDIV/IMUL сделаю по аналогии сам.

Решение задачи: «Калькулятор с действиями умножения и деления»

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.231 из 5
Похожие ответы