Міністерство освіти Російської Федерації p>
Інститут перепідготовки кадрів p>
Уральського державного технічного університету p>
Кафедра мікропроцесорної техніки p>
Курсова робота b> p>
На тему: Виведення на екран поточний каталог в графічному режимі (з скролінгом) b> p>
Керівник В.П. Кулюкін p>
Студент гр.СП-923 p>
г.Нягань p>
2001р. p>
ЗМІСТ p>
ВСТУП 3 b> p>
ОСНОВНА ЧАСТИНА 4 b> p>
ВИСНОВОК 17 b> p>
БІБЛІОГРАФІЧНИЙ СПИСОК 18 b> p>
Введення. b> p>
Асемблер-один з найстаріших з існуючих сьогодні мов программірованія.Когда-то це був самий
основна мова, без якого не можна було змусити комп'ютер зробити що-небудь корисне. p>
Поступово ситуація змінювалася. З'явилися більш зручні засоби спілкування з комп'ютером. Але на відміну від інших
мов асемблер не вмирав, більше того він немогу цього зробити в принципі. p>
Якщо коротко, то асемблер-це символічне подання машинної мови. Всі процеси в машині на самому
низькому, апаратному рівні приводяться в дію тільки командами машінногшо мови. p>
Звідси зрозуміло, що незважаючи на загальну назву, мова Асемблера для кожного типу комп'ютера свій. Це
стосується і зовнішнього вигляду програм, написаних на Асемблері, і ідей, відображенням яких ця мова є. p>
Опис програми. b> p>
Windows-додаток на асемблері містить один сегмент даних. data і один сегмент коду. code. У
програмі використано 28 функцій API. Параметри цих функцій передаються через стек, результат повертається в регістрі ЕАХ. P>
Регістр mode1 задає модуль сегментації (flat) і стиль генерації коду при вході до процедури програми і
вихід з них (stdcall). Модель пам'яті flat означає плоску модель пам'яті. Відповідно до цієї моделі компілятор створює програму, яка містить
32-бітовий сегмент для даних і коду програми. Вказівка цієї моделі пам'яті змушує компонувальник створити виконуваний файл з розширенням. Exe. Параметр
stdcall визначає порядок передачі параметрів через стек справа наліво. p>
Директива include включае в програму файл win32.inc. p>
Опції Win32 API, що використовуються в програмі повинні бути оголошені за допомогою директиви extrn для
того, щоб компілятор міг згенерувати правильний код. p>
Рядки 35-68 містять опис сегмента даних, в якому визначаються змінні і екземпляри
структур, що використовуються в програмі. Для запуску програми під управлінням Windows необхідно виконати ряд кроків, зміст яких полягає у виклику
ряду функцій Win32.API: p>
* Виконання стартового коду; p>
* Виконання головної функції, що виконує наступні дії; p>
Реєструє клас вікна; p>
Створює вікно; p>
Відображає вікно; p>
Запускає цикл обробки повідомлень; p>
Завершує цикл обробки повідомлення; p>
* Організація обробки повідомлень в віконної процедури. p>
Віконна процедура визначає те, що виводиться в робочу область вікна, і те, як вікна реагувати на
користувальницький ввод.Созданіе вікна виконується функцією Win32 API CreateWindowEx. Для цього їй потрібно передати багато параметрів. Для створення
вікна необхідні 2 кроки: спочатку визначення класу вікна, а лише потім безпосередньо його створення. p>
Після виконання функції CreateWindowExA створюється вікно, але це поки відбудеться тільки лише всередині самої
Windows, - на екрані це нове вікно поки ще не відобразиться. Для того щоб створене вікно з'явилося на екрані, застосовуємо функцію ShowWindowA. В якості
параметрів цієї функції передається дескриптор hWnd вікна, яке необхідно відобразити на екрані, і константа, що задає початковий вигляд вікна. p>
Програма може мати кілька віконних функцій. Їх кількість визначається кількістю класів вікон,
зареєстрованих в системі функцією Register Class (Ex). p>
Windows вимагає, щоб віконна функція зберігала значення регістрів ebi, edi і esi, тому що віконна функція повинна бути
рекурсівной.По завершення роботи віконна функція формує значення в регістрі EAX. Якщо повідомлення оброблялося в віконної функції, то в eax необхідно
помістити нульове значення. p>
Смуги прокрутки - етоелементи управління, призначені для регулювання вертикального і
горизонтального положення на екрані асоційованих з ними об'єктів. Різниця між смугами прокручування, що є частиною вікна і смугами прокрутки --
дочірніми вікнами, полягає в тому, що дочірні вікна мають вбудований клавіатурний інтерфейс, що дозволяє впливати на смугу прокрутки з
допомогою клавіатури. Повідомлення SB_LINEUP генерується обома смугами при натисканні на верхній або лівою стрілкою, а повідомлення SB_LINEDOWN - у разі натискання нижньої
або правою стрілки. Щоб смуга прокручування функціонувала коректно необхідно визначити для неї діапозон прокрутки і задати позицію бігунка. P>
Вбудована смуга прокрутки, на жаль, дісталася лише управління за допомогою курсору миші. За замовчуванням
для смуг прокручування, які є частиною вікна, цей діапазон (число кроків мужду крайніми позиціями бігунка) визначений від 0 до 100. Для того, щоб змінити
діапозон прокручування необхідно викликати функцію SetScrollRange p>
У Windows не дивлячись на те, що операції введення здійснювані додатком, обмежені робочою областю його
вікна, програма повинна бути готова оновити інформацію в цій області на вимогу системи. p>
У програмі використаний ряд функцій Windows API, які ніби є основними, коли мова йде про
віконних процедурах (CreateWindow, ShowWindow та ін.) p>
Розглянемо докладніше процедури, які організовані на основі стилю вікна. p>
Короткий опис процедур: p>
InvalidateRect - ця функція додає прямокутник до області модифікації вказаних вікон. Область модифікації є частиною області
клієнтського вікна, яка повинна бути повторно перересована. p>
Параметри: p>
hWnd визначає вікно, чия область змінилася, якщо цей параметр дорівнює 0, то Windows змінює всі вікна та
посилає віконної процедури повідомлення * WM_ERASEBKGND and WM_NCPAINT *; p>
lpRect покажчик на структуру RECT, яка містить координати клієнтського прямокутника, який буде додано до
області модіфікаціібласті. Якщо цей параметр дорівнює нуль, то вся область клієнта додається до області модифікації. P>
BErase визначає чи повинен бути стертий фон в межах області модифікації. Якщо цей параметр true, фон
стирається при виклику BeginPaint p>
GetClientRect - відшукує координати області клієнта вікна. Клієнтські координати визначають координати
верхнього лівого та правого нижнього кутів. Координати верхнього лівого кута рівні (0,0). P>
Параметри: p>
hWnd: визначає вікно, координати якого треба знайти. p>
lpRect: вказівник на структуру, яка отримає коорідінати. p>
При правильному завершенні функції повертається значення, відмінне від 0. p>
SetScrollRange - функція встановлює мінімальне та максимальне значення позицій для вказаної смуги
прокручування. Може також використовуватися для приховування стандартної смуги прокручування. P>
Параметри: p>
hWnd: визначає, що це стандартне вікно зі смугою прокрутки або просто смуга прокрутки, в залежності
від значення параметра nBar. p>
nBar: визначає смугу прокручування. Цей параметр може приймати різні значення. Він встановлює
діапазон управління, якщо смуга вікно. Встановлює діапазон стандартної вертикальної або горизонтальної смуги прокрутки. Визначає мінімальну
прокручуємо позицію. Визначає, чи повинна бути смуга прокручування повторно відтягнути. Якщо правда, то так, повинна бути. P>
ScrollWindow - функція, яка прокручує зміст області клієнта вказаного вікна. p>
hWnd: визначає дескриптор вікна, де клієнтська область повинна бути прокручена. p>
XAmount: визначає склад модуля для горизонтального прокручування. p>
YAmount: визначає склад модуля для вертикальної прокрутки. p>
lpRect: вказівник на структуру RECT, що визначає частину області клієнта для прокручування. Якщо цей
параметр дорівнює 0, то прокручується вся клієнтська область p>
lpClipRect: вказівник на структуру RECT, що містить координати прямокутника відсікання. p>
Якщо функція виконана правильно, то вона повертає значення, відмінне від нуля. p>
SetScrollPos - функція, яка встановлює позицію бігунка у зазначеній смузі прокрутки і змінює
цю позицію. p>
Параметри: p>
hWnd: ідентифікує смугу прокручування або вікно зі стандартною смугою прокрутки, залежно від
значення параметра nBar. p>
nBar: визначає смугу прокручування. p>
Цей параметр може приймати одне з наступних значень: p>
- SB_CTL - встановлює позицію бігунка в управлінні смуги прокрутки, hWnd - дискриптор смуги прокручування. p>
- SB_GORS - встановлює позицію бігунка в стандартній горизонтальній смузі прокрутки. p>
- SB_VERT - встановлює позицію бігунка в стандартній вертикальній смузі прокручування. p>
nPos: параметр, що визначає нову позицію бігунка. Вона повинна бути в межах прокручуємо діапазону. P>
bRedraw: параметр, що визначає відтягнути чи повторно смуга прокрутки, для того щоб відобразити
нову позицію бігунка. Якщо цей параметр істина, то смуга прокручування повторно відтягнути. P>
Якщо функція неправильно завершена, то повертається нуль. p>
p486; ця директива дозволяє транслятору p>
; обробляти команди процесора i486 p>
2. jumps; транслятор автоматично перетворює p>
; команду умовної передачі управління в комбінацію p>
; умовної і безумовної команд, якщо умовна команда в p>
; cілу обмеженості області своєї дії не p>
; забезпечує передачу управління за потрібною адресою p>
3. model flat, STDCALL; вибирається модель пам'яті для 32 - p>
; розрядного програмування та правила p>
; передачі параметрів функцій STDCALL, p>
; далі діють за замовчуванням p>
4. include win32.inc; файл, що містить описи структур p>
; даних і констант p>
5. L equ; послідовності символів LARGE, p>
; що є ім'ям операції, p>
; оголошує наступний за нею операнд; 32-розрядних, присвоюється ім'я L p>
6. extrn ginPaint: PROC; опис імпортованих з p>
; Windows функцій p>
7. extrn CreateWindowExA: PROC p>
8. extrn DefWindowProcA: PROC p>
9. extrn DispatchMessageA: PROC p>
10. extrn EndPaint: PROC p>
11. extrn ExitProcess: PROC p>
12. extrn GetMessageA: PROC p>
13. extrn GetModuleHandleA: PROC p>
14. extrn LoadCursorA: PROC p>
15. extrn LoadIconA: PROC p>
16. extrn PostQuitMessage: PROC p>
17. extrn RegisterClassA: PROC p>
18. extrn ShowWindow: PROC p>
19. extrn TextOutA: PROC p>
20. extrn UpdateWindow: PROC p>
21. extrn GetTextMetricsA: PROC p>
22. extrn SetCurrentDirectoryA: PROC p>
23. extrn FindFirstFileA: PROC p>
24. extrn FindNextFileA: PROC p>
25. extrn FindClose: PROC p>
26. extrn SetScrollPos: PROC p>
27. extrn InvalidateRect: PROC p>
28. extrn GetClientRect: PROC p>
29. extrn ScrollWindow: PROC p>
30. extrn GetDC: PROC p>
31. extrn ReleaseDC: PROC p>
32. extrn SetScrollRange: PROC p>
33. extrn TranslateMessage: PROC p>
34. . data; зумовлене ім'я, p>
; що означає початок сегменту даних p>
35. hFindFile dd 0 p>
36. newhwnd dd 0 p>
37. wc WNDCLASS p>
38. qq1 db'@@@@' p>
39. lppaint PAINTSTRUCT p>
40. qq2 db'@@@@' p>
41. msg MSGSTRUCT p>
42. tm TEXTMETRIC p>
43. rc RECT p>
44. charht dd 0 p>
45. hInst dd 0 p>
46. fl dw 0 p>
47. szTitleName db 'Це курсової', 0 p>
48. szClassName db 'ASMCLASS32', 0 p>
49. Buffer db 'Пам'ятай про порядок передачі параметрів функції!', 0 p>
50. buf_v db 260 dup (0) p>
51. num dd 0 p>
52. ;########################## p>
53. lpPathName dd 0 p>
54. szP db 0 p>
55. w32fd WIN32_FIND_DATA p>
56. lpFileName dd 0 p>
57. fn db "*.*", 0 p>
58. ;########################## p>
59. nVertDifference dd 0 p>
60. nVertPosition dd 0 p>
61. cyStep dd 0 p>
62. nFirst dd 0 p>
63. nLast dd 0 p>
64. cyMax dd 0 p>
65. cyPos dd 0 p>
66. cory dd 5 p>
67. count dd 0 p>
68. py dd 0 p>
69. . code; зумовлене ім'я, що означає p>
; початок сегменту коду p>
70. start: p>
71. push L 0 p>
72. call GetModuleHandleA; повертає базовий адреса модуля, p>
; вказує, куди був відображений в адресному p>
; просторі процесу EXE-або DLL файлу p>
73. mov [hInst], eax; результат виконання функції зберігається в якості змінної hInst p>
74. reg_class: p>
75. ;************************************************
; ініціалізація структури WNDCLASS p>
76. mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW; стиль класу p>
77. mov [wc.clsLpfnWndProc], offset WndProc; адресу віконної процедури p>
78. mov wc.clsCbClsExtra], 0; визначає додаткове число p>
; байтів для структури класу вікна, p>
; які система резервує p>
; у службовій пам'яті для всіх вікон p>
; цього класу p>
79. mov [wc.clsCbWndExtra], 0; задає в байтах обсяг пам'яті, p>
; Резервованої системою в кінці p>
; кожної такої структури кожного вікна p>
; даного класу p>
80. mov eax, [hInst] p>
81. mov [wc.clsHInstance], eax; містить базовий адреса даного p>
; EXE-файлу, отриманий за допомогою p>
; функції GetModuleHandle p>
82. call LoadIconA, 0, IDI_APPLICATION; задана за замовчуванням p>
; піктограма p>
83. mov [wc.clsHIcon], eax p>
84. call LoadCursorA, 0, IDC_ARROW; стандартна стрілка курсору p>
85. mov [wc.clsHCursor], eax p>
86. mov [wc.clsHbrBackground], COLOR_WINDOW 1 p>
87. mov dword ptr [wc.clsLpszMenuName], 0 p>
88. mov dword ptr [wc.clsLpszClassName], offset szClassName p>
89. call RegisterClassA, offset wc; реєструє клас вікна, p>
; атрибути якого визначені; в структурі WNDCLASS p>
90. call CreateWindowExA, 0, offset szClassName, offset szTitleName, p>
; створює вікно, що має вказаний тип p>
, і що належить вказаному класу p>
91. WS_OVERLAPPEDWINDOW OR WS_VSCROLL, CW_USEDEFAULT, p>
92. CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0,0, p>
93. [hInst], 0 p>
94. mov [newhwnd], eax p>
95. call ShowWindow, [newhwnd], SW_SHOWNORMAL; показує яким p>
; чином має бути p>
; показано вікно p>
96. call UpdateWindow, [newhwnd]; оновлює зображення p>
; вікна, посилаючи p>
; повідомлення WM_PAINT p>
; віконної процедурою, якщо p>
; область модифікації p>
; вікна не порожня p>
97. msg_loop: p>
98. call GetMessageA, offset msg, 0, 0, 0; зчитує повідомлення p>
; черги повідомлень p>
; прикладної задачі p>
99 .. if eax! = 0 p>
100. call DispatchMessageA, offset msg; передає повідомлення p>
; віконної процедури p>
101. call TranslateMessage, offset msg p>
102. jmp msg_loop p>
103. ;. Endif p>
104. call ExitProcess, [msg.msWPARAM]; p>
105. ;************************************************* p>
106. ; Віконна процедура p>
107. ;************************************************* * p>
108. WndProc proc uses ebx edi esi, hwnd: DWORD, wmsg: DWORD, p>
109. wparam: DWORD, lparam: DWORD p>
110. LOCAL hDC: DWORD p>
111. cmp [wmsg], WM_DESTROY; надсилається віконної процедури відразу p>
; ж після закриття вікна p>
112. je wmdestroy p>
113. cmp [wmsg], WM_SIZE; надсилається віконної процедури після того, p>
; як змінився розмір вікна p>
114. je wmsize p>
115. cmp [wmsg], WM_CREATE; передача віконної процедури нового p>
; вікна після того, як вікно створене, p>
; але перш ніж вікно стало видимим p>
116. je wmcreate p>
117. cmp [wmsg], WM_PAINT; забезпечують перемальовування вікна, коли p>
; частина або вся робоча область вікна p>
; стає недійсною p>
118. je wmpaint p>
119. cmp [wmsg], WM_VSCROLL; p>
120. je wmscroll p>
121. jmp defwndproc p>
122. wmcreate: p>
123. call GetDC, [hwnd]; дескриптор контекстного пристрою p>
124. mov [hDC], eax p>
125. call GetTextMetricsA, [hDC], offset tm p>
126. mov ebx, 0 p>
127. mov bx, [tm.tmExtLeading]; межстрочное відстань p>
128. add bx, [tm.tmHeight]; висота (добавка до координаті рядка) p>
129. mov [charht], ebx p>
130. call ReleaseDC, [hwnd], [hDC]; відмова від контекстного пристрою p>
131. mov eax, 0 p>
132. jmp finish p>
133. defwndproc: p>
134. call DefWindowProcA, [hwnd], [wmsg], [wparam], [lparam] p>
135. jmp finish p>
136. wmscroll: p>
137. call GetClientRect, [hwnd], offset rc; визначення клієнтської p>
; області вікна p>
138. movzx eax, [word ptr wparam]; перетворення вмісту wparam в p>
; подвійне слово p>
139. cmp eax, SB_LINEDOWN; клацання миші на стрілкою вниз, p>
; приводить до прокручування на один рядок p>
; вниз p>
140. je sblinedown p>
141. cmp eax, SB_LINEUP??; Клацання миші на стрілкою вгору, p>
; приводить до прокручування на один рядок p>
; вгору p>
142. je sblineup p>
143. cmp eax, SB_ENDSCROLL; відпускання будь-якого органу управління p>
; відпущена клавіша миші після p>
; утримування її на смузі прокрутки p>
144. je bp3 p>
145. sblinedown: p>
146. mov [cyStep], 1; додати крок p>
147. jmp endvscroll_1 p>
148. sblineup: p>
149. mov [cyStep], -1 p>
150. jmp endvscroll p>
151. endvscroll: p>
152. cmp [cyPos], 0 p>
153. je bp3 p>
154. endvscroll_1: mov eax, [cyPos]; посилаємо позицію бігунка в p>
; регістр p>
155. add eax, [cyStep] p>
156. mov [cyPos], eax p>
157. mov eax, 0 p>
158. sbb eax, [charht]; розрахунок міжрядкового відстані p>
159. mov ecx, [cyStep] p>
160. mov edx, 0 p>
161. mul ecx p>
162. mov ecx, eax p>
163. call ScrollWindow, [hwnd], 0, ecx, 0,0; визначаємо дескриптор вікна, p>
; де клієнтська область повинна p>
; бути прокручена p>
164. call InvalidateRect, [hwnd], offset rc, TRUE; визначаємо вікно з p>
; змінилася p>
; областю p>
165. call SetScrollPos, [hwnd], SB_VERT, [cyPos], TRUE; встановлення p>
; позиції бігунка в p>
; стандартної p>
; вертикальної p>
; смузі прокрутки p>
166. call UpdateWindow, [hwnd]; оновлення зображення
вікна, p>
; якщо область не порожня p>
167. bp3: mov eax, 0 p>
168. jmp finish p>
169. wmdestroy: p>
170. call PostQuitMessage, 0 p>
171. mov eax, 0 p>
172. jmp finish p>
173. wmsize:; для перемальовування нового розміру вікна p>
; значення старшого слова означає висоту p>
; клієнтської частини p>
174. mov eax, [lparam] p>
175. mov cl, 16 p>
176. rcr eax, cl p>
177. and eax, 0ffffh p>
178. mov dx, 0 p>
179. mov cx, word ptr [charht] p>
180. div cx p>
181. movzx ecx, ax p>
182. mov eax, 101 p>
183. sbb eax, ecx p>
184. cmp eax, 0 p>
185. ja www1 p>
186. mov eax, 0 p>
187. www1: mov [cyMax], ecx p>
188. call FindFirstFileA, offset fn, offset w32fd p>
189. mov [hFindFile], eax p>
190. mov esi, 1 p>
191. s_m4: p>
192. call FindNextFileA, [hFindFile], offset w32fd p>
193. cmp eax, 0 p>
194. je s_m5 p>
195. inc esi p>
196. jmp s_m4 p>
197. s_m5: mov [nLast], esi p>
198. mov eax, [cyMax] p>
199. cmp eax, [cyPos] p>
200. ja www2 p>
201. mov [cyPos], eax p>
202. www2: push FALSE p>
203. push esi p>
204. push L 0 p>
205. push SB_VERT p>
206. push [hwnd] p>
207. call SetScrollRange p>
208. push TRUE p>
209. push [cyPos] p>
210. push SB_VERT p>
211. push [hwnd] p>
212. call SetScrollPos p>
213. mov eax, 0 p>
214. jmp finish p>
215. wmpaint: p>
216. call BeginPaint, [hwnd], offset lppaint; отримали контекст p>
; пристрою p>
217. mov [hDC], eax p>
218. mov eax, [cyPos]; початкова позиція бігунка p>
219. mov ecx, [charht]; отримали координату виводу в пікселях p>
220. mov dx, 0 p>
221. mul cx p>
222. movzx ecx, ax p>
223. mov [cory], 5; занесли по у -5 p>
224. mov ecx, 1; занесли по x -1 p>
225. call FindFirstFileA, offset fn, offset w32fd; відшукуємо p>
; перша p>
; файл p>
226. mov [hFindFile], eax p>
227. cmp ecx, [cyPos] p>
228. jne qqq1 p>
229. mov esi, 0 p>
230. m3: mov dl, w32fd.cFileName [esi]; вивід першого рядка p>
231. cmp dl, 0 p>
232. je m2 p>
233. mov buf_v [esi], dl p>
234. inc esi p>
235. jmp m3 p>
236. cmp [cyPos], 0; якщо не нуль, то перехід на мітку p>
; qqql p>
237. jne qqq1 p>
238. m2: p>
239. mov [num], esi p>
240. call TextOutA, [hDC], 5, [cory], offset buf_v, [num]; висновок p>
; перший p>
; знайденого p>
; файлу p>
241. qqq1: mov ebx, 1 p>
242. m6: p>
243. call FindNextFileA, [hFindFile], offset w32fd; Наступне фото p>
244. cmp eax, 0;
перевірка для p>
; останнього файлу p>
245. je kon p>
246. mov esi, 0 p>
247. mov edi, 0 p>
248. m4: mov dl, w32fd.cFileName [edi]; отримали ім'я p>
; файлу p>
249. cmp dl, 0 p>
250. je m5 p>
251. mov buf_v [esi], dl p>
252. inc edi p>
253. inc esi p>
254. jmp m4 p>
255. m5: cmp ebx, [cyPos] p>
256. jb qqq2 p>
257. mov eax, [charht] p>
258. add [cory], eax p>
259. call TextOutA, [hDC], 5, [cory], offset buf_v, esi; висновок p>
; нового рядка p>
260. qqq2: inc ebx; лічильник
строк p>
261. jmp m6 p>
262. kon: call EndPaint, [hwnd], offset lppaint; віддали p>
; контекст p>
; пристрої та p>
; перейшли до циклу p>
; обробки повідомлень p>
263. mov eax, 0 p>
264. jmp finish p>
265. finish: p>
266. ret p>
267. WndProc endp p>
268. public WndProc p>
269. end start; кінець програми. p>
p>
Висновок. b> p>
Моя задача полягала у створенні навчальної програми, яка демонструє вивід на екран в графічному режимі
заданий каталог з скролінгом. З смугами прокручування пов'язаний єдиний недолік, який полягає в тому, що додатками неможливо керувати
без миші. Але так як більшість додатків Windows підтримують роботу з мишею, це навряд чи варто
вважати серйозним недоліком. Необхідно було виконати цілий ряд дій, перед тим, як додаток змогло адекватно реагувати на повідомлення, що посилаються
смугами прокручування. p>
Бібліографічний список. b> p>
Windows 98: керівництво розробника: Пер.с англ. - К.: Видавнича група BHV, 1999. - T.1. -672
c. p>
Зубков С.В. Asstmbler. Для DOC, Windows Unix. M.: ДМК, 1999. B> 640 с. P>