Написание программы на языке Assembler, которая будет реализовывать функции команды copy в MS_DOS, включая возможность слияния двух файлов в один

Страницы работы

Содержание работы

Федеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования

“Московский государственный университет приборостроения и информатики”

Филиал    Сергиев Посад      специальность  230101

Кафедра   ИТ4  “Персональные компьютеры и сети”

Дисциплина        Системное программное обеспечение

Пояснительная записка

к курсовому проекту

   Вариант №3

 Студент                                                                                   А.Н.

Группа                    ИТ4-2006-01Д                шифр             06022

Проект защищён на оценку             

Руководитель проекта (работы)                                          

Члены комиссии

 


Сергиев Посад 2009


Содержание

Постановка задачи. 3

Блок схема. 4

Описание интерфейса программы. 5

Листинг программы. 6


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

Написать программу на языке assembler, которая будет реализовывать функции команды copy в ms-dos, включая возможность слияния двух файлов в один.


Блок схема.

               Описание интерфейса программы.

Для запуска программы необходимо запустить командный файл start.bat, в котором заранее прописаны команды, необходимые для компилирования, создания исполняемого файла и его запуска с передачей необходимых параметров.

Внешний вид окна программы.

 
 


Формат записи в командной строке программы:

1.  Имя_файла_источника имя_нового_файла - если необходимо скопировать данные из старого файла в новый.

2.  Имя_файла_источника1 имя_файла_источника2 имя_нового_файла – если необходимо скопировать и объединить данные из двух файлов в один новый.

Между именами файлов обязательно должен стоять один пробел.

Имена файлов могут быть произвольными.

Листинг программы.

.model                                 small ; модель памяти "small"

.stack                                   100h ; стэк размером 256 байт

.data                                     ; сегмент данных

source1                                db 128 dup(0) ; массив байт, строка, в ктоторую бдет записан путь источника  №1

source2                                db 128 dup(0) ; массив байт, строка, в ктоторую бдет записан путь источника  №2

destination              db 128 dup(0) ; массив байт, строка, в ктоторую бдет записан путь назначения

buffer                                  db 1024 dup (0)          ; буфер для копирования файлов

.code                                    ; сегмент кода

_start:                                  ; точка входа

mov bp, 0 ; признак того, что копируем только один файл

cld    ; сбрасываем флаг направления, чтобы все строковые операции выполнялись в прямом порядке

; копируем из командной строки путь источника и назначения

; параметры, переданные в командную строку расположены по смещению 80h

; ищем пробел, разделяющий пути источника и назначения

mov al, ' '     ; заносим  в AL то, что будем искать, то есть пробел

xor ch, ch     ; обнуляем CH

mov cl, byte ptr ds:[80h]    ; в CL заносим количество символов в командной строке

mov di, 82h ; в DI заносим адрес начало командной строки

repne scasb  ; ищем

; как только пробел будет найден DI будет указывать на следующий после пробела символ

mov bx, di   ; сохраним в регистр BX значение DI

; копируем в строку source1 символы, находящиеся до пробела

mov cx, di   ;  заносим в CX адрес следующего за пробелом символа

sub cx, 83h  ; корректируем CX так, чтобы получилось количество символов до пробела

mov si, 82h  ; в SI адрес начала копируемой строки

mov ax, @data        ; заносим в AX адрес начала сегмента данных

mov es, ax   ; и из AX помещаем его в ES

mov di, offset source1        ; в DI адрес строки куда копировать

rep movsb    ; копируем

; ищем второй пробел

xor ch, ch     ; обнуляем CH

mov cl, byte ptr ds:[80h]    ; в CL заносим количество символов в командной строке

add cx, 82h  ; корректируем CX так, чтобы получилось количество символов после пробела до конца строки

sub cx, bx

inc si ; в SI адрес начала строки после первого пробела

mov ax, ds   ; копируем DS в ES

mov es, ax  

mov al, ' '     ; заносим  в AL то, что будем искать, то есть проел

mov di, si     ; копируем его в DI

repne scasb  ; ищем

jne _no_second_source      ; копируем символы после пробела в строку destination, если не нашли второй пробел

mov bp, 1 ; признак того, что будем сливать два файла в один

mov dx, di   ; сохраним в регистр DX значение DI

; копируем в строку source2 символы, находящиеся до второго пробела

mov cx, di   ;  заносим в CX адрес следующего за пробелом символа

sub cx, bx    ; корректируем CX так, чтобы получилось количество символов до пробела

dec cx

mov si, bx    ; в SI адрес начала копируемой строки

Похожие материалы

Информация о работе