Автор Тема: Программа получения списка файлов директории и изменения атрибутов файлов  (Прочитано 1516 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн roma86

  • Коллежский регистратор
  • *
  • Сообщений: 1
  • Репутация: 0
Четным свои нечетным - другие
Здравствуйте. Ассемблер знаю второй день. Вообще програмировал на php, а с низкоуровневыми языками - не сталкивался. Быдлокодер, короче. Но всеже - человек.

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

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

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

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

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

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

Вот типа что получалось :
Код: (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
Потом понял как можно изменить атрибуты файла:
Код: (assembler) [Выделить]

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 то только чтение.

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

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

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

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

Если такая же тема уже была написана и решена - ткните меня туда носом, пожалуйста.

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

Код: (assembler) [Выделить]

.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
Вот только подставить

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