Разработка приложения на языке Assembler

Методика разработки и листинг программы для управления динамиком системного блока, обеспечения установки частоты и длительности формируемых сигналов. Алгоритм и этапы работы проектируемого приложения, анализ полученных результатов. Пример его работы.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 17.12.2015
Размер файла 79,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Разработка приложения на языке 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, свободный.

Приложение

Листинг программы

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

includelib \masm32\procs\controls\baumanets.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

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.