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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2009, 20:13   #1
bat0
 
Регистрация: 28.03.2009
Сообщений: 3
Восклицание Вывод иерархии каталогов на экран

Написал основное - но проблема в том что не работает дальнейший поиск(результат 4fh int 21h - нет больше каталогов,хотя они есть).Может кто заметит ошибку.
Код:
.model	small
.stack	500h
.data
	path db 'c:',0;сюда помещется текущий путь - прибавлять и занулять при переходах 	
	bufarea db 255 dup (0)

	startmsg db 'ATTENTION! For correct work use original DOS or the emulator!',13,10,'Hierarchy of catalogues of a disk: $'
	nocatmsg db 'Catalogues are not found $'

	IPback dw 0
	rekidx db 0
	
	crlf db 13,10,'$'
	symb db 10h
	
	fmask db '*',0h
	bufDTA	db 80 dup (0)
	
	FCatNm db 8 dup (0)
	FCatNmP	dw 0
	
	
.code


SearchInto	proc	;рекурсивная процедура поиска-заходит в найденный ранее
			;каталог - ищет в нем - на каждый найденный вызывает себя

	call	AddPath		;формированеи пути для захода в каталог
		
	mov	ah,3bh
	lea	dx,path
	int	21h		;chdir на найденный каталог

	mov	ah,4eh
	mov	cx,10h
	lea	dx,fmask
	int	21h		;поиск каталога - первым найден .
		
	mov	ah,4fh
	int	21h		;след найденный  ..
	mov	ah,4fh
	int	21h		;есть ли каталоги
	cmp	ax,0018
	je	SIex
			
	mov	si,offset bufDTA + 30	;в si смещение имени найденного каталога
	mov	FCatNmP,si	
				
	call	SearcInto	;рекурсивный вызов
			
	mov	cx,100		;поиск файлов 100 раз
SI4fh:	mov	ah,4fh
	int	21h
	cmp	ax,0018		;если найдено в ах 18
	je	SIex
	mov	si,offset bufDTA + 30	;в si смещение имени найденного каталога
	mov	FCatNmP,si
	
	call	DirNameOut	;вывод имени найденного каталога
	
	call	SearchInto	;поиск в нем
	
	loop	SI4fh


Siex:	
	call	SubPath		;формированеи пути для выхода из каталога	
	
	mov	ah,3bh
	lea	dx,path
	int	21h		;chdir на каталог откуда вызов
	
	ret
endp



DirNameOut	proc
	
	mov	ah,09h
	mov	dx,offset crlf
	int	21hcall	;перевод строки
		
	mov	ah,02h
	mov	bx,offset symb
	mov	dl,[bx]
	int	21h		;вывод символа >
	
nmout:	mov	dl,[si]
	cmp	dl,0
	je	DNOexit
	mov	ah,02h
	int	21h		;посимвольный вывод
	inc	si
	jmp	nmout
	

DNOexit:  ret
endp
	

AddPath		proc
	inc	rekidx
	
	mov	si,FCatNmP
	lea	di,path
	

PEndng: mov	bl,[di]		;переход на конец строки пути
	cmp	bl,0
	je	PEnd1
	inc	di
	jmp	PEndng

PEnd1:
	mov	al,92
	mov	[di],al		;\ в конец пути
	inc	di	

	mov	cx,8
PEnd2:	mov	bl,[si]
	cmp	bl,0
	je	APend
	repnz	movsb		;прибавление к пути строки имени найденного каталога
	
APend:

	ret
endp



SubPath		proc
	dec	rekidx

	lea	di,path
	
PEndg: 	mov	bl,[di]		;переход на конец строки пути
	cmp	bl,0
	je	PaEnd
	inc	di
	jmp	PEndg
PaEnd:
				;по строке пути к началу 
	mov	al,0		;зануляя до \
	mov	bl,[di]
	cmp	bl,'\'
	je	BackP
	mov	[di],al
	dec	di
	jmp	PaEnd

BackP:	

	ret
endp



SaveIndx	proc	;процедура помещения в стек индекса поиска

	pop	ax
	mov	IPback,ax		;сохранение точки возврата
	
	mov	bx,offset bufDTA + 20	;смещение конца индекса
	mov	cx,20			;под индекс дос отводит 20 байт
Pual:	xor	ax,ax
	mov	al,[bx]			;содержимое байта в al
	push	ax			;сохранение в стеке
	dec	bx			;переход на байт младше
	loop	Pual			;повтор

	xor	ax,ax			;восстановление точки возврата
	mov	ax,IPback
	push	ax	

	ret
endp



LoadIndx	proc	;процедура изъятия из стека индекса поиска

	pop	ax
	mov	IPback,ax		;сохранение точки возврата
	
	mov	cx,20			;под индекс 20 байт
	mov	bx,offset bufDTA	;смещение начала индекса
Poal:	xor	ax,ax
	pop	ax			;из стека в ал
	mov	[bx],al			;содержимое байта в память
	inc	bx			;след байт индекса
	loop	Poal			;повтор

	xor	ax,ax
	mov	ax,IPback
	push	ax			;восстановление точки возврата

	ret
endp



Go:
	mov	ax,@data
	mov	ds,ax		
	mov	es,ax		;установка DS и ES

	mov	ah,1ah
	mov	dx,offset bufDTA
	int	21h		;установка адреса DTA
	
	mov	ah,09h
	mov	dx,offset startmsg
	int	21h

	mov	ah,4eh
	mov	cx,10h
	lea	dx,fmask
	int	21h		;поиск каталога
	cmp	ax,12h		;проверка есть ли каталоги
	jne	Fcat
	
		
	mov	ah,09h
	mov	dx,offset crlf
	int	21h		;пеервод строки
	
	mov	ah,09h
	mov	dx,offset nocatmsg
	int	21h
	jmp	Mex		;если нет вывод сообщения,иначе продолжение

	
Fcat:	mov	si,offset bufDTA + 30	;в si смещение имени найденного каталога
		
	
	mov	FCatNmP,si
	mov	bx,FCatNmP
	mov	al,[bx]
	cmp	al,2eh		;не является ли . или .. именем
	je	Mex
	
	call	SaveIndx	;сохранение индекса для дальнейшего поиска
				
	call	SearchInto	;поиск в найденном
	
	call	LoadIndx	;восстановления индекса
	
M4fh:	mov	ah,4fh
	int	21h
	cmp	ax,0018		;найдены ли каталоги
	je	Mex
	mov	si,offset bufDTA + 30	;в si смещение имени найденного каталога
	mov	FCatNmP,si
					
	call	SearchInto		;поиск в найденном каталоге
		
	loop	M4fh
		
Mex:	mov	ah,4ch			;выход в ДОС
	int	21h

end Go
bat0 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод на экран Nikolai_90 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 02.05.2012 09:25
TASM,fat16 вывод иерархии каталогов диска bat0 Помощь студентам 2 21.04.2009 22:10
Вывод на экран Rifler Паскаль, Turbo Pascal, PascalABC.NET 10 18.07.2008 18:30
Вывод на 2-ой экран DShiller Общие вопросы Delphi 0 26.05.2008 15:25