Разработка приложения на языке Assembler
Разработка приложения на языке Assembler
1. Постановка задачи
Написать на языке Ассемблер
программу для управления динамиком системного блока. Обеспечить установку
частоты и длительности формируемых сигналов.
Цель работы - разработка программы
для управления системным динамиком.
2. Алгоритм работы
приложения
Программа работает по алгоритму,
изображённому на рисунке 1.
Рисунок 1 - Алгоритм работы
При запуске, приложение
прорисовывает главное окно и ожидает нажатия кнопки. При нажатии, срабатывает
функция GetDlgItemInt, которая получает значения из контролов и передаёт в регистр eax. Имеет четыре параметра:
- hDlg - дескриптор
диалогового окна, который содержит интересующий орган управления;
nIDDlgItem - устанавливает идентификатор органа управления, текст которого
должен быть преобразован;
lpTranslated - указатель на переменную, которая получает значение успешного
завершения или значение сбоя (успешное завершение обозначается - ИСТИНА (TRUE), сбой обозначается как
ЛОЖЬ (FALSE)), если этот параметр - ПУСТО (NULL), функция не возвращает
информацию об успехе или сбое;
bSigned - устанавливает, должна ли функция вначале проверять текст на
знак минус и возвратить значение целого числа со знаком, если она находит этот
минус (значение ИСТИНА (TRUE) устанавливает, что это должно быть сделано, ЛОЖЬ (FALSE), - что не должно).
Затем полученное значение
передаётся командой mov из регистра eax в нужную переменную. Для управления динамиком системного блока
(бипером), используется библиотечная функция beep. Данная функция имеет два параметра:
dwFreq - частота звука в
герцах, допустимый диапазон - от 37 до 32 767 Гц;
- dwDuration - продолжительность
звука в миллисекундах;
Чтобы обеспечить установку частоты и
продолжительности, необходимо на форму добавить два контрола Edit с установленным
параметром ES_NUMBER, чтобы предотвратить ввод символов, отличных от цифр. Для
хранения и передачи в функцию значений, были созданы две переменные freq_var и dur_var (частота и длительность
соответсвенно) с типом dd (dword). Для проигрывания звука размещена кнопка play с надписью
«Воспроизвести».
3. Пример работы приложения
Внешний вид приложения изображён на
рисунке 2.
Рисунок 2 - Внешний вид
приложение алгоритм программа
Пользователь вводит значения частоты
звука в верхнее поле, длительности - в нижнее. При нажатии на кнопку «Воспроизвести»,
из системеного динамика (или звукого устройства по-умолчанию, в случае системы Windows 7) будет звучать тон
заданной частоты, в течении заданного времени, однако, при установке частоты
меньше 35 Гц или выше 19 кГц звук слышен не будет из-за особенностей
человеческого слуха.
Список
использованных источников
1. IDE MASM Builder [Электронный ресурс]. - Режим доступа: http://www.digitaction.com/index.php/products/masm-builder-integrated-development-environment-for-masm32.html.
. Beep function (Windows) [Электронный ресурс]. - Режим доступа: http://msdn.microsoft.com/en-us/library/windows/desktop/ms679277% 28v=vs.85% 29.aspx, свободный.
3 GetDlgItemInt (Windows) [Электронный ресурс]. - Режим доступа: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645485% 28v=vs.85% 29.aspx, свободный.
Приложение
Листинг программы
flat, stdcall option
casemap:none\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\masm32\procs\controls\baumanets.lib WinMain
proto:DWORD,:DWORD,:DWORD,:DWORDmacro red, green, blue eax, eax ah,
blue eax, 8 ah, green al, redMACRO Name, Text:VARARG lbl lbldb
Text, 0: equ 5 equ 4ID equ 3 equ 2ID equ 1? HWND? HWND? HWND? HWND? HWND? HWND? HINSTANCE? LPSTR?LOGFONT
<> db «Воспроизвести», 0 db «0», 0 db «Длительность, мсек», 0 db
«0», 0 db «Частота, Гц», 0 db «MS Sans Serif», 0
;_______________ 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
|
;_______________
|
|
freq_var
|
dd 0
|
|
|
dur_var
|
|
dd 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
|
: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, 209,89,255,130,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
CreateWindowEx, 0, ADDR
BtnClName, ADDR Textplay, WS_CHILD or BS_DEFPUSHBUTTON or WS_VISIBLE,
0,72,243,25, hWnd, playID, hInstance, 0
mov
|
|
hwndplay,
eax
|
|
invoke CreateWindowEx,
WS_EX_CLIENTEDGE, ADDR EditClName, ADDR
|
Textdur,
WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or ES_NUMBER or
|
WS_VISIBLE,
120,40,121,22, hWnd, durID, hInstance, 0
|
mov
|
|
hwnddur,
eax
|
|
invoke CreateWindowEx,
WS_EX_LEFT, ADDR StatClName, ADDR
|
TextLabel2,
WS_CHILD or SS_LEFT or SS_NOTIFY or
|
WS_VISIBLE,
8,40,109,18, hWnd, Label2ID, hInstance, 0
|
mov
|
|
hwndLabel2,
eax
|
|
invoke CreateWindowEx,
WS_EX_CLIENTEDGE, ADDR EditClName, ADDR
|
WS_VISIBLE,
120,8,121,22, hWnd, freqID, hInstance, 0
|
mov
|
|
hwndfreq,
eax
|
|
invoke CreateWindowEx,
WS_EX_LEFT, ADDR StatClName, ADDR
|
TextLabel1,
WS_CHILD or SS_LEFT or SS_NOTIFY or
|
WS_VISIBLE, 8,8,64,18,
hWnd, Label1ID, hInstance, 0
|
mov
|
|
hwndLabel1,
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,
hwnddur, WM_SETFONT, hFontN, 1
|
invoke
|
SendMessage,
hwndfreq, WM_SETFONT, hFontN, 1
|
invoke
|
SendMessage,
hwndLabel2, WM_SETFONT, hFontN, 1
|
invoke
|
SendMessage,
hwndLabel1, WM_SETFONT, hFontN, 1
|
invoke
|
SendMessage,
hwndplay, WM_SETFONT, hFontN, 1
|
ELSEIF uMsg ==
WM_COMMAND
|
|
mov
|
eax,
wParam
|
|
IF lParam!= 0
|
|
|
IF ax == playID
|
|
|
|
shr eax, 16
|
|
|
|
IF ax == BN_CLICKED
|
|
|
invoke
|
GetDlgItemInt,
hWnd, freqID, 0,1
|
|
|
mov freq_var,
eax
|
|
|
invoke
|
GetDlgItemInt,
hWnd, durID, 0,1
|
|
|
mov dur_var,
eax
|
|
|
invoke Beep, freq_var,
dur_var
|
|
|
ENDIF
|
|
|
ENDIF
|
|
ENDIF
|
|
|
ELSE
|
|
|
|
invoke
|
DefWindowProc,
hWnd, uMsg, wParam, lParam
|
ret
|
|
|
|
ENDIF
|
|
|
|
xor
|
eax,
eax
|
|
ret
|
|
|
|
WndProc endp
|
|
|
|
end start
|
|
|
|