Міністерствоосвіти та науки УкраїниКіровоградський Державний Технічний університет
Кафедрапрограмного забезпечення
Курсоваробота
здисципліни “Програмування на мові ASM-86” на тему:
Програми– аналоги DOS-програм ren, xcopy
Зміст
1. Вступ
2. Постановказадачі
3. Обґрунтуваннявибору методів розв’язку задачі
4. Алгоритмпрограми
5. Реалізаціяпрограми
6. Системнівимоги
7. Інструкціядля користувача
8. Висновки.
9. Використаналітература
Лістинг програми
1. Вступ
З файлами надиску можна проводити певні операції – зокрема перейменовувати та копіювати. Уданій роботі розглянуті програми, які дозволяють перейменувати файл і скопіюватизадані файли та каталоги. Програми написані на мові ASM-86.
2.Постановка задачі
Необхіднонаписати програми для перейменування файлів та копіювання файлів і підкаталогів(аналоги REN, XCOPY).
3.Обґрунтування вибору методів розв’язку задачі
Для роботи зфайлами в можна використовувати його системний сервіс, який зосереджено вперериванні 21h. Зокрема, використовуються такі функції:
56h –перейменувати файл
3ch – створитифайл
3dh – відкритифайл
3eh – закритифайл
40h – читати зфайла блок
41h – записатиблок у файл
Для переглядудерева підкаталогів зручно використовувати рекурсивну функцію, яку викликатипри вході в підкаталог. Для пошуку будемо використовувати функції 4eh(findfirst) I 4fh (findnext).
4.Алгоритм програми
Алгоритмперейменування файла
1. Занести впам’ять комадний рядок
2. Викликатифункцію 56h
3. Якщо булапомилка, то вивести повідомлення.
Алгоритмкопіювання файлів
1. Проаналізуватикомандний рядок
2. Знайти всіфайли в поточному каталозі, які відповідають заданій масці
3. Для кожногофайла викликати функцію copy_file
4. Якщо не булозадано ключ /s, то закінчити перегляд
5. Знайти всіпідкаталоги
6. Зайти в коженпідкаталог диску і рекурсивно перейти в п. 2.
7. При завершенніповернутися у вихідний каталог
8. Кінець
5.Реалізація програми
Програмаскладається з функцій. Після запуску програми викликається функціяprocess_commandline для аналізу командного рядка. Потім відбувається викликфункції process_files, яка копіює всі файли в заданому каталозі в заданий.Копіювання здійснюється за допомогою функції copy_file.
Якщо було заданопараметр копіювання підкаталогів, викликається функція process_directory, якашукає всі підкаталоги в даному і для кожного рекурсивно викликає функціюprocess_files.
Після обробкивсіх файлів і каталогів виконання програми завершується. При копіюванні файліввиводиться ім’я кожного.
6.Системні вимоги
Операційнасистема DOS
CPU INTEL8086 або ст.
RAM 640K
VIDEO CGAабо старший7. Інструкція длякористувача
Для використання програмиперейменування файлів треба вказати:
k_ren letter.docletter.txt
Якщо не виникнепомилок, то файл буде перейменовано.
Для копіюваннятреба вказати такий рядок:
k_xcopy *.comc:\utils [/s]
де *.com – маскадля файлів, які треба копіювати, c:\utils – каталог, куди треба копіювати, анеобов’язковий ключ /s вказує на те, що в копіювання треба включити такожпідкаталоги даного підкаталогу. При копіюванні буде створено точну копіючастини дерева.
8.Висновки
Завдяки виконаннюкурсового проекту створені програми для перейменування файлів та копіюваннягрупи файлів. Вони є прикладом роботи з файловою системою засобами MS-DOS ідемонструє елементи системного програмування для IBM PC.
9.Використана література
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 'Parameterserror! Example: k_xcopy c:\*.* d: [/s]$'
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 100dup(0) ;1 параметр _xcopy
filename_2 db 100dup(0) ;2 параметр _xcopy
targetname db 100dup(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 forread
mov ah,3dh
xor al,al
mov dx,si
int 21h
jc file_error
mov word ptrhandle_1,ax
;get date
mov bx,ax
mov ax,5700h
int 21h
mov word ptrorig_time,cx
mov word ptrorig_date,dx
;open file forwrite
mov ah,3ch
xor cx,cx
mov dx,di
int 21h
jc file_error
mov word ptrhandle_2,ax
push ds
push es
pop ds
xor dx,dx
;read block
next_block:
mov ah,3fh
mov bx,word ptrcs: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 ptrcs:handle_2
int 21h
jmp next_block
stop_copy:
pop ds
;set date
mov ax,5701h
mov bx,word ptrhandle_2
mov cx,word ptrorig_time
mov dx,word ptrorig_date
int 21h
;close files
mov ah,3eh
mov bx,word ptrhandle_1
int 21h
mov ah,3eh
mov bx,word ptrhandle_2
int 21h
;attrib
mov ah,43h
xor al,al
mov dx,offsetfilename_1
int 21h
mov ah,43h
mov al,1
mov dx,offsetfilename_2
int 21h
; звiльнити
mov ah,49h
int 21h
jc mem_err
ret
file_error:
mov ah,9
mov dx,offsetfile_errmsg
int 21h
mov ah,4ch
int 21h
mem_err:
mov ah,9
mov dx,offsetmem_errmsg
int 21h
mov ah,4ch
int 21h
copy_file endp
;;;;;;;;;
;end copy_file
;;;;;;;;;
;;;;;;;;;;
;process_dirs
;;;;;;;;;;
process_directoryproc
; взнати адресу DTA
mov ah,2fh
int 21h ;es:bx — DTA
;findfirst
mov ah,4eh
mov cx,10h
mov dx,offsetall_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],'.'
je not_dir
; отже, знайденопiдкаталог
;1) до filename_2додати його назву
mov di,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,offsetfilename_2
int 21h
;3) до filename_2додати \
mov di,offsetfilename_2
mov cx,100
xor ax,ax
repnz scasb
dec di
mov byte ptr[di],'\'
mov byte ptr[di+1],0
push di
;4) перейти взнайдений каталог
mov ah,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) callprocess_files
callprocess_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,offsetup_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
int 21h
jmp dfindnext
dstop_search:; стоппошуку
ret
process_directoryendp
;;;;;;;;;;;;
;process_dirs
;;;;;;;;;;;;
;;;;;;;;
;process_files
;;;;;;;;
; копiюванняфайлiв в 1 каталозi
process_filesproc
; взнати адресуDTA
mov ah,2fh
int 21h ;es:bx — DTA
;findfirst
mov ah,4eh
xor cx,cx
mov dx,offsetfilename_1
int 21h
findnext:
jc stop_search; кiнецьпошуку
;;copy
; побудуватиtargetname
push es
; копiюємо path
mov si,offsetfilename_2
mov di,offsettargetname
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,offsettargetname
push bx
call copy_file
pop bx
pop es
; видати iм`яфайла
mov si,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 ptrds:[process_dirs],1
jne no_dirs
;
; виклик пошукукаталогiв
;
callprocess_directory
no_dirs:
ret
process_filesendp
;;;;;;;;
;process_files
;;;;;;;;
;;;;;;;;
;process_commandline
;;;;;;;;
process_commandlineproc
mov si,80h
mov al,[si]
cmp al,0
je params_error
add si,2
mov di,offsetfilename_1
name_1:
lodsb
cmp al,20h
je stop_name1
cmp al,13
je params_error
stosb
jmp name_1
stop_name1:
mov di,offsetfilename_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,offsetparam_err
mov ah,9
int 21h
mov ah,4ch
int 21h
process_commandlineendp
;;;;;;;;
;process_commandline
;;;;;;;;
begin:
;decrease memorysize
cld
mov bx,4096
mov ah,4ah
int 21h
mov ax,bx
shl ax,4
dec ax
mov sp,ax
callprocess_commandline
callprocess_files
.exit 0
end start
K_REN.ASM
; перейменуванняфайла
;k_ren name1.ext1name2.ext2
.model tiny
.code
org 100h
start:
jmp go
old_name db 50dup(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 ptrcs:[bx] ;length
cmp dl,0
je error
;old name
xor ax,ax
mov si,82h
mov di,offsetold_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,offsetnew_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, offsetold_name
mov di, offsetnew_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