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