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
| ; Фирма "Сахарок" продала M тонн сахара по цене 12 руб./кг
;и получила прибыль, равную N%.
;Какую прибыль в рублях получила данная фирма?
format PE GUI 4.0 ;специальный формат исполнимых файлов для Windows — формат PE (Portable Executable)
entry start
include '\win32a.inc' ; подключаем библиотеку win32a.inc (необходимо указать точный путь к файлу win32a.inc)
;include 'INCLUDE\win32a.inc'
ID_NACHAL = 101 ; дескриптор для строки ввода закупленного сахара
ID_PROCENT = 102 ; дескриптор для строки ввода испорченного сахара
section '.data' data readable writeable ; блок описания используемых в программе данных
nachal rb 10 ; зарезервируем 10 байт для ввода начального сахара
procent rb 10 ; зарезервируем 10 байт для ввода процента прибыли
caption db 'Ответ',0 ;заголовок для окна с ответом
message db 'Прибыль в рублях ',0 ; шаблон текста ответа
sys dd 10 ; переменная для перевода из цифрового формата в текстовый в десятичной системе счисления
sto dd 10 ; переменная для умножения на 10
vvv dd 1200
section '.code' code readable executable ; блок описания кода программы
start:
xor eax,eax ;ЕАХ=0
invoke DialogBoxParam,eax,37,HWND_DESKTOP,DialogProc,0 ;открываем окно используя процедуру DialogProc
or eax,eax
jz exit
lea esi, [nachal]
call StrToInt
mov ebx, eax
lea esi, [procent]
call StrToInt
mul [vvv]
mul ebx
mov ebx, eax
lea esi, [message+17] ;ESI=адрес строки message+17 (для вывода результата в шаблон ответа)
call IntToStr ;вызов процедуры перевода целого числа из регистра EAX в строку по адресу из регистра ESI
invoke MessageBox,HWND_DESKTOP,message,caption,MB_OK ;api функция вывода сообщения на экран
exit:
invoke ExitProcess,0 ; api функция для завершения программы
proc IntToStr; eax - число, esi - адрес строки для вывода
pushad
mov ebx,10
xor ecx,ecx
;------ загоняем в стек, начиная с младших разрядов
start1:
cmp eax,0
je end1
xor edx,edx
div ebx
or dl,30h
push edx
inc ecx
jmp start1
end1:
;------ читаем из стека в буфер
start3:
cmp ecx,0
je end3
pop eax
mov [esi],al
inc esi
dec ecx
jmp start3
end3:
popad
return
endp
;********************************************************************************************
proc StrToInt ;(esi-строка):eax-число,esi-остаток строки,ecx-прочитано цифр enter
xor eax,eax ; Результат
xor ecx,ecx ; Счетчик числа символов
;mov [sys],10 ; Определяет систему счисления
.l:
mul [sys]
;or edx,edx
;jnz .exit
; считываем символ из строки
movzx edx,byte [esi]
sub dl,30h
jc .err
cmp dl,9h
; если dl меньше 9h, то переход дальше
jle .next
sub dl,7h
.next:
cmp dl,byte [sys]
jnc .err
add eax,edx
jc .err2
; Увеличиваем ecx (число символов на единицу)
inc ecx
; Смещаем указатель на следующий символ
inc esi
; Повторяем все со следующим символом
jmp .l
.err2:
sub eax,edx
.err:
xor edx,edx
.exit:
div [sys]
return
endp
proc DialogProc,hwnddlg,msg,wparam,lparam
push ebx esi edi
cmp [msg],WM_INITDIALOG
je processed
cmp [msg],WM_COMMAND
je wmcommand
cmp [msg],WM_CLOSE
je wmclose
xor eax,eax
jmp finish
wmcommand:
cmp [wparam],BN_CLICKED shl 16 + IDCANCEL
je wmclose
cmp [wparam],BN_CLICKED shl 16 + IDOK
jne processed
invoke GetDlgItemText,[hwnddlg],ID_NACHAL ,nachal,3 ; api функция получения 3-х байт текста в переменную zakupl из объекта имеющего идентификатор ID_ZAKUPL
invoke GetDlgItemText,[hwnddlg],ID_PROCENT,procent,3 ; api функция получения 3-х байт текста в переменную isporch из объекта имеющего идентификатор ID_ISPORCH
topmost_ok:
invoke EndDialog,[hwnddlg],1 ; api функция завершения диалога с введенными аргументами из формы (параметр 1)
jmp processed
wmclose:
invoke EndDialog,[hwnddlg],0 ; api функция аварийного завершения диалога нажатием на кнопку cancel (параметр 0)
processed:
mov eax,1
finish:
pop edi esi ebx
return
endp
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'
import kernel,\
GetModuleHandle,'GetModuleHandleA',\
ExitProcess,'ExitProcess'
import user,\
DialogBoxParam,'DialogBoxParamA',\
CheckRadioButton,'CheckRadioButton',\
GetDlgItemText,'GetDlgItemTextA',\
IsDlgButtonChecked,'IsDlgButtonChecked',\
MessageBox,'MessageBoxA',\
EndDialog,'EndDialog'
section '.rsrc' resource data readable
directory RT_DIALOG,dialogs
resource dialogs,\
37,LANG_RUSSIAN,demonstration \
dialog demonstration,'Laboratornay rabota 1',70,70,190,100,WS_CAPTION ; задаем заголовок и размеры окна приложения
dialogitem 'STATIC','Kol-vo nachalnogo sahara:',1,10,10,170,8,WS_VISIBLE ; задаем заголовок строки ее координаты, устанавливаем атрибут "видимая"
dialogitem 'EDIT','',ID_NACHAL,110,9,15,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP ;
dialogitem 'STATIC','procent pribili :',1,10,40,170,8,WS_VISIBLE ;
dialogitem 'EDIT','',ID_PROCENT,110,39,15,13,WS_VISIBLE+WS_BORDER+WS_TABSTOP ;
dialogitem 'BUTTON','OK',IDOK,85,75,45,15,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON ;
dialogitem 'BUTTON','C&ancel',IDCANCEL,135,75,45,15,WS_VISIBLE+WS_TABSTOP ;
enddialog |