Создание программы с использованием программного продукта Turbo Assembler

2



Содержание



Введение

Исследование WinAPI функций

Заключение

Библиографический список

Приложения


Введение



Целью данного курсового проекта является углубление и закрепление знаний, полученных по дисциплине "Системное программное обеспечение", формирование опыта создания программ с использованием программного продукта Turbo Assembler.

Главным же преимуществом языка ассемблера, в отличие от языков типа Pascal или C, является то, что искусный программист, как правило, способен написать более эффективную программу на ассемблере, чем те, что генерируются трансляторами с языков программирования высокого уровня. Т.е. для программ на ассемблере характерно использование меньшего количества команд и обращений в память, что позволяет увеличить скорость и уменьшить размер программы.

Однако, в силу своей машинной ориентации ("низкого" уровня) человеку по сравнению с языками программирования высокого уровня сложнее читать и понимать программу, она состоит из слишком "мелких" элементов - машинных команд, соответственно усложняются программирование и отладка, растет трудоемкость, велика вероятность внесения ошибок. В значительной степени возрастает сложность совместной разработки.


Исследование WinAPI функций



Функция LoadIcon

Загpужает поименованный pесуpс пиктогpаммы.

В случае успешного завеpшения - идентификатоp пиктогpаммы; 0 - в пpотивном случае.

Функция LoadCursor

Загpужает поименованный pесуpс куpсоpа.

В случае успешного завеpшения - идентификатоp куpсоpа; 0 - если куpсоp не найден; не опpеделено, если pесуpс не является pесуpсом куpсоpа.

Функция RegisterClassEx

Регистpиpует класс окна, атpибуты котоpого опpеделены паpаметpом WndClassEx, для последующего использования. Класс окна может pегистpиpоваться только один pаз.

Функция ShowWindow

Отобpажает или пpячет окно обpазом, указанным паpаметpом CmdShow.

Функция GetMessage

Считывает сообщение, в pамках диапазона фильтpации, из очеpеди сообщений пpикладной задачи. Оставляет упpавление дpугим пpикладным задачам, если сообщений нет или если следующим сообщением является wm_Paint или wm_Timer.

Функция DefWindowProc

Обеспечивает стандаpтную обpаботку сообщений для сообщений, которые явно не обpабатываются пpикладной задачей.

Возвpащаемое значение: результат обpаботки сообщения.


Заключение



В ходе выполнения данной курсовой работы были получены практические навыки по программированию в Win32 API. Была реализована программа на низкоуровневом языке Ассемблер в EXE-формате с использованием программного продукта Turbo Assembler, удовлетворяющая требованиям задания: данная программа осуществляет вывод сообщения от клавиатуры в свое окно.


Библиографический список



Методические указания к лабораторному практикуму /В.П. Кулюкин. Екатеринбург: изд. ИПК УГТУ, 2004. - 40с.

Лабораторный практикум по дисциплине "Системное программное обеспечение" / Уфимск. гос. авиац. техн. ун-т. Сост.: О.Д. Лянцев. - Уфа, 2008. - 57 с.

Калашников О.А. Ассемблер? Это просто! Учимся программировать. СПб.: БХВ-Петербург, 2006. - 384 с.: ил.

Абель П. Ассемблер. Язык и программирование для IBM PC / Пер. с англ. - К.: Век+, М.: ЭНТРОП, 2005. - 736 с.


Приложения



Приложение А - Исходный текст программы



.586

. model flat, stdcall

extern GetModuleHandleA: near

extern LoadIconA: near

extern LoadCursorA: near

extern RegisterClassA: near

extern CreateWindowExA: near

extern GetMessageA: near

extern ShowWindow: near

extern UpdateWindow: near

extern TranslateMessage: near

extern DispatchMessageA: near

extern ExitProcess: near

extern DefWindowProcA: near

extern PostQuitMessage: near

extern BeginPaint: near

extern EndPaint: near

extern TextOutA: near

extern SetBkColor: near

extern InvalidateRect: near

includelib user32. lib

includelib kernel32. lib

includelib gdi32. lib

include windows. inc

style equ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

_Data segment

hWnd dd 0

msg MSG <? >

wc WNDCLASS <? >

pnt PAINTSTRUCT <? >

hInst dd 0

TitleName db 'Программа 1',0

ClassName db 'Class32',0

char WPARAM 20h

clear db ' ',0

hdc dd 0

_Data ends

_Code segment

Start:

push 0

call GetModuleHandleA

mov [hInst],eax

mov [wc. style],style

mov [wc. lpfnWndProc],offset WndProc

mov [wc. cbClsExtra],0

mov [wc. cbWndExtra],0

mov eax, [hInst]

mov [wc. hInstance],eax

push IDI_APPLICATION

push 0

call LoadIconA

mov [wc. hIcon],eax

push IDC_CROSS

push 0

call LoadCursorA

mov [wc. hCursor],eax

mov [wc. hbrBackground],0

mov dword ptr [wc. lpszMenuName],0

mov dword ptr [wc. lpszClassName],offset ClassName

push offset wc

call RegisterClassA

push 0

push [hInst]

push 0

push 0

push 400

push 400

push 100

push 100

push WS_OVERLAPPEDWINDOW

push offset TitleName

push offset ClassName

push 0

call CreateWindowExA

cmp eax,0

jz _err

mov [hWnd],eax

push SW_SHOWNORMAL

push [hWnd]

call ShowWindow

push [hWnd]

call UpdateWindow

msg_loop:

push 0

push 0

push 0

push offset msg

call GetMessageA

cmp eax,0

je end_loop

push offset msg

call TranslateMessage

push offset msg

call DispatchMessageA

jmp msg_loop

end_loop:

push [msg. wParam]

call ExitProcess

_err:

jmp end_loop

WndProc proc

push ebp

mov ebp,esp

push ebx

push esi

push edi

cmp dword ptr [ebp+0ch],WM_DESTROY

je wmdestroy

cmp dword ptr [ebp+0ch],WM_CREATE

je wmcreate

cmp dword ptr [ebp+0ch],WM_PAINT

je wmpaint

cmp dword ptr [ebp+0ch],WM_CHAR

je wmchar

jmp defwndproc

wmchar:

push dword ptr [ebp+10h]

pop char

push TRUE

push NULL

push dword ptr [ebp+08h]

call InvalidateRect

wmpaint:

push offset pnt

push dword ptr [ebp+08h]

call BeginPaint

mov hdc,eax

push 5

push offset clear

push 100

push 100

push hdc

call TextOutA

push 1

push offset char

push 100

push 100

push hdc

call TextOutA

push offset pnt

push eax

call EndPaint

mov eax,0

jmp finish

wmcreate:

mov eax,0

jmp finish

defwndproc:

push dword ptr [ebp+14h]

push dword ptr [ebp+10h]

push dword ptr [ebp+0ch]

push dword ptr [ebp+08h]

call DefWindowProcA

jmp finish

wmdestroy:

push 0

call PostQuitMessage

mov eax,0

finish:

pop edi

pop esi

pop ebx

pop ebp

ret 16

WndProc endp

lenstr proc

push ebp

mov ebp,esp

push esi

mov esi,dword ptr [ebp+8]

xor ebx,ebx

lbl1:

cmp byte ptr [esi],0

jz lbl2

inc ebx

inc esi

jmp lbl1

lbl2:

pop esi

pop ebp

ret 4

lenstr endp

_Code ends

end Start