Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2009, 16:40   #1
Futa
 
Регистрация: 06.11.2009
Сообщений: 3
По умолчанию Копирование файла.

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

Подскажите в чем проблема пожалуйста. При компиляции ошибок не выдает, но сама не запускается(((

Код:
.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:
		cmp	al,0dh         ; Это конец строки?
		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

Последний раз редактировалось Stilet; 10.12.2009 в 17:17.
Futa вне форума Ответить с цитированием
Старый 11.12.2009, 10:18   #2
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

во второе имя файла попадает символ 0dh анализируйте код разбора строки здесь
Код:
NextChar:
		cmp	al,0dh         ; Это конец строки?
		jb	CmdStrEnd      ; Выходим, предполагаем, что это 0Dh (конец строки)
		stosb                  ; Нет, копируем этот символ
		lodsb                  ; Следующий символ командной строки
		cmp	al,' '         ; Это пробел?
		jne	NextChar       ; Нет, повторяем цикл
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 18.12.2009, 17:50   #3
Futa
 
Регистрация: 06.11.2009
Сообщений: 3
По умолчанию

Я с ассемблером дружу довольно плохо...разъясните пожалуйста поподробнее, как вообще анализировать код разбора строки?
Futa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование файла Killbrum Помощь студентам 9 07.09.2009 17:09
Копирование файла Яр|/||< (^_^) Общие вопросы Delphi 1 15.08.2009 14:38
копирование файла zmeyy Общие вопросы Delphi 6 08.06.2009 02:54
Копирование файла в VB Julia_Lisha Помощь студентам 0 10.05.2009 15:55
Копирование файла Sk!f Общие вопросы Delphi 9 15.04.2009 01:58