Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа получения списка файлов директории и изм 
:(
    Опции темы
roma86
Дата 7.6.2009, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.6.2009

Репутация: нет
Всего: нет



Здравствуйте. Ассемблер знаю второй день. Вообще програмировал на 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 то только чтение.

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

на этом форуме

Код

.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", ведь имя файла каждый раз новое?
 
Уже второй день не могу найти как получить список файлов каталога и как отделить четные файлы от нечетных. 

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

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

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

Если такая же тема уже была написана и решена - ткните меня туда носом, пожалуйста.
PM MAIL   Вверх
roma86
Дата 7.6.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.6.2009

Репутация: нет
Всего: нет



Пока никто не ответил.
Но я нарыл еще на один шаг вперед, хотя не до конца.

Есть теперь такая структура
-------------------------------------
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

PM MAIL   Вверх
roma86
Дата 9.6.2009, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.6.2009

Репутация: нет
Всего: нет



Вот решение --
Код

.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


только надо компилировать и запускать из dos
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.