Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
#1

Заменить расширения всех файлов в текущей директории на расширение “.cul” - Assembler

28.11.2016, 19:18. Просмотров 512. Ответов 18
Метки нет (Все метки)

Задание:
Заменить расширения все файлов в текущей директории на расширение “.cul”. Если

переименовываемый файл уже существует, то оставить его без изменения. Директории

игнорировать!
Помогите разобратся , в интернете искал но так и не смог ничего толком найти , я не понимаю как это сделать.


Добавлено через 46 минут
Программа нужна на ТАSM для win32

Добавлено через 9 минут
Как я понял нужно сначала определить атрибуты файлов и пототом переименовывать их, если это директория то искать дальше файлы, но как это сделать не понимаю, примеров не нашел.
http://www.cyberforum.ru/assembler/thread189499.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2016, 19:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Заменить расширения всех файлов в текущей директории на расширение “.cul” (Assembler):

Вывод текущей директории и смена ее
Здравствуйте, у меня такой вопрос, как можно получить текущую директорию(вернее...

Модифицируйте программу так, чтобы она меняла в текстовых файлах текущей директории все латинские буквы “А” на “К”
; замещает российскую "Н" на латинские "H" во всех файлах с расширением .TXT в ...

Заменить расширения имен файлов в заданной директории и поддиректориях
Привет) Прошу помощи господа. Задача такова: Реализовать сценарий на...

Как вывести список всех файлов определенного расширения из директории?
Здравствуйте! По адресу "C:\images\" есть разные картинки с разними форматами....

Удалить все файлы заданного расширения в текущей директории кроме
Удалить все файлы заданного расширения в текущей директории кроме последнего....

18
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
28.11.2016, 19:25 #2
Начните с малого - вывод содержимого текущей директории на экран.
0
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 19:29  [ТС] #3
Но это не поможет мне решить задание.
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
28.11.2016, 19:33 #4
Почему?

Добавлено через 3 минуты
Суть вашей программы - получать поочерёдно по одному файлу (или папке) из текущей директории и обрабатывать их (переименовывать).
В качестве отладочной меры я предлагаю обработкой сделать вывод на экран.

Я бы так писал программу - постепенно усложняя функционал. Т.е. за один присест не стал бы создавать свой Word.
0
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 19:35  [ТС] #5
Ну потому что мне не нужно ничего выводить, просто нужно определить не директория ли это и изменить расширение, изучаю ассемблер 3 месяца и для такого просто не хватает знаний поэтому обратился на форум
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
28.11.2016, 19:38 #6
Хорошо. Какой язык вы уже знаете?
0
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 19:39  [ТС] #7
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
.model  small
.386
DTA_    STRUC
reserved    DB 21 DUP ( ? )
attrib  DB 
 
 
 
.stack
 
.data
 
file_name   db '*.*', 0   ; ASCIIZ-имя файла
dta     DTA_ <>     ; буфер для DTA
src_fname   db 128 dup(0)
dst_fname   db 128 dup(0)
 
.code
 
start:
    mov ax,@data
    mov ds,ax
    mov es,ax
 
    mov ah, 1ah         ; функция установки DTA
    lea dx, dta         ; DS:DX указывают на DTA
    int 21h
 
;Найти первый файл
    mov ah, 4eh
    mov cx, 0110111b 
    lea dx, offset file_name
    int 21h
не знаю правильно ли но предположим нахожу первый файл и что дальше?
0
R71MT
2979 / 1109 / 264
Регистрация: 29.07.2014
Сообщений: 2,120
Записей в блоге: 4
28.11.2016, 20:05 #8
Цитата Сообщение от Mr_Lord Посмотреть сообщение
Программа нужна на ТАSM для win32
..так тебе под дос, или виндовс нужна программа? твой код для доса
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
28.11.2016, 20:05 #9
Я имел в виду Pascal, C, BASIC.

Смотрите. Я покажу просто вывод на экран содержимого текущей директории на FreePascal. Зачем? А затем, что виден порядок вызова функций (их всего три) поиска файлов.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
program ShowCurrentFolder;
 
uses
  SysUtils;
 
var
  DirInfo: TSearchRec;
  WildCard: string;
  Res: integer;
 
begin
  WildCard := '*.*';
  if FindFirst(WildCard, faAnyFile, DirInfo) = 0 then
  begin
    repeat
      if (DirInfo.Attr and faDirectory) = faDirectory then
      begin  {если найдена директория}
        if (DirInfo.Name <> '.') and (DirInfo.Name <> '..') then
        begin
          writeln('Folder ', DirInfo.Name);
        end;
      end
      else
      begin  {если найден файл}
        writeln('File ', DirInfo.Name);
      end;
    until FindNext(DirInfo) <> 0;
  end
  else
  begin
    writeln('There is not files in the current folder');
  end;
  FindClose(DirInfo);
end.
Точно также делается и в DOS API и в Win32 API.
Одно отличие - в DOS не нужно закрывать поиск.
0
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 20:09  [ТС] #10
Да нужно под дос, неправильно написал, извиняюсь( изучал только С++ и С#
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
28.11.2016, 20:15 #11

Не по теме:

А я уже стал готовиться к написанию второй консольной программы для Windows, но - не судьба.



Добавлено через 2 минуты
В общем - разницы нет. Вызов функций в том же порядке. Только названия функций "прячутся" под вызовом int 21h.

Собственно - вы правильно начали.
0
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 20:23  [ТС] #12
Честно говоря я на этом и остановился...
0
R71MT
2979 / 1109 / 264
Регистрация: 29.07.2014
Сообщений: 2,120
Записей в блоге: 4
28.11.2016, 20:28 #13
Цитата Сообщение от Mr_Lord Посмотреть сообщение
Да нужно под дос,
Код
DOS INT-21H
--------------------------------
   AH = 1Ah: создать DTA
   AH = 4Eh: искать файлы по маске
   AH = 56h: переименовать файл
cycle:
   AH = 4Fh: искать сл.файл..
   jc   stop
   AH = 56h: переименовать файл
   jmp  cycle
stop:
   int  20h
0
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 20:48  [ТС] #14
R71MT, а как сделать исключение чтоб игнорировать директории?
0
ФедосеевПавел
Модератор
3412 / 1909 / 815
Регистрация: 01.02.2015
Сообщений: 6,451
28.11.2016, 22:02 #15
Сравнить атрибуты с константой faDirectory=16

Как же я забыл о http://www.cyberforum.ru/post4770617.html

Добавлено через 6 минут
Это старый глюк DOS - в атрибутах поиска указываешь, что нужны только файлы, а в результате получаешь и файлы и папки. Поэтому вводят дополнительное сравнение атрибутов с атрибутами папки (директории). Если бит установлен, то это директория.

Добавлено через 48 минут
Это изменённая программа из FAQ. Видна проверка атрибута в 21-23
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
; masm dos com #
.286
.model tiny
.code
org    80h
; Область передачи данных по умолчанию
dta    db     15h dup (0)
attrib db     0
timdat dw     0
       dw     0
fsize  dd     0
fname  db     0Eh dup (0)
       org    100h
; Начало программы
start: mov    ah,4Eh; Ищем 1-й файл
       xor    cx,cx
       mov    dx,offset maska
       int    21h
       jc     net
povtor:
       mov al, attrib
       test al, 16
       jnz @@FindNext:
 
       mov    si,offset fname
pechat:lodsb; Печатаем имя
       test   al,al
       je     poisk
       int    29h
       jmp    pechat
poisk: mov    al,0Dh; Переводим строку
       int    29h
       mov    al,0Ah
       int    29h
@@FindNext:
       mov    ah,4Fh; Ищем следующий файл
       int    21h
       jnc    povtor
net:   ret    ; Файлов больше нет, конец
maska  db     '*.com',0; Маска для поиска
end start
0
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
29.11.2016, 23:20  [ТС] #16
Пытался что то доделать но ничего не выходит
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
; masm dos com #
.286
.model tiny
.code
org    80h
; Область передачи данных по умолчанию
dta    db     15h dup (0)
attrib db     0
timdat dw     0
       dw     0
fdot    db  ?       ; здесь будет точка '.', если имя = 8 симв.
fsize  dd     0
fdot    db  ?  
fname   DB  8 DUP ( ? )
src_fname   db 128 dup(0)
dst_fname   db 128 dup(0)
       org    100h
; Начало программы
start: mov    ah,4Eh; Ищем 1-й файл
       xor    cx,cx
       mov    dx,offset maska
       int    21h
       jc     net
 
povtor:
    lea si,fname
    lea di, src_fname
    push    di
    push    di
    mov ax, 6000h
    int 21h     ; TRUENAME - canonicalize filename or path
    jc  net
 
; Определение хвоста ASCIZ-строки  ES:EDI -> str
    xor cx,cx
    mov al,cl
    dec cx
    repne   scasb
    not cx
    pop si      ; si-> fname
    lea di, dst_fname
    push    di
    rep movsb
    cmp dta.fdot,'.'
    inc di      ;  записываем расширение '.cul'
 
     mov dword ptr [di-5],'luc.'
       mov ah, 56h
    pop di
    pop dx
    int 21h
        jc   net
       mov al, attrib
       test al, 16
       jnz FindNext
 
       mov    si,offset fname
pechat:lodsb; Печатаем имя
       test   al,al
       je     poisk
       int    29h
       jmp    pechat
poisk: mov    al,0Dh; Переводим строку
       int    29h
       mov    al,0Ah
       int    29h
FindNext:
       mov    ah,4Fh; Ищем следующий файл
       int    21h
       jnc    povtor
net: mov ah,0ch    
int 16h
 ret    ; Файлов больше нет, конец
maska  db     '*.*',0; Маска для поиска
end start
код для смены мени брал из http://www.cyberforum.ru/asm-beginners/thread1525101.html
может вы сможете подправить и желательно под .model small т.к .model tiny не сильно работает в моем TD

Добавлено через 1 минуту
0
R71MT
2979 / 1109 / 264
Регистрация: 29.07.2014
Сообщений: 2,120
Записей в блоге: 4
30.11.2016, 11:01 #17
Цитата Сообщение от Mr_Lord Посмотреть сообщение
ничего не выходит
имя файла хранится в формате 8.3 по адресу DTA+30

Добавлено через 5 часов 16 минут
Цитата Сообщение от Mr_Lord Посмотреть сообщение
может вы сможете подправить
1. Читать текущее имя файла из [DTA+30], в буфер переименования.
2. Перезаписать в буфере 3-последних символа (расширение) на "CUL".
3. Переименовать файл через AH=56h. Текущее имя берёшь прям из DTA, а новое - из буфера.
4. Выводишь имя файла из буфера на экран (формат - с переводом строки).
5. Очищаешь поле с именем в DTA+30 для следующего имени файла.
6. Продолжаешь поиск, пока не установится флаг СF=1.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
; fasm-code // rename all file
;---------------------------------
org  100h
jmp  start
 
fName   db  '*.*',0              ; маска для поиска файлов
newDTA  db  45 dup(0)            ; область DTA
newFn   db  13,10,16 dup(0)      ; новое имя файла с CRLF для вывода
ext     db  'cul'                ; новое расширение
noFile  db  13,10,'Rename OK! Press key to exit...$'
 
start:
; создать DTA
      mov   ah,1ah
      mov   dx,newDTA
      int   21h
; искать файлы
      mov   ah,4eh
      mov   cx,20h           ;   ..исключая папки.
      mov   dx,fName
      int   21h
      jc    stop
; переименовать/вывести имя на экран
find: call  reName_Print
      mov   ah,4fh           ; искать сл.файл
      mov   dx,newDTA
      int   21h
      jnc   find
; Press key..
stop: mov   ah,9
      mov   dx,noFile
      int   21h
; выход по клавише
exit: xor   ax,ax
      int   16h
      int   20h
 
;ннннннннннннн ПРОЦЕДУРА нннннннннннннннннннннннннннннннннннн
reName_Print:
; копируем имя файла из DTA, в буфер переименования
      mov   si,newDTA+30
      mov   di,newFn+2
@01:  lodsb
      or    al,al
      je    @02
      stosb
      jmp   @01
; меняем расширение файла (3 символа с конца)
; скопировать из SI в DI
@02:  sub   di,3
      mov   si,ext
      mov   cx,3
      rep   movsb
; переименовать файл!
      mov   ah,56h
      mov   dx,newDTA+30
      mov   di,newFn+2
      int   21h
; выводим новое имя на экран
      mov   si,newFn
@3:   lodsb
      or    al,al
      je    @4
      int   29h
      jmp   @3
; очищаем поле имени в DTA, для сл.имени
@4:   xor   al,al
      mov   di,newDTA+30
      mov   cx,16
      rep   stosb
; очищаем буфер для сл.имени
      mov   di,newFn+2
      mov   cx,16
      rep   stosb
ret
0
Mr_Lord
0 / 0 / 1
Регистрация: 28.11.2016
Сообщений: 22
30.11.2016, 22:05  [ТС] #18
Компилятор ошибок не выдает, но вылетает ошибка что то вроде Процесор NTVDM обнаружил недопустимую ошибку , в чем проблема так и не понял , работаю в turbo debuger где то 98 года )
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
;== TASM code =======================
.model small 
.stack 256 
.data 
fName   db  '*.*',0              ; маска для поиска файлов
newDTA  db  45 dup(0)            ; область DTA
newFn   db  13,10,16 dup(0)      ; новое имя файла с CRLF для вывода
ext     db  'cul'                ; новое расширение
noFile  db  13,10,'Rename OK! Press key to exit...$'
 
.code
start:
; создать DTA
      mov   ah,1ah
      lea   dx,newDTA
      int   21h
; искать файлы
      mov   ah,4eh
      mov   cx,20h           ;   ..исключая папки.
      lea  dx,fName
      int   21h
      jc    stop
; переименовать/вывести имя на экран
find: call  reName_Print
      mov   ah,4fh           ; искать сл.файл
      lea   dx,newDTA
      int   21h
      jnc   find
; Press key..
stop: mov   ah,9
      lea   dx,noFile
      int   21h
; выход по клавише
exit: xor   ax,ax
      int   16h
      int   20h
 
;ннннннннннннн ПРОЦЕДУРА нннннннннннннннннннннннннннннннннннн
reName_Print:
; копируем имя файла из DTA, в буфер переименования
      lea   si,newDTA+30
     lea   di,newFn+2
@01:  lodsb
      or    al,al
      je    @02
      stosb
      jmp   @01
; меняем расширение файла (3 символа с конца)
; скопировать из SI в DI
@02:  sub   di,3
     lea  si,ext
      mov   cx,3
      rep   movsb
; переименовать файл!
      mov   ah,56h
      lea   dx,newDTA+30
      lea   di,newFn+2
      int   21h
; выводим новое имя на экран
      lea   si,newFn
@3:   lodsb
      or    al,al
      je    @4
      int   29h
      jmp   @3
; очищаем поле имени в DTA, для сл.имени
@4:   xor   al,al
     lea  di,newDTA+30
      mov   cx,16
      rep   stosb
; очищаем буфер для сл.имени
     lea  di,newFn+2
      mov   cx,16
      rep   stosb
ret
mov ax, 4ch
  int 21h ; выходим
end start
0
R71MT
2979 / 1109 / 264
Регистрация: 29.07.2014
Сообщений: 2,120
Записей в блоге: 4
30.11.2016, 23:10 #19
Цитата Сообщение от Mr_Lord Посмотреть сообщение
но вылетает ошибка
Assembler
1
2
3
4
5
6
start:
    mov   ax,@data
    mov   ds,ax
    mov   es,ax
; создать DTA
;....
0
30.11.2016, 23:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2016, 23:10
Привет! Вот еще темы с решениями:

Создание списка файлов текущей директории
написать фаил lab.bat создающий список файлов текущей дериктории ,торый...

Вывод всех файлов и поддиректорий в заданной директории (добавить в код ввод директории)
.586p .model flat, stdcall std_output_handle equ -11 std_input_handle equ...

Нужно получить список расширения файлов в директории
#!/bin/bash find . -type f -name &quot;*.*&quot;|while read file nam=${file##*.} А...

Получить список файлов WinRAR в текущей директории
Требуется распаковать все архивы, находящиеся в директории, в папки с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru