2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
1

TASM. Копирование указанного файла (имена исходного и результирующего файла задаются в командной строке)

20.11.2012, 20:11. Показов 2649. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел программу, но не смог добиться работы от нее.
Описание: Пример программы (в формате DOS COM) копирования файла; имена исходного и результирующего файла задаются в командной строке (в данном примере атрибуты файла и дата/время создания не сохраняются).

Ошибки tasm не нашел, но она просто не хочет выводить запрос на ввод имени исходного файла, вместо этого выводится сообщение которое помещено в: WrongMsg db 'Необходимо задать имена исходного и получаемого файлов!',13,10,'$' (Это 90 строка в коде).

Код:
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
; tasm /m filecopy.asm
; tlink /t /x filecopy.obj
 
.MODEL Tiny
.CODE
ORG 100h
 
BufSize     =   32768          ; Размер буфера
 
Start:
 
        mov si,81h         ; Адрес командной строки
        lea di,Filename1   ; Сначала будем читать имя первого файла
        mov cx,2           ; Нам нужно 2 параметра
        cld                    ; Прямой порядок чтения
 
ClearSpaces:    lodsb                  ; Читаем символ из командной строки
        cmp al,' '         ; Это пробел?
        je  ClearSpaces    ; Да, пропускаем его!
NextChar:
        jb  CmdStrEnd      ; Выходим, предполагаем, что это 0Dh (конец строки)
        stosb                  ; Нет, копируем этот символ
        lodsb                  ; Следующий символ командной строки
        cmp al,' '         ; Это пробел?
        jne NextChar       ; Нет, повторяем цикл
CmdStrEnd:  mov al,0           ; Не используем XOR AL,AL, т.к. нужно сохранить флаги
        stosb                  ; Записываем ноль (конец строки)
        lea di,Filename2   ; Буфер для копирования второго параметра
        loope   ClearSpaces    ; Повторяем цикл (читаем следующий параметр)
; Цикл будет повторен только в том случае, если флаг ZF=1, т.е. после JE, но не после JB :)
 
        cmp Filename2,0    ; Проверяем - задано ли имя второго файла
        lea dx,WrongMsg    ; Готовим сообщение об ошибке
        je  ShowMsg        ; Нет (не задано), выходим
 
; Основная процедура копирования файлов
        mov ax,3D00h       ; AL = 0, для чтения...
        lea dx,Filename1
        int 21h            ; Открываем исходный файл
        jc  Error          ; Если CF=1, выводим сообщение об ошибке
        mov Handle1,ax     ; Сохраняем handle файла
 
        mov ah,3Ch
        mov cx,20h         ; Атрибуты создаваемого файла = Archive
        lea dx,Filename2
        int 21h            ; Создаем получаемый файл
        jc  Error
        mov Handle2,ax     ; Сохраняем handle файла
CopyNext:
        mov ax,4406h
        mov bx,Handle1
        int 21h            ; Проверяем - достигнут ли конец исходного файла
        or  al,al          ; Аналогично CMP AL,0
        je  EOF            ; Выходим из цикла, если достигнут конец файла
 
        mov ah,3Fh
        ; BX уже содержит handle исходного файла (от предыдущей функции)
        mov cx,BufSize
        lea dx,Buffer
        int 21h            ; Читаем из исходного файла
        jc  Error
 
        xchg    cx,ax          ; Перемещаем AX в CX
        mov ah,40h
        mov bx,Handle2
        ; DX уже содержит адрес буфера (от предыдущей функции)
        int 21h            ; Записываем в получаемый файл столько байт,
        jnc CopyNext       ; сколько мы смогли прочесть из исходного
 
Error:
        lea dx,ErrorMsg    ; Готовим сообщение об ошибке
ShowMsg:    mov ah,9
        int 21h            ; Выводим сообщение
 
        int 20h            ; Выходим из программы
 
EOF:
        mov ah,3Eh
        int 21h            ; Закрываем исходный файл (BX=Handle1 от ф-ии 4406h)
 
        mov ah,3Eh
        mov bx,Handle2
        int 21h            ; Закрываем получаемый файл
 
        lea dx,OkMsg       ; Готовим сообщение
        jmp ShowMsg        ; Идем на вывод сообщения
 
OkMsg       db  'Успешное завершение!',13,10,'$'
ErrorMsg    db      'Ошибка ввода/вывода!',13,10,'$'
WrongMsg    db  'Необходимо задать имена исходного и получаемого файлов!',13,10,'$'
 
Filename2   db  0,127 dup (?)  ; Имя получаемого файла
Filename1   db  128 dup (?)    ; Имя исходного файла
 
Handle1     dw  ?              ; Handle исходного файла
Handle2     dw  ?              ; Handle получаемого файла
 
Buffer      label   byte           ; Буфер для копирования
 
END     Start
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2012, 20:11
Ответы с готовыми решениями:

Копирование файла, используя имена исходного и копируемого файла как аргументы командной строки
Напишите программу копирования файла, которая использует имена исходного файла и копируемого файла...

Написать программу, создающую файл - копию заданного файла. Имена файлов задаются в командной строке
1. Написать программу, создающую файл - копию заданного файла. Имена файлов задаются в командной...

Поиск заданного файла в заданной папке (путь и имя файла задаются в командной строке)
Добрый вечер! Как сделать поиск заданного файла в заданной папке(путь и имя файла задаются в...

В командной строке задается имя входного файла и целое число Н. Распечатать последние Н строк указанного файла
В командной строке задается имя входного файла и целое число Н. Распечатать последние Н строк...

6
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
20.11.2012, 20:55 2
Здесь имена файлов задаются как параметры к выполняемому файлу в командной строке:

filecopy.com имя_исходного_файла имя_получаемого_файла

Имена файлов естественно в формате 8.3
8 символов – имя файла
3 символа - расширение
1
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
20.11.2012, 20:58  [ТС] 3
Спасибо, благодарю за помощь.
0
1 / 1 / 1
Регистрация: 26.12.2011
Сообщений: 46
07.12.2012, 14:21 4
Здравствуйте, не так давно начал изучение Assembler, пытался разобраться в вашей программе, но выдает такую ошибку "Required parameter is missing". Из-за чего так может быть?
0
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
07.12.2012, 14:43  [ТС] 5
Цитата Сообщение от Karkat Посмотреть сообщение
Здравствуйте, не так давно начал изучение Assembler, пытался разобраться в вашей программе, но выдает такую ошибку "Required parameter is missing". Из-за чего так может быть?
В cmd нужно вызывать прогу так: имя_проги.com 1.txt 2.txt - где 1.txt - файл который копируем, а 2.txt - файл который получается в результате копирования, в нем будет инфа с 1.txt. Т.е. в папке с имя_проги.com появятся два одинаковых файла.
0
0 / 0 / 1
Регистрация: 22.03.2014
Сообщений: 27
14.04.2014, 05:37 6
хотел посмотреть принцип работы вашей програмы так и не разобрался
при выполнении выводит такое: прилагаю картинку
TASM. Копирование указанного файла (имена исходного и результирующего файла задаются в командной строке)
0
Ушел с форума
Автор FAQ
16213 / 7544 / 1046
Регистрация: 11.11.2010
Сообщений: 13,544
14.04.2014, 09:47 7
teddy777,
программа SAZl предназначена для создания СОМ-файла, а ты создаешь ЕХЕ-файл. Там даже в первых двух строках написано как делать компиляцию и линковку
Assembler
1
2
; tasm /m filecopy.asm
; tlink /t /x filecopy.obj
кроме того, нужно было внимательно прочитать сообщение #5
Цитата Сообщение от SAZl Посмотреть сообщение
В cmd нужно вызывать прогу так: имя_проги.com 1.txt 2.txt - где 1.txt - файл который копируем, а 2.txt - файл который получается в результате копирования, в нем будет инфа с 1.txt. Т.е. в папке с имя_проги.com появятся два одинаковых файла.
0
14.04.2014, 09:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2014, 09:47
Помогаю со студенческими работами здесь

Разработать программу, производящую копирование заданного в командной строке файла
Здравствуйте, не могли бы помочь? Не могу разработать программу, производящую копирование заданного...

Напишите программу конкатенирующую (соединяющую воедино) последовательно несколько файлов. Имена файлов задаются в командной строке
Напишите программу конкатенирующую (соединяющую воедино) последовательно несколько файлов. Имена...

Копирование файла, если имя старого и нового файлов передается в командной строке
..помогите. даже не знаю с чего начать...лаба по ос..работаем в putty..а задание такое.. операции...

Написать программу, которая по указанному в качестве параметра в командной строке файлу создаёт текстовый файл, содержащий листинг исходного файла
Очень нужно написать программу на c++, а я даже условие не до конца понимаю! Буду очень благодарен...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru