Разработка приложения на языке Assembler
Include masm32includewindows. inc include masm32includeuser32. inc include masm32includekernel32. inc include masm32includegdi32. inc include masm32includecomdlg32. inc include masm32includeshell32. inc includelib masm32libuser32. lib includelib masm32libkernel32. lib includelib masm32libgdi32. lib includelib masm32libcomdlg32. lib includelib masm32libshell32. lib. Написать на языке Ассемблер… Читать ещё >
Разработка приложения на языке 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.
2. 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, свободный.
Приложение
Листинг программы
model flat, stdcall option casemap: none
include masm32includewindows. inc include masm32includeuser32. inc include masm32includekernel32. inc include masm32includegdi32. inc include masm32includecomdlg32. inc include masm32includeshell32. inc includelib masm32libuser32. lib includelib masm32libkernel32. lib includelib masm32libgdi32. lib includelib masm32libcomdlg32. lib includelib masm32libshell32. lib
includelib masm32procscontrolsbaumanets. 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
playID equ 5
durID equ 4
Label2ID equ 3
freqID equ 2
Label1ID equ 1
data?
hFontN HWND?
hwndplay HWND?
hwnddur HWND?
hwndLabel2 HWND?
hwndfreq HWND?
hwndLabel1 HWND?
hInstance HINSTANCE?
CommandLine LPSTR?
data
lf LOGFONT <>
Textplay db «Воспроизвести», 0
Textdur db «0», 0
TextLabel2 db «Длительность, мсек», 0
Textfreq db «0», 0
TextLabel1 db «Частота, Гц», 0
szFontName db «MS Sans Serif», 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 | |||
;_______________ | ||||
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 | |||
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, 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
invoke 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 | ||||
Textfreq, WS_CHILD or ES_LEFT or ES_AUTOHSCROLL or ES_NUMBER or | ||||
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 | ||||