С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Encrypted1010
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 6
1

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

22.12.2017, 17:03. Просмотров 851. Ответов 5
Метки нет (Все метки)

Всем привет! Возникла необходимость написать калькулятор на форме с действиями умножения и деления.
Компилироваться должно в MASM32
В верхнее поле должен вводиться первый множитель/делимое, в среднее второй множитель/делимое, в нижнем - результат.
После заполнения двух строк необходимо нажать на кнопку "DIV" или "MUL" для вывода в последнюю строку результата
Очень надеюсь на Вашу помощь!
Код программы:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
    .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 сделаю по аналогии сам.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2017, 17:03
Ответы с готовыми решениями:

Приоритет операций умножения и деления..
Здравствуйте..!! Помогите пожалуйста определиться.. Нужно посчитать выражение y = a - b + c / d *...

Функция без операций умножения и деления
Приветствую всех... Парни, помогите с лабой... задание: нужно реализовать функцию без операций...

Как реализовать преобразование упакованных чисел в неупакованные для операций деления и умножения?
Здравствуйте! Подскажите как реализовать преобразование упакованных чисел в неупакованные для...

Выполнить операции беззнакового умножения и целочисленного беззнакового деления
Лабораторная работа по Архитектуре ЭВМ №2 Задание 1. Создать 3 переменные (размер 1 байт),...

Калькулятор! разность, деления и умножения не работает????!!!
Помогите! здесь + работает, разность, деления и умножения не работает? unit Unit1; interface ...

5
Encrypted1010
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 6
23.12.2017, 04:25  [ТС] 2
Помогите найти ошибку, калькулятор должен умножать и делить корректно
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
    .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
;_______________
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 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 htodw, addr buff1;преобразование строки в буфере в число
                    ;invoke htodw, addr buff2;преобразование строки в буфере в число
                    ;mov eax, buff1;из buff1 вносим в регистр
                    mov ebx, buff2;из buff2 вносим в регистр
                    imul ebx;умножаем ax на bx
                    mov buff3, ebx;вносим регистр в buff3
                    invoke dwtoa, ebx, 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
                    mov AX, buff1;из buff1 вносим в регистр
                    mov BX, buff2;из buff2 вносим в регистр
                    mul BX;умножаем ax на bx
                    mov buff3, BX;вносим регистр в 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
                    mov ax, buff1;из buff1 вносим в регистр
                    mov bx, buff2;из buff2 вносим в регистр
                    idiv bx;делим ax на bx
                    mov buff3, cx;вносим регистр в 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
                    mov ax, buff1;из buff1 вносим в регистр
                    mov bx, buff2;из buff2 вносим в регистр
                    div bx;делим ax на bx
                    mov buff3, cx;вносим регистр в 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
0
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
23.12.2017, 12:25 3
Впечатление, что вы не выполняете преобразование строки в число.
0
Encrypted1010
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 6
23.12.2017, 13:20  [ТС] 4
ФедосеевПавел, так и есть, а как это правильно реализовать? Можете помочь?
Код закомментирован. Но, если преобразовать, то вычисления будут вестись некорректно.
0
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
23.12.2017, 14:09 5
Лучший ответ Сообщение было отмечено Encrypted1010 как решение

Решение

Я несколько запутался с тем, что должно получаться при знаковых операциях и беззнаковых. Разберитесь самостоятельно.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
    .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
;_______________
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 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
1
Encrypted1010
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 6
23.12.2017, 15:01  [ТС] 6
ФедосеевПавел, конечно! Огромнейшее Вам спасибо!
0
23.12.2017, 15:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2017, 15:01

Реализовать калькулятор с функциями умножения, деления, сложения и вычитания
Ребятки, спасайте!Учусь на 1 курсе на программиста.Дали курсовик с темой написать калькулятор...

Приложение-калькулятор для умножения и деления десятичных чисел
Приложение-калькулятор для умножения и деления десятичных чисел. В главной форме имеются кнопки...

Примитивный калькулятор (два операнда и операции сложения, вычитания, умножения и деления)
Здравствуйте. Вот пытался написать примитивный калькулятор, которые будет +, -, * и / два...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru