Реферат по предмету "Информатика, программирование"


Вывод на экран текущий каталог в графическом режиме (со скролингом)

Министерство образования Российской Федерации



Институт переподготовки кадров



Уральского государственного технического университета





Кафедра микропроцессорной техники

























Курсовая
работа










На тему:   Вывод на
экран текущий каталог в графическом режиме (со скролингом)




















Руководитель                                            
В.П. Кулюкин



Студент гр.СП-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 API
CreateWindowEx. Для этого ей нужно передать множество параметров. Для создания
окна необходимы 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





52. ;##########################



53. lpPathName dd   0





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], offset
szClassName





89. call    RegisterClassA, offset wc ; регистрирует класс окна,



; атрибуты которого определены ;в структуре WNDCLASS





90. call    CreateWindowExA, 0,offset
szClassName,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      ; щелчок мыши на стрелке вверх,



; приводит к прокрутке на одну строку



; вверх





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,offset
fn,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, Windows
Unix. M.: ДМК, 1999. 640
с.



3.  



Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.