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

Автор работы: Пользователь скрыл имя, 17 Мая 2013 в 20:47, курсовая работа

Краткое описание

Постепенно ситуация менялась. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он немог этого сделать в принципе.
Если коротко, то ассемблер- это символическое представление машинного языка. Все процессы в машине на самом низком, аппаратном уровне приводятся в действие только командами машинногшо языка.

Содержание

ВВЕДЕНИЕ 3
ОСНОВНАЯ ЧАСТЬ 4
ЗАКЛЮЧЕНИЕ 17
БИБЛИОГРАФИЧЕСКИЙ СПИСОК 18

Прикрепленные файлы: 1 файл

nata.doc

— 826.00 Кб (Скачать документ)

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 с.

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