Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2011, 01:16   #1
alex1808
Новичок
Джуниор
 
Регистрация: 24.10.2008
Сообщений: 2
Восклицание Вывсти содержимое поточного диска.

Люди добрые помогите!!! У меня проблемка. Есть программка которая выводит содержимое диска (только папки). Помогите добавить туда и файлы. Зарание спасибо.

Код:
; tasm /m scantree.asm
; tlink /t /x scantree.obj

.MODEL Tiny
.286
.CODE
ORG	100h

LOCALS

PathLen		=	100            ; Максимальный путь к файлу/каталогу
                                       ; (уменьшать это значение нежелательно)
Start:
		push	offset MyFunc
		call	ScanTree
		int	20h
MyFunc		proc
		lea	di,ScanPath    ; DI = адрес строки ScanPath
		push	di
		mov	cx,PathLen
		xor	al,al
		repne	scasb          ; Ищем конец строки
		dec	di
		mov	word ptr [di],0A0Dh ; Записываем туда CR,LF...
		mov	byte ptr [di+2],'$' ; ...и символ доллара (для ф-ии 9)

		mov	ah,9
		pop	dx
		int	21h            ; Выводим строку на экран
		mov	byte ptr [di],0; Восстанавливаем строку ScanPath
		                       ; (т.к. изменять ее нельзя)
		ret
MyFunc		endp
; Маски атрибутов файлов/каталогов
faReadOnly	=	1
faHidden	=	2
faSystem	=	4
faVolume	=	8
faDirectory	=	10h
faArchive	=	20h
faAnyFile	=       faReadOnly+faHidden+faSystem+faArchive
faAnyDir	=	faAnyFile+faDirectory
faAnithing	=	faAnyDir+faVolume
; Описание буфера DTA
DTAFileInfo	struc
dtaReserved	db	21 dup (?)
dtaAttr		db	?
dtaTime		dw	?
dtaDate		dw	?
dtaSize		dd	?
dtaName		db	13 dup (?)
ends
ScanTree	proc	pascal
arg		Func:word
local		OldDTA:dword, NewDTA:DTAFileInfo
; ES всегда равно первоначальному DS !!!

		push	ds             ; Сохраняем DS
		mov	ah,2Fh
		int	21h            ; Получаем адрес DTA
		mov	word ptr OldDTA[0],bx ; Сохраняем его...
		mov	word ptr OldDTA[2],es ; ...в переменной OldDTA
		pop	es             ; Восстанавливаем DS в регистр ES (ES=DS)

		lea	di,ScanPath
		mov	cx,PathLen
		xor	al,al
		cld                    ; Прямой порядок поиска scasb
		repne	scasb          ; Ищем в имени каталога нулевой байт (конец строки)
		dec	di
		push	di             ; Сохраняем указатель на ноль

		push	ds es          ; Сохраняем DS и ES
		call	Func           ; Вызываем функцию для стартового каталога

		mov	ah,1Ah
		push	ss
		pop	ds             ; DS = SS (сегмент NewDTA)
		lea	dx,NewDTA
		int	21h            ; Устанавливаем свой DTA
		pop	es ds          ; Восстанавливаем DS и ES (ES=DS)

		mov	ah,4Eh         ; Готовимся в началу поиска
		mov cx,0110111b    ; Атрибуты (все, кроме Volume label)
		lea	dx,ScanPath

		lea	si,ScanMask    ; SI = адрес макси поиска
		pop	di             ; Восстанавливаем DI (указатель на конец строки)...
		push	di             ; ...и тут же сохраняем его
		cld                    ; Прямой порядок работы lodsb/stosb
@@CopyMask:	lodsb                  ; Читаем в AL символ из строки [SI]
		stosb                  ; И записываем его в конец ScanPath
		or	al,al          ; Конец строки [SI] (AL=0) ?
		jnz	@@CopyMask     ; Нет, копируем следующий символ
@@FindNext:
		int	21h            ; Начинаем/продолжаем поиск
		jc	@@NotFound     ; Выходим, если ничего не найдено (CF=1)

		push	ss
		pop	ds             ; DS = SS (сегмент NewDTA)

		test	NewDTA.dtaAttr,faDirectory ; Проверяем - каталог ли был найден
		jz	@@PrepareNext  ; Если нет, готовимся продолжать поиск
		lea	si,NewDTA.dtaName ; Адрес имени найденного файла/каталога
		lodsb                  ; Читаем первый символ
		cmp	al,'.'         ; Это каталоги '.' и '..'? (нам такие не нужны)
		je	@@PrepareNext  ; Если это они, готовимся продолжать поиск

		pop	di             ; Восстанавливаем DI (указатель на конец строки)...
		push	di             ; ...и тут же сохраняем его
@@CopyPath:	
		stosb                  ; Записываем символ строки [SI] в конец ScanPath
                lodsb                  ; Читаем в AL символ из строки [SI]
		or	al,al          ; Конец строки [SI] (AL=0) ?
		jnz	@@CopyPath     ; Нет, копируем следующий символ
		mov	ax,'\'         ; AH = 0, AL = '\'
		stosw                  ; Записываем слэш и ноль в конец строки

		push	es
		pop	ds             ; DS = ES
		push	Func
		call	ScanTree       ; Вызываем себя рекурсивно
		push	ss
		pop	ds             ; DS = SS (сегмент NewDTA)
@@PrepareNext:
		mov	ah,4Fh         ; Готовимся к функции 4Fh
		lea	dx,NewDTA
		jmp	@@FindNext     ; Продолжаем поиск
@@NotFound:
		pop	di             ; Убираем из стека DI

		mov	ah,1Ah
		lds	dx,OldDTA
		int	21h            ; Восстанавливаем DTA

		push	es
		pop	ds             ; Восстанавливаем первоначальный DS
		ret                    ; Выходим из процедуры
ScanTree	endp

.DATA

ScanMask	db	'*.*',0        ; Маска каталогов для поиска
                                       
StartPath	db	'D:\',0        ; Стартовый каталог
ORG StartPath                          ; Совмещаем StartPath и ScanPath
ScanPath	db	PathLen dup (?) ; ASCIIZ-имя найденного каталога
searchPath  db "*.*",0
dta     db 2ch dup (?)
crlf db 0Dh,0Ah,'$' ;аналогично, новая строка

END		Start
alex1808 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Содержимое регистра AL Cpluser Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 21.01.2011 06:14
Содержимое регистров maxwelldream Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 15.01.2011 09:28
Содержимое ярлыка Gr@nd Общие вопросы Delphi 6 13.01.2010 09:06
Содержимое лейблов CraZZy RabbIt Общие вопросы Delphi 5 17.02.2009 14:20
Содержимое файла terminadoor Работа с сетью в Delphi 0 15.12.2008 00:25