Министерство образования Российской Федерации Институт переподготовки кадров Уральского государственного технического университета Кафедра микропроцессорной техники Курсовая работа На тему Вывод на экран текущий каталог в графическом режиме со скролингом Руководитель В.П. Кулюкин Студент гр.СП-923 г.Нягань 2001г.
СОДЕРЖАНИЕ ВВЕДЕНИЕ 3 ОСНОВНАЯ ЧАСТЬ 4 ЗАКЛЮЧЕНИЕ 17 БИБЛИОГРАФИЧЕСКИЙ СПИСОК 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 API CreateWindowEx. Для этого ей нужно передать множество параметров. Для создания окна необходимы 2 шага сначала определение класса окна, а лишь затем непосредственно его создание. После выполнения функции CreateWindowExA создается окно, но это пока произойдет только лишь внутри самой Windows на экране это новое окно пока еще не отобразится.
Для того чтобы созданное окно появилось на экране, применяем функцию ShowWindowA. В качестве параметров этой функции передается дескриптор hWnd окна, которое необходимо отобразить на экране, и константа, задающая начальный вид окна. Приложение может иметь несколько оконных функций. Их количество определяется количеством классов окон, зарегестрированных в системе функцией
Register ClassEx. Windows требует, чтобы оконная функция сохраняла значения регистров ebi, edi и esi ,т.к. оконная функция должна быть рекурсивной.По завершении работы оконная функция формирует значения в регистре EAX. Если сообщение обрабатывалось в оконной функции, то в eax необходимо поместить нулевое значение. Полосы прокрутки - этоэлементы управления, предназначенные для регулирования вертикального и горизонтального положения на экране ассоциированных с ними объектов.
Разница между полосами прокрутки, являющимися частью окна и полосами прокрутки - дочерними окнами, состоит в том, что дочерние окна имеют встроенный клавиатурный интерфейс, позволяющий воздействовать на полосу прокрутки с помощью клавиатуры. Сообщение SBLIINEDOWN - в случае нажатия нижней или правой стрелки.
Чтобы полоса прокрутки функционировала корректно необходимо определить для нее диапозон прокрутки и задать позицию бегунка. Встроенная полоса прокрутки, к сожалению, досталась только управлению с помощью курсора мыши. По умолчанию для полос прокрутки, являющимися частью окна, этот диапозончисло шагов мужду крайними позициями бегунка определен от 0 до 100. Для того, чтобы изменить диапозон прокрутки необходимо вызвать функцию SetScrollRange В Windows не смотря на то, что операции ввода осуществляемые приложением,
ограничены рабочей областью его окна, программа должна быть готова обновить информацию в этой области по требованию системы. В программе использован ряд функций Windows API, которые как бы являются основными, когда речь идет об оконных процедурах CreateWindow, ShowWindow и др Рассмотрим подробнее процедуры, которые организованы на основе стиля окна. Краткое описание процедур InvalidateRect - эта функция добавляет прямоугольник к области модификации
указанных окон. Область модификации является частью области клиентского окна, которая должна быть повторно перересована. Параметры hWnd определяет окно, чья область изменилась, если этот параметр равен 0, то Windows изменяет все окна и посылает оконной процедуре сообщение WMERASEBKGND and WMNCPAINT 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 определяет полосу прокрутки. Этот параметр может принимать одно из следующих значений - SBCTL - устанавливает позицию бегунка в управлении полосы прокрутки, hWnd - дискриптор полосы прокрутки SBGORS - устанавливает позицию бегунка в стандартной горизонтальной полосе прокрутки SBVERT - устанавливает позицию бегунка в стандартной вертикальной полосе прокрутки. nPos параметр, определяющий
новую позицию бегунка. Она должна быть в пределах прокручиваемого диапазона. bRedraw параметр, определяющий оттянута ли повторно полоса прокрутки, для того чтобы отобразить новую позицию бегунка. Если этот параметр истина, то полоса прокрутки повторно оттянута. Если функция неправильно завершена, то возвращается ноль. p486 эта директива разрешает транслятору обрабатывать команды процессора i486 2. jumps транслятор автоматически преобразует команду условной
передачи управления в комбинацию условной и безусловной команд, если условная команда в cилу ограниченности области своего действия не обеспечивает передачу управления по нужному адресу 3. model flat,STDCALL выбирается модель памяти для 32- разрядного программирования и правила передачи параметров функциям STDCALL, далее действующие по умолчанию 4. include win32.inc файл, содержащий описания структур данных и констант 5. L equ LARGE последовательности символов
LARGE, являющейся именем операции, объявляющей следующий за ней операнд 32-разрядным, присваивается имя L 6. extrn ginPaintPROC описание импортируемых из Windows функций 7. extrn CreateWindowExAPROC 8. extrn DefWindowProcAPROC 9. extrn DispatchMessageAPROC 10. extrn EndPaintPROC 11. extrn ExitProcessPROC 12. extrn GetMessageAPROC 13. extrn
GetModuleHandleAPROC 14. extrn LoadCursorAPROC 15. extrn LoadIconAPROC 16. extrn PostQuitMessagePROC 17. extrn RegisterClassAPROC 18. extrn ShowWindowPROC 19. extrn TextOutAPROC 20. extrn UpdateWindowPROC 21. extrn GetTextMetricsAPROC 22. extrn SetCurrentDirectoryAPROC 23. extrn FindFirstFileAPROC 24. extrn
FindNextFileAPROC 25. extrn FindClosePROC 26. extrn SetScrollPosPROC 27. extrn InvalidateRectPROC 28. extrn GetClientRectPROC 29. extrn ScrollWindowPROC 30. extrn GetDCPROC 31. extrn ReleaseDCPROC 32. extrn SetScrollRangePROC 33. extrn TranslateMessagePROC 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. bufv db 260 dup 0 51. num dd 0 52. 53. lpPathName
dd 0 54. szP db 0 55. w32fd WIN32FINDDATA 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. regclass 75. инициализация структуры WNDCLASS 76. mov wc.clsStyle, CSHREDRAW CSVREDRAW стиль класса 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, IDIAPPLICATION заданная по умолчанию пиктограмма 83. mov wc.clsHIcon, eax 84. call
LoadCursorA, 0 ,IDCARROW стандартная стрелка курсора 85. mov wc.clsHCursor, eax 86. mov wc.clsHbrBackground,COLORWINDOW 1 87. mov dword ptr wc.clsLpszMenuName, 0 88. mov dword ptr wc.clsLpszClassName, offset szClassName 89. call RegisterClassA, offset wc регистрирует класс окна, атрибуты которого определены в структуре WNDCLASS 90. call CreateWindowExA, 0,offset szClassName,offset szTitleName, создает окно, имеющее указанный
тип и принадлежащее указанному классу 91. WSOVERLAPPEDWINDOW OR WSVSCROLL,CWUSEDEFAULT, 92. CWUSEDEFAULT,CWUSEDEFAULT,CWUSEDEFAULT,0 ,0, 93. hInst, 0 94. mov newhwnd, eax 95. call ShowWindow, newhwnd, SWSHOWNORMAL показывает каким образом должно быть показано окно 96. call UpdateWindow, newhwnd обновляет изображение окна, посылая сообщение
WMPAINT оконной процедуре, если область модификации окна не пуста 97. msgloop 98. call GetMessageA, offset msg, 0, 0, 0 считывает сообщение очереди сообщений прикладной задачи 99 if eax 0 100. call DispatchMessageA, offset msg передает сообщение оконной процедуре 101. call TranslateMessage, offset msg 102. jmp msgloop 103. .endif 104. call ExitProcess, msg.msWPARAM 105. 106. Оконная процедура 107. 108.
WndProc proc uses ebx edi esi, hwndDWORD, wmsgDWORD, 109. wparamDWORD, lparamDWORD 110. LOCAL hDCDWORD 111. cmp wmsg, WMDESTROY посылается оконной процедуре сразу же после закрытия окна 112. je wmdestroy 113. cmp wmsg, WMSIZE посылается оконной процедуре после того, как изменился размер окна 114. je wmsize 115. cmp wmsg, WMCREATE передача оконной процедуре нового окна после того, как окно создано, но прежде чем окно стало
видимым 116. je wmcreate 117. cmp wmsg,WMPAINT обеспечивают перерисовку окна, когда часть или вся рабочая область окна становится недействительной 118. je wmpaint 119. cmp wmsg,WMVSCROLL 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,
SBLINEDOWN щелчок мыши на стрелке вниз, приводит к прокрутке на одну строку вниз 140. je sblinedown 141. cmp eax,SBLINEUP щелчок мыши на стрелке вверх, приводит к прокрутке на одну строку вверх 142. je sblineup 143. cmp eax,SBENDSCROLL отпускание любого органа управления отпущена клавиша мыши после удерживания ее на полосе прокрутки 144. je bp3 145. sblinedown 146. mov cyStep,1 прибавить шаг 147. jmp endvscroll1 148. sblineup 149. mov cyStep 1 150. jmp endvscroll 151. endvscroll 152. cmp cyPos,0 153. je bp3 154. endvscroll1
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,SBVERT,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. sm4 192. call FindNextFileA,hFindFile,offset w32fd 193. cmp eax,0 194. je sm5 195. inc esi 196. jmp sm4 197. sm5 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 SBVERT 206. push hwnd 207. call SetScrollRange 208. push TRUE 209. push cyPos 210. push SBVERT 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,offset fn,offset w32fd отыскиваем первый файл 226. mov hFindFile,eax 227. cmp ecx,cyPos 228. jne qqq1 229. mov esi,0 230. m3 mov dl,w32fd.cFileNameesi отрисовка первой строки 231. cmp dl,0 232. je m2 233. mov bufvesi,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 bufv,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.cFileNameedi получили имя файла 249. cmp dl,0 250. je m5 251. mov bufvesi,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 bufv,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 поддерживают работу с мышью, это вряд ли стоит считать серьезным недостатком. Необходимо было выполнить целый ряд действий, прежде чем приложение смогло адекватно реагировать на сообщения, посылаемые полосами прокрутки. Библиографический список.
Windows 98 руководство разработчика Пер.с англ. К. Издательская группа BHV, 1999. T.1. 672 c. Зубков С.В. Asstmbler. Для DOC, Windows Unix. M. ДМК, 1999. 640 с.
! |
Как писать рефераты Практические рекомендации по написанию студенческих рефератов. |
! | План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом. |
! | Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач. |
! | Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты. |
! | Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ. |
→ | Виды рефератов Какими бывают рефераты по своему назначению и структуре. |