Все кнопки в гости к нам
Арифмометр у нас будет не очень сложным, всего 16 кнопок.
Для работы с кнопками мы создадим две переменные
stroka и
rezult.
Маленький нюанс - на нашем арифмометре (пока) не будет символа "точка". Как показало
предварительное знакомство с математической частью, вещественные (читай - дробные) числа -
это отдельный разговор.
Все кнопки можно разбить (условно) на три группы:
первая группа - это кнопки, отвечающие за добавление на дисплей цифр
0-1-2-3-4-5-6-7-8-9 , обязанности у них не очень сложные:
-- активировать
механизм добавления на дисплей символа, находящегося на кнопке (имени кнопки) и формировании
из них числа (строки)...это кнопки
полного цикла;
вторая группа - это кнопка отвечающие за "независимую" арифметическую операцию
- очистку дисплея
С, это кнопка
полного цикла;
третья группа - "зависимые" кнопки
"+","-","*",":","="; первые четыре кнопки
могут работать только в паре с пятой - будет использоватся
механизм
ветвления (
swith)...это кнопки
неполного цикла; каждая из кнопок арифметических действий будет
отвечать за механизм:
-- добавления 1-го набранного числа в регистр
ЕВХ;
-- перевода программы в процедуру очистки дисплея
cancel;
необходимо помнить, что каждая кнопка арифмометра
несёт специальную метку (
hbut...), "опознав" которую, кнопка "
=" запустит следующие
операции:
-- очистка дисплея;
-- добавление 2-го набранного числа в регистр
ЕВХ;
-- совершение действий, соответствующих символу на использованой кнопке;
-- добавления полученного числа-итога в буфер
stroka и вывода его на дисплей;
Плюс -
подключение процедур преобразования.
Программист с опытом может сказать, что
приведённого перечня операций - недостаточно. Трудно с этим не согласится. Просто, не стоит
забывать, что это будет
простой арифмометр и пользователь не будет забывать о
своевременной очистке дисплея. Вариант "на дурака"
мы учитывать не будем. Вопрос обработки ошибок в ассемблере - очень и очень...тонкий. И код
он усложняет - неимоверно. Если у кого-то возникнет желание добавить в код обработку возможных
ошибок - флаг вам в руки и попутного ветра !
Обработку кнопок лучше вынести в отдельные
процедуры...вам решать.
С кнопками, будем считать, разобрались -
вернёмся к среде создания нашего арифмометра. Поскольку - это Win32, мы будем пользоватся API-
функциями из файла
windows.inc. Опустим функции создания окна-арифмометра и окон-
компонентов. Выделим только те, что отвечают за работу:
GetWindowTextA(Wnd:hWnd,Str:PChar,MaxCount:Integer)
эта функция будет отвечать за "получение" с дисплея находящегося там символа, здесь:
Wnd - идентификатор окна или органа управления
Str - буфер принимающий строку
MaxCount - размер буфера Str
SetWindowTextA(Wnd:hWnd,Str:PChar)
эта функция будет
отвечать за добавление символов на дисплей, здесь:
Wnd - идентификатор окна или органа
управления
Str - строка (заканчивающаяся пустым символом)
Теперь мы можем
подумать за код, обслуживающий операции арифмометра.
Главное - часть этого кода
будет располагатся после метки
wmcommand. Не исключено, что другую часть кода придётся (для
читаемости) вынести в отделные процедуры.
Механизм ветвления в ассемблере выглядит как
последовательное сравнение:
...
wmcommand:
mov eax,hbut1 ;жмём на кнопку
cmp [ebp+14h],eax ;смотрим на какую ("1") *
je nabor ;обрабатываем эту кнопку
...
jmp exit
...
;* data.inc: hbut1 dd ?
Мы добавляем хэндл кнопки в ЕАХ и сравниваем его с содержимым, находящимся
по адресу [EBP+14h]. Если имеется совпадение параметров,
мы переходим к обработке данной кнопки:
...
nabor: ;формируем, на дисплее, строку из символов
push 15 ;размер буфера (data.inc)
push offset buf ;всё, что там есть
push [hedit]
call GetWindowTextA@12 содержимое дисплея --> eax
add eax,offset buf ;buf -+-> eax
push 15
push eax ;к содержимому eax (buf)...
push [EBP+14h] ;...добавляем символ кнопки (lParam --> hbut)
call GetWindowTextA@12
push offset buf
push [hedt]
call SetWindowTextA@8 ;выводим всё на дисплей
jmp exit
...
Заметим, что приведённый код мы используем только для обработки
цифровых
кнопок. Оберегаем пользователя от искушения вывести на дисплей символы
остальных кнопок.
дальше...
...назад