Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 1434 | Дата выхода: | 02.04.2011, 17:00 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 214 / 66 | Вопросов / ответов: | 1 / 1 | Вопрос № 182648: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Дан файл(текстовый), скопировать текст из файла, начиная с 10 байта и до конца в файл, имя которого задается с клавиатуры. Заранее спасибо! Написать в tasm(DOS). Модель па... Вопрос № 182648: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Дан файл(текстовый), скопировать текст из файла, начиная с 10 байта и до конца в файл, имя которого задается с клавиатуры. Заранее спасибо! Написать в tasm(DOS). Модель памяти на усмотрение. Отправлен: 28.03.2011, 16:16 Вопрос задал: JohnyWayne (Посетитель) Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич (Старший модератор) : Здравствуйте, JohnyWayne! Вот и программа. Файловые операции проверяются на ошибки. Будет непонятно - спрашивайте.
Код: .model small .code start: mov ax, @data mov ds, ax mov es, ax
mov ss, ax ;сделаем стек вверху сегмента данных mov sp, 0
lea dx, sGetIn ;строка приглашения 'Enter input file name:' call GetName ;ds:dx = адресу имени входного файла
;откроем входной файл mov ax, 3d00h ;открываем файл на чтение int 21h jc OpenError ;ошибка? mov bx, ax ;сохраним описатель файла в bx для д альнейшей работы
;прочитаем lea dx, buffer ;адрес буфера mov cx, 0fc00h ;максимальное число байт (63k), которое мы будем читать mov ah, 3fh ;функция чтения int 21h jc ReadError ;ошибка? mov si, ax ;сохраним длину файла в si
mov ah, 3eh ;закроем входной файл int 21h
;проверим на длину cmp si, 10 ;длина файла < 10? jb SizeError
;введем имя выходного файла lea dx, sGetOut ;строка приглашения 'Enter output file name:' call GetName ;ds:dx = адресу выходного файла
;создадим выходной файл xor cx, cx ;без атрибутов mov ah, 3ch ;функ int 21h jc CreateError ;ошибка? mov bx, ax ;сохраним описатель файла в bx для дальнейшей работы lea dx, buffer+10 ;адрес буфера, смещенный на 10 lea cx, [si-10] ;cx = длине файла - 10 mov ah, 40h ;функция записи int 21h jc WriteError ;ошибка lea dx, sCopied ;выведем 'Data copied'
MessageWithClose: ;выводим сообщение mov ah, 9 int 21h
CloseFile: ;закрываем файл mov ah, 3eh int 21h
PressAny: lea dx, sAny ;выведем 'Press any key' mov ah, 9 int 21h
mov ah, 0 ; ждем нажатие на клавишу int 16h
mov ax,4c00h ; конец работы int 21h
;обработка ошибок OpenError: ;ошибка открытия (файл или не найден, или занят) lea dx, sOpenErr jmp MessageWithoutClose ;сообщение без закрытия файла ReadError: ;ошибка чтения lea dx, sReadErr jmp MessageWithClose ;сообщение с закрытием файла SizeError: ;ошибка размера файла lea dx, sSizeErr jmp MessageWithoutClose ;сообщение без закрытия файла CreateError: ;ошибка создания выходного файла lea dx, sCreateErr MessageWithoutClose: ;сообщение mov ah, 9 int 21h jmp PressAny ;на вывод 'Press any key' WriteError: ;ошибка записи lea dx, sWriteErr jmp MessageWithClose ;сообщение с закрытием файла
;Подпрограмма ввода имени файла ;на входе: ds:dx - адрес сообщения ;на выходе: ds:dx - адрес имени GetName proc mov ah, 9 ;выведем приглашение из dx:dx int 21h
lea dx, buf ;введем строку mov ah, 0ah int 21h
xor bx, bx ;заменим последний код 0dh на 0 mov bl, len ;длина введенной строки mov byte ptr string[bx], 0 ;пишем 0
lea dx, string ;возвращаем адрес имени ret GetName endp
.data
;строки сообщений sGetIn db 0dh,0ah,'Enter input file name: $' sGetOut db 0dh,0ah,'Enter output file name: $' sCopied db 0dh,0ah,'Data copied$' sAny db 0dh,0ah,'Press any key$'
sOpenErr db 0dh,0ah,'File open error!$' sSizeE rr db 0dh,0ah,'File < 10 bytes!$' sReadErr db 0dh,0ah,'File read error!$' sCreateErr db 0dh,0ah,'File cre are error!$' sWriteErr db 0dh,0ah,'File write error!$'
buf label byte ; буфер для приема строки с клавиатуры (по ф-и 0ah) max db 128 ; максимальная длина строки len db 0 ; реальная длина введенной строки string db 128 dup (?) ; сама строка
buffer label byte ;буфер для чтения файла (размещаем за программой)
end start
----- Люби своего ближнего, как самого себя Ответ отправил: Лысков Игорь Витальевич (Старший модератор) Ответ отправлен: 28.03.2011, 17:32 Номер ответа: 266435 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Оценка ответа: 5 Комментарий к оценке: спасибо большое) Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 266435 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий