Реферат: Програмианалоги DOS-програм ren xcopy

Міністерство освіти та науки України

Кіровоградський Державний Технічний університет

Кафедра програмного забезпечення

Курсова робота

з дисципліни «Програмування на мові ASM-86» на тему:

Програми – аналоги DOS-програм ren, xcopy

Зміст

Вступ

Постановка задачі

Обґрунтування вибору методів розв’язку задачі

Алгоритм програми

Реалізація програми

Системні вимоги

Інструкція для користувача

Висновки

Використана література

Лістинг програми

Вступ

З файлами на диску можна проводити певні операції – зокрема перейменовувати та копіювати. У даній роботі розглянуті програми, які дозволяють перейменувати файл і скопіювати задані файли та каталоги. Програми написані на мові ASM-86.

1. Постановка задачі

Необхідно написати програми для перейменування файлів та копіювання файлів і підкаталогів (аналоги REN, XCOPY).

2. Обґрунтування вибору методів розв’язку задачі

Для роботи з файлами в можна використовувати його системний сервіс, який зосереджено в перериванні 21h. Зокрема, використовуються такі функції:

56h – перейменувати файл

3ch – створити файл

3dh – відкрити файл

3eh – закрити файл

40h – читати з файла блок

41h – записати блок у файл

Для перегляду дерева підкаталогів зручно використовувати рекурсивну функцію, яку викликати при вході в підкаталог. Для пошуку будемо використовувати функції 4eh (findfirst) I 4fh (findnext).

3. Алгоритм програми

Алгоритм перейменування файла

1. Занести в пам’ять комадний рядок

2. Викликати функцію 56h

3. Якщо була помилка, то вивести повідомлення.

Алгоритм копіювання файлів

1. Проаналізувати командний рядок

2. Знайти всі файли в поточному каталозі, які відповідають заданій масці

3. Для кожного файла викликати функцію copy_file

4. Якщо не було задано ключ /s, то закінчити перегляд

5. Знайти всі підкаталоги

6. Зайти в кожен підкаталог диску і рекурсивно перейти в п. 2.

7. При завершенні повернутися у вихідний каталог

8. Кінець

4. Реалізація програми

Програма складається з функцій. Після запуску програми викликається функція process_commandline для аналізу командного рядка. Потім відбувається виклик функції process_files, яка копіює всі файли в заданому каталозі в заданий. Копіювання здійснюється за допомогою функції copy_file.

Якщо було задано параметр копіювання підкаталогів, викликається функція process_directory, яка шукає всі підкаталоги в даному і для кожного рекурсивно викликає функцію process_files.

Після обробки всіх файлів і каталогів виконання програми завершується. При копіюванні файлів виводиться ім’я кожного.

5. Системні вимоги

Операційна система DOS

CPU INTEL 8086 або ст.

RAM 640 K

VIDEO CGA або старший

6. Інструкція для користувача

Для використання програми перейменування файлів треба вказати:

k_ren letter.doc letter.txt

Якщо не виникне помилок, то файл буде перейменовано.

Для копіювання треба вказати такий рядок:

k_xcopy *.com c:\utils [/s]

де*.com – маска для файлів, які треба копіювати, c:\utils – каталог, кудитребакопіювати, а необов’язковий ключ /s вказує на те, що в копіювання треба включити також підкаталоги даного підкаталогу. При копіюванні буде створено точну копію частини дерева.

Висновки

Завдяки виконанню курсового проекту створені програми для перейменування файлів та копіювання групи файлів. Вони є прикладом роботи з файловою системою засобами MS-DOS і демонструє елементи системного програмування для IBM PC.

Використана література

1. Майко Г.В. Assembler для IBM PC. М., 1997

2. Лекції з дисципліни «Програмування на мові ASM-86»

Лістинг програми

K_XCOPY.ASM

model tiny

code

org 100h

start:

jmp begin

mem_errmsg db 'Memory allocation error.$'

file_errmsg db 'Files error!$'

param_err db 'Parameters error! Example: k_xcopy c:\*.* d: [/s]$'

--PAGE_BREAK--

all_dirs db '*.*', 0

up_dir db '..', 0

handle_1 dw 0

handle_2 dw 0

orig_date dw 0

orig_time dw 0

process_dirs db 0; вкл. пiдкаталоги

filename_1 db 100 dup(0); 1 параметр _xcopy

filename_2 db 100 dup(0); 2 параметр _xcopy

targetname db 100 dup(0); сюди буде формуватися iм`я файла призначення

;

; копiювання файла

; ds:si – ASCIIZ старий файл

; ds:di – ASCIIZ новий файл

;

copy_file proc

; видiлити пам`ять

mov ah, 48h

mov bx, 2048

int 21h

jnc mem_ok

jmp mem_err

mem_ok:

mov es, ax; сегмент видiлений для копiювання

; open file for read

mov ah, 3dh

xor al, al

mov dx, si

int 21h

jc file_error

mov word ptr handle_1, ax

; get date

mov bx, ax

mov ax, 5700h

int 21h

mov word ptr orig_time, cx

mov word ptr orig_date, dx

; open file for write

mov ah, 3ch

xor cx, cx

mov dx, di

int 21h

jc file_error

mov word ptr handle_2, ax

push ds

push es

pop ds

xor dx, dx

; read block

next_block:

mov ah, 3fh

mov bx, word ptr cs:handle_1

mov cx, 32768

int 21h

cmp ax, 0; eof

je stop_copy

; write to file

mov cx, ax

mov ah, 40h

mov bx, word ptr cs:handle_2

int 21h

jmp next_block

stop_copy:

pop ds

; set date

mov ax, 5701h

mov bx, word ptr handle_2

mov cx, word ptr orig_time

mov dx, word ptr orig_date

int 21h

; close files

mov ah, 3eh

mov bx, word ptr handle_1

int 21h

mov ah, 3eh

mov bx, word ptr handle_2

int 21h

; attrib

mov ah, 43h

xor al, al

mov dx, offset filename_1

int 21h

mov ah, 43h

mov al, 1

mov dx, offset filename_2

int 21h

; звiльнити

mov ah, 49h

int 21h

jc mem_err

ret

file_error:

mov ah, 9

mov dx, offset file_errmsg

int 21h

mov ah, 4ch

    продолжение
--PAGE_BREAK--

int 21h

mem_err:

mov ah, 9

mov dx, offset mem_errmsg

int 21h

mov ah, 4ch

int 21h

copy_file endp

;

; end copy_file

;

;

; process_dirs

;

process_directory proc

; взнати адресу DTA

mov ah,2fh

int 21h; es:bx – DTA

; findfirst

mov ah, 4eh

mov cx, 10h

mov dx, offset all_dirs;*.*

int 21h

dfindnext:

jnc zzz

jmp dstop_search; кiнець пошуку

zzz:

cmp byte ptr [bx+15h], 10h

jne not_dir

cmp byte ptr [bx+1eh], '.'

jenot_dir

; отже, знайдено пiдкаталог

; 1) до filename_2 додати його назву

movdi, offsetfilename_2

mov cx, 100

xor ax, ax

repnz scasb

dec di

mov si, bx

add si, 1eh

mov cx, 13

rep movsb

; 2) створити каталог filename_2

mov ah, 39h

mov dx, offset filename_2

int 21h

; 3) до filename_2 додати \

mov di, offset filename_2

mov cx, 100

xor ax, ax

repnz scasb

dec di

mov byte ptr [di], '\'

mov byte ptr [di+1], 0

push di

; 4) перейти в знайдений каталог

movah, 3bh

mov dx, bx

add dx, 1eh

int 21h

jc skip_thisd

; 5) зберегти DTA

sub sp, 2bh

cld

mov di, sp

mov si, bx

mov cx, 2bh

rep movsb

; 6) call process_files

call process_files

; 7) вiдновити DTA

mov di, bx

mov si, sp

mov cx, 2bh

rep movsb

add sp, 2bh

; 8) chdir.

mov ah, 3bh

mov dx, offset up_dir

int 21h

skip_thisd:

; 9) вiд filename_2 вiдняти назву

pop di

sub di, 2

std

mov al, '\'

mov cx, 13

repnz scasb

mov byte ptr [di+2], 0

cld

not_dir:

; робимо findnext

mov ah, 4fh

    продолжение
--PAGE_BREAK--

int 21h

jmp dfindnext

dstop_search:; стоп пошуку

ret

process_directory endp

;

; process_dirs

;

;

; process_files

;

; копiювання файлiв в 1 каталозi

process_files proc

; взнати адресу DTA

mov ah, 2fh

int 21h; es:bx – DTA

; findfirst

mov ah, 4eh

xor cx, cx

mov dx, offset filename_1

int 21h

findnext:

jc stop_search; кiнець пошуку

; copy

; побудувати targetname

push es

; копiюємо path

mov si, offset filename_2

mov di, offset targetname

push ds

pop es

fil0: lodsb

cmp al, 0

je stop_fil0

stosb

loop fil0

stop_fil0:

; додати filename

mov si, bx

add si, 1eh

fil1:

lodsb

cmp al, 0

je stop_fil1

stosb

loop fil1

stop_fil1:

mov byte ptr [di], 0

mov si, bx

add si, 1eh

mov di, offset targetname

push bx

call copy_file

pop bx

pop es

; видати iм`я файла

movsi, bx

add si, 1eh

cont_inc:

mov al, [si]

cmp al, 0

je stop_inc

inc si

jmp cont_inc

stop_inc:

mov byte ptr [si], 10

mov byte ptr [si+1], 13

mov byte ptr [si+2], '$'

mov dx, bx

add dx, 1eh

mov ah, 9

int 21h

; copy

; робимо findnext

mov ah, 4fh

int 21h

jmp findnext

stop_search:; стоп пошуку

cmp byte ptr ds: [process_dirs], 1

jneno_dirs

;

; виклик пошуку каталогiв

;

call process_directory

no_dirs:

ret

process_files endp

;

; process_files

;

;

; process_commandline

;

process_commandline proc

mov si, 80h

mov al, [si]

cmp al, 0

    продолжение
--PAGE_BREAK--

je params_error

add si, 2

mov di, offset filename_1

name_1:

lodsb

cmp al, 20h

je stop_name1

cmp al, 13

je params_error

stosb

jmp name_1

stop_name1:

mov di, offset filename_2

name_2:

lodsb

cmp al, 20h

je stop_name2

cmp al, 13

je stop_name2

stosb

jmp name_2

stop_name2:

mov byte ptr [di], '\'

cmp al, 13

je stop_cmdl

name_s:

lodsb

cmp al, 20h

je stop_names

cmp al, 13

je stop_names

cmp al, 's'

jne name_s

mov byte ptr [process_dirs], 1

stop_names:

stop_cmdl:

ret

params_error:

mov dx, offset param_err

mov ah, 9

int 21h

mov ah, 4ch

int 21h

process_commandline endp

;

; process_commandline

;

begin:

; decrease memory size

cld

mov bx, 4096

mov ah, 4ah

int 21h

mov ax, bx

shl ax, 4

dec ax

mov sp, ax

call process_commandline

call process_files

exit 0

end start

K_REN.ASM

; перейменування файла

; k_ren name1.ext1 name2.ext2

model tiny

code

org 100h

start:

jmp go

old_name db 50 dup(0)

new_name db 50 dup(0)

; old_name db 'autoexec.bat', 0

; new_name db 'ccc.xxx', 0

em db 'Error!$'

go:

push cs

pop ax

mov ds, ax

mov es, ax

; names

mov bx, 80h

mov dl, byte ptr cs: [bx]; length

cmp dl, 0

je error

; old name

xor ax, ax

mov si, 82h

mov di, offset old_name

next_sym:

mov al, [si]

cmp al, ' '

je stop

mov [di], al

inc si

inc di

inc ah

cmp ah, dl

ja error

jmp next_sym

stop:

; new name

mov di, offset new_name

inc si

next_sym1:

mov al, [si]

cmp al, 13

je stop1

mov [di], al

inc si

inc di

inc ah

cmp ah, dl

ja error

jmp next_sym1

stop1:

; перейменовуємо

mov dx, offset old_name

mov di, offset new_name

mov ah, 56h

int 21h

jnc no_error

error:

mov ah, 9

mov dx, offset em

int 21h

no_error:

exit 0

end start


еще рефераты
Еще работы по информатике