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

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

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

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

rep movsb    ; копируем

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

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

_no_second_source:

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

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

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

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

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

dec cx

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

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

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

rep movsb    ; копируем

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

mov ds, ax   ; и из AX помещаем его в DS

; сброс атрибутов файла источника source1

mov ax, 4301h        ; в AX номер функции "установка атрибута файла"

xor cx, cx     ; обнуляем CX - это будущий атрибут

mov dx, offset source1       ; в DX адрес строки, содержащей путь к файлу

int 21h         ; прерывание 21h - вызов функции MS-DOS

; открываем файл source1

mov ah, 3dh ; в AH номер функции "открытие файла"

xor al, al

mov dx, offset source1       ; в DX адрес строки, содержащей путь к файлу

int 21h         ; прерывание 21h - вызов функции MS-DOS

mov si, ax    ; сохраняем дескриптор  файла источника в регистре SI

; сздаём файл destination

mov ah, 3ch ; в AH номер функции "создание файла"

xor cx, cx

mov dx, offset destination  ; в DX адрес строки, содержащей путь к файлу

int 21h         ; прерывание 21h - вызов функции MS-DOS

mov di, ax    ;сохраняем дескриптор файла назначения в регистре DI

mov dx, offset buffer          ;в DX адрес буфера

; копируем файл    source1

_copy1_loop:

; читаем из файла источника

mov ah, 3fh ; в AH номер функции "чтение из файла"

mov bx, si    ; в BX дескриптор файла

mov cx, 1024          ; в CX сколько байт читать

int 21h         ; прерывание 21h - вызов функции MS-DOS

cmp ax, 0     ; если в буфере пусто

jz _copy1_end         ; выходим

;пишем в файл назначения то, что прочитали в буфер

mov cx, ax   ; в CX количество прочитанных байт

mov ah, 40h ; в AH номер функции "запись в файл"

mov bx, di   ; в BX дескриптор файла

int 21h         ; прерывание 21h - вызов функции MS-DOS

jmp _copy1_loop    ; повториь

_copy1_end:

; закрываем файл source1

mov ah, 3eh ; в AH номер функции "закрыть файл"

mov bx, si    ; в BX дескриптор файла

int 21h         ; прерывание 21h - вызов функции MS-DOS

cmp bp, 0     ; если BP = 0

je _no_source2        ; то второго файла нет, пропускаем копирование

; сброс атрибутов файла источника source2

mov ax, 4301h        ; в AX номер функции "установка атрибута файла"

xor cx, cx     ; обнуляем CX - это будущий атрибут

mov dx, offset source2       ; в DX адрес строки, содержащей путь к файлу

int 21h         ; прерывание 21h - вызов функции MS-DOS

; открываем файл source2

mov ah, 3dh ; в AH номер функции "открытие файла"

xor al, al      ;  обнуляем AH

mov dx, offset source2       ; в DX адрес строки, содержащей путь к файлу

int 21h         ; прерывание 21h - вызов функции MS-DOS

mov si, ax    ; сохраняем дескриптор  файла источника в регистре SI

mov dx, offset buffer          ;в DX адрес буфера

; копируем файл    source2

_copy2_loop:

; читаем из файла источника

mov ah, 3fh ; в AH номер функции "чтение из файла"

mov bx, si    ; в BX дескриптор файла

mov cx, 1024          ; в CX сколько байт читать

int 21h         ; прерывание 21h - вызов функции MS-DOS

cmp ax, 0     ; если в буфере пусто

jz _copy2_end         ; выходим

;пишем в файл назначения то, что прочитали в буфер

mov cx, ax   ; в CX количество прочитанных байт

mov ah, 40h ; в AH номер функции "запись в файл"

mov bx, di   ; в BX дескриптор файла

int 21h         ; прерывание 21h - вызов функции MS-DOS

jmp _copy2_loop    ;повтор

_copy2_end:

; закрываем файл source2

mov ah, 3eh ; в AH номер функции "закрыть файл"

mov bx, si    ; в BX дескриптор файла

int 21h         ; прерывание 21h - вызов функции MS-DOS

_no_source2:

; закрываем файл destination

mov ah, 3eh ; в AH номер функции "закрыть файл"

mov bx, di   ; в BX дескриптор файла

int 21h         ; прерывание 21h - вызов функции MS-DOS

; завершаем работу программы

mov ah, 4ch                 ; в AH номер функции "завершение работы программы"

int 21h         ; прерывание 21h - вызов функции MS-DOS

end _star