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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 15:40   #1
roma86
 
Регистрация: 07.06.2009
Сообщений: 8
По умолчанию Программа получения списка файлов директории и изменения атрибутов файлов

Здравствуйте. Ассемблер знаю второй день. Вообще програмировал на php, а с низкоуровневыми языками - не сталкивался. Быдлокодер, короче. Но всеже - человек.

помогите, пожалуйста с задачей.

Есть каталог, есть в нем четыре файла.
Программа при выполнении должна четным изменить атрибуты на "только чтение" а нечетным на "скрытый".

Что я имею на данный момент.

ОС windows 32
Эмулятор emu8086

Книгу "Assembler практикум" В.И. Юрова
Кигу "Ассемблер Это просто"

Разобрался как открывать файл.

Вот типа что получалось :
Код:
CSEG segment
org 100h
    
;Начало
Begin: 
        mov ax,3D02h
        mov dx,offset File_name
        int 21h
        jc error
        
        mov dx,offset Mess1
        Quit_prog:
        mov ah,9
        int 21h 
               
        int 20h
        
        error:
        mov dx,offset Mess2
        jmp Quit_prog
         
        File_name db 'my_fyle.txt',0 
        Mess1 db 'Файл открыт!$'
        Mess2 db 'Не удается открыть файл!$'
        
 
        
CSEG ends
end Begin
Потом понял как можно изменить атрибуты файла:
Код:
CSEG segment
org 100h
    
;Начало
Begin: 
        mov ax,4301h
        mov dx,offset File_name
        mov cx,2
        int 21h
        jc exit
        
        
        File_name db 'my_fyle.txt',0 
        
        exit: ret
 
        
CSEG ends
end Begin
эта штука делает атрибут для файла my_fyle.txt скрытый, а если поставить 1 то только чтение.

Уже второй день не могу найти как получить список файлов каталога и как отделить четные файлы от нечетных.

Помогите кто чем может.

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

Может я не по тому пути иду?

Если такая же тема уже была написана и решена - ткните меня туда носом, пожалуйста.
roma86 вне форума Ответить с цитированием
Старый 07.06.2009, 16:00   #2
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Цитата:
получить список файлов каталога
Вот посмотрите, надеюсь поможет
Так же можно использовать Win API: FindFirst, FindNext для поиска
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 07.06.2009, 18:23   #3
roma86
 
Регистрация: 07.06.2009
Сообщений: 8
По умолчанию

MalCer, спасибо.

Нашел способ вывода файлов каталога.

Код:
.model small
.stack 64
.data
 path db 'd:\*.*',0
 dta  db 256 DUP(?) 
 er1 db ""
.code
start:
    mov ax,@data
    mov ds,ax
    xor ax,ax
 
    mov ah,0 ;очистка экрана     
    mov al,2      
    int 10h  
    
 ;---уcтaнoвкa DTA
    lea dx,dta        ;DS:DX укaзывaют нa DTA
    mov ah,1AH        ;функция уcтaнoвки DTA
    int 21h           ;уcтaнaвливaeм DTA
;---ищeм пepвый фaйл
    mov ah,4EH        ;нoмep функции
    lea dx,path       ;укaзывaeм нa cтpoку пути
    mov cx,0          ;тoлькo нopмaльныe aтpибуты
    int 21h           ;ищeм *.*
    ;jc ERRORS         ;oбpaбoткa oшибoк
;---вывoдим имя фaйлa
NEXT_LINE:
    lea bx,dta        ;BX укaзывaeт нa DTA
    add bx,30         ;cмeщeниe для имeни фaйлa
NEXT_CHAR:
    mov dl,[bx]       ;пoлучaeм cимвoл из имeни
    cmp dl,0          ;пpoвepкa нa кoнeц cтpoки
    je END_STR       ;уxoд, ecли кoнeц
    mov ah,2          ;инaчe, выoдим cимвoл
    int 21h           ;
    inc bx            ;увeличивaeм укaзaтeль
    jmp SHORT NEXT_CHAR  ;cлeдующий cимвoл
;---вoзвpaт кapeтки/пepeвoд cтpoки в кoнцe cтpoки
END_STR:
    mov ah,2          ;функция вывoдa cимвoлa
    mov dl,13         ;кoд вoзвpaтa кapeтки
    int 21h           ;вывoдим
    mov dl,10         ;кoд пepeвoдa cтpoки
    int 21h           ;вывoдим
;---ищeм cлeдующий фaйл                                   
    lea dx,path       ;укaзывaeм нa cтpoку пути
    mov ah,4FH        ;нoмep функции
    int 21h           ;ищeм cлeдующий фaйл
    jc FINISHED      ;ecли нeт, тo выxoд
    jmp SHORT NEXT_LINE  ;инaчe вывoдим имя фaйлa

FINISHED:
    mov ax,4c00h
    int 21h 
end start
Вот только подставить

Код:
        mov ax,4301h
        mov dx,offset File_name
        mov cx,2
        int 21h
не получается. Надо же указывать "offset File_name"
а он постоянно меняется.
И не могу найти, как отличить четный файл от нечетного.

Последний раз редактировалось roma86; 07.06.2009 в 18:42.
roma86 вне форума Ответить с цитированием
Старый 07.06.2009, 20:18   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

поставить счетчик, к примеру:
mov cx,0
lp:
.....
;ищете файл
test cx,1
push cx
jz chet
;нечет
mov ax,4301h
mov dx,offset File_name
mov cx,2
int 21h
jmp nxt
chet:
mov ax,4301h
mov dx,offset File_name
mov cx,1
int 21h
nxt:
pop cx
inc cx
jmp lp

Если что, сильно не пинать, придумывал на ходу
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 07.06.2009, 20:22   #5
roma86
 
Регистрация: 07.06.2009
Сообщений: 8
По умолчанию

Аlexcoder, да, вот по счетчику уже есть предложения, спасибо за код.
А как "mov dx,offset File_name" указать вместо "File_name" постоянно меняющееся имя файла?
roma86 вне форума Ответить с цитированием
Старый 07.06.2009, 20:25   #6
roma86
 
Регистрация: 07.06.2009
Сообщений: 8
По умолчанию

Вообще сейчас получается что-то такое
Структура -
-------------------
1. Вызвать FindFirst
2. Пустить цикл, условием выхода из которого будет статус "нет больше файлов", выдаваемый функцией FindNext
3. Внутри цикла пустить счётчик от нуля. Чётность проверять так:
and al, 1
shr al
jnc even
тут код, выполняемый, если al нечётный - то есть, смена атрибута текущего файла на "ридонли"
jmp next
even:
тут код, выполняемый, если al чётный - то есть, смена атрибута текущего файла на "хидден"
next:
Регистр al, само собой, портится - как позаботитьсяся о его сохранении. Само собой, можно использовать и другой регистр, только вот какой? Никто не подскажет?
-------------------
Код:
.model small
.stack 64
.data
 path db 'd:\*.*',0
 
.code
start:  
    ;---ищем первый файл
    mov ah,4Eh
    lea dx,path
    int 21h    
    ;---пустить цикл
    
    ;---внутри пустить счетчик от нуля
     and al, 1
     shr al
     jnc even
    ;тут код, выполняемый, если al нечётный
       mov ax,4301h
       mov dx,offset File_name
       mov cx,2
       int 21h
     jmp NEXT
     even:
    ;тут код, выполняемый, если al чётный
     
    ;---ищем следующий файл
       mov ah,4Fh
       lea dx,path
       int 21h
       jc EXIT
    
    ;===метки===
    EXIT:  endp
    
    NEXT: ;что тут - непойму
      
      
end start
roma86 вне форума Ответить с цитированием
Старый 07.06.2009, 20:31   #7
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Ну и сохраните регистр ax путем push, а затем извлеките его
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 09.06.2009, 09:08   #8
roma86
 
Регистрация: 07.06.2009
Сообщений: 8
По умолчанию

Вот решение --
Код:
.model tiny
	.code
	.186
	org 100h
 
start:
	push cs			;на всякий случай, приравняем cs и ds
	pop ds			;хотя в COM-файле они и так равны
 
	mov ah, 9			;выводим на экран сообщение
	lea dx, msgpathrequest	;в сообщении - просьба ввести имя каталога
	int 21h
 
	mov ah, 0Ah		;вводим с клавиатуры строку
	lea dx, path		;указываем на буфер ввода
	int 21h			;буфер ввода имеет хитрую структуру
				;первый байт - макс длина буфера
				;во второй байт система положит количество считанных символов
				;а с третьего байта начинается собственно буфер
 
	lea dx, pathstring		;возьмём адрес начала введённой строки
	push dx			;сохраним - этот адрес ещё понадобится
	add dl, byte ptr[pathactual]	;к началу строки прибавим её длину, которую вернула предыдущая функция
	xor al, al		;поправим старший регистр
	adc dh,al			;типа а вдруг перенос? :)
	mov di, dx		;поскольку имя каталога должно кончаться нулём,
	mov byte ptr[di], al	;дадим ему в конце этот нуль
 
	mov ah, 3Bh		;сменим каталог
	pop dx			;на тот, что вводили
	int 21h
	jc no_such_directory	;а если его нету - пойдём ругаться
 
	mov ax, 4E01h		;найдём первый файл в текущем каталоге
	xor cx, cx		;так можно очень быстро положить ноль в любой регистр
	lea dx, searchmask		;возьмём указатель на маску поиска
	int 21h
	jc no_more_files		;если была ошибка - пойдём ругаться
 
searching:
	mov ax, 4301h		;будем менять атрибуты файла
	mov cx, 2			;атрибут hidden
	mov dx, 80h+1Eh		;смещение самой DTA плюс смещение имени файла в DTA
	int 21h			;собственно, меняем
 
	mov ax, 4F00h		;ищем следующий файл
	int 21h
	jc finished		;если не находим - выйдем
 
	mov ax, 4301h		;снова меняем атрибуты файла
	mov cx, 1			;на этот раз будет атрибут readonly
	mov dx, 80h+1Eh		;смещение самой DTA плюс смещение имени файла в DTA
	int 21h			;меняем атрибут
 
	mov ax, 4F00h		;ищем следующий файл
	int 21h
	jc finished		;если не находим - выйдем
 
	jmp searching		;закрываем цикл
 
no_such_directory:
	mov ah, 9			;будем ругаться
	lea dx, msgnosuchdir	;вот такими словами
	int 21h
	jmp finished
 
no_more_files:
	mov ah, 9			;будем ругаться
	lea dx, msgnomorefiles	;вот такими словами
	int 21h
 
finished:
	int 20h			;выходим из программы
 
 
msgpathrequest	db 0Ah, 0Dh, "Enter the full directory name: $"
msgnomorefiles	db 0Ah, 0Dh, "No files found in current directory$"
msgnosuchdir	db 0Ah, 0Dh, "No such directory$"
searchmask	db "*.*",0	;маска поиска файлов
path		label byte	;указатель на буфер ввода строки
pathlen		db 66
pathactual	db ?
pathstring	db 66 dup (?)
 
end start
только в emu8086 работает не меняя атрибуты, а вот после компиляции при запуске из DOS все отлично работает
roma86 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение списка файлов Костян Пират Общие вопросы Delphi 11 16.02.2009 09:58
Программа просмотра файлов в директории asale Microsoft Office Excel 4 06.01.2009 13:53
Не открывает из списка файлов ListBox SANTA_KLAUD Общие вопросы Delphi 8 27.05.2008 20:30
Печать pdf файлов из списка файлов в Excel АПС Microsoft Office Excel 5 15.04.2008 16:04
как считать имена файлов из директории и поддерикторий в массив, ХЭЛП uraveselov Microsoft Office Excel 2 10.04.2008 09:50