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

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

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

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

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

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


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

Добавлено через 9 минут
Как я понял нужно сначала определить атрибуты файлов и пототом переименовывать их, если это директория то искать дальше файлы, но как это сделать не понимаю, примеров не нашел.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2016, 19:18
Ответы с готовыми решениями:

как найти во всех в подпапках, в определенной папке текущей директории, все файлы с расширение lua?
Скажите пожалуйста, как найти во всех в подпапках, в определенной папке текущей директории, все...

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

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

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

18
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
28.11.2016, 19:25 2
Начните с малого - вывод содержимого текущей директории на экран.
0
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 19:29  [ТС] 3
Но это не поможет мне решить задание.
0
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
28.11.2016, 19:33 4
Почему?

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

Я бы так писал программу - постепенно усложняя функционал. Т.е. за один присест не стал бы создавать свой Word.
0
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 19:35  [ТС] 5
Ну потому что мне не нужно ничего выводить, просто нужно определить не директория ли это и изменить расширение, изучаю ассемблер 3 месяца и для такого просто не хватает знаний поэтому обратился на форум
0
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
28.11.2016, 19:38 6
Хорошо. Какой язык вы уже знаете?
0
0 / 0 / 0
Регистрация: 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
Эксперт Hardware
5160 / 1822 / 341
Регистрация: 29.07.2014
Сообщений: 2,781
Записей в блоге: 5
28.11.2016, 20:05 8
Цитата Сообщение от Mr_Lord Посмотреть сообщение
Программа нужна на ТАSM для win32
..так тебе под дос, или виндовс нужна программа? твой код для доса
0
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
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
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 20:09  [ТС] 10
Да нужно под дос, неправильно написал, извиняюсь( изучал только С++ и С#
0
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
28.11.2016, 20:15 11

Не по теме:

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



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

Собственно - вы правильно начали.
0
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 20:23  [ТС] 12
Честно говоря я на этом и остановился...
0
Эксперт Hardware
5160 / 1822 / 341
Регистрация: 29.07.2014
Сообщений: 2,781
Записей в блоге: 5
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
0 / 0 / 0
Регистрация: 28.11.2016
Сообщений: 22
28.11.2016, 20:48  [ТС] 14
R71MT, а как сделать исключение чтоб игнорировать директории?
0
Модератор
Эксперт по электронике
7410 / 3629 / 1424
Регистрация: 01.02.2015
Сообщений: 11,314
Записей в блоге: 2
28.11.2016, 22:02 15
Сравнить атрибуты с константой faDirectory=16

Как же я забыл о https://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
0 / 0 / 0
Регистрация: 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
код для смены мени брал из Переименование файлов
может вы сможете подправить и желательно под .model small т.к .model tiny не сильно работает в моем TD

Добавлено через 1 минуту
0
Эксперт Hardware
5160 / 1822 / 341
Регистрация: 29.07.2014
Сообщений: 2,781
Записей в блоге: 5
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
0 / 0 / 0
Регистрация: 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
Эксперт Hardware
5160 / 1822 / 341
Регистрация: 29.07.2014
Сообщений: 2,781
Записей в блоге: 5
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2016, 23:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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