Мегаобучалка Главная | О нас | Обратная связь


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



2019-07-03 172 Обсуждений (0)
Библиографический список. 0.00 из 5.00 0 оценок




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

 

 

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

 

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

Студент гр.СП-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 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: параметр, определяющий оттянута ли повторно полоса прокрутки, для того чтобы отобразить новую позицию бегунка. Если этот параметр истина, то полоса прокрутки повторно оттянута.

       Если функция неправильно завершена, то возвращается ноль.

 

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 поддерживают работу с мышью, это вряд ли стоит считать серьезным недостатком. Необходимо было выполнить целый ряд действий, прежде чем приложение смогло адекватно реагировать на сообщения, посылаемые полосами прокрутки.

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

Windows 98: руководство разработчика: Пер.с англ. – К.: Издательская группа BHV, 1999. – T.1. –672 c.

Зубков С.В. Asstmbler. Для DOC, Windows Unix. M.: ДМК, 1999. 640 с.

 



2019-07-03 172 Обсуждений (0)
Библиографический список. 0.00 из 5.00 0 оценок









Обсуждение в статье: Библиографический список.

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (172)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)