![]() |
|
|
![]()
|
|
| boobie |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Доброго времени суток! Передо мной стоит задачка:
Как я понимаю это задание: в консоли пишем <имя программы> <имя существующего текстового файла>, программа ДОПИСЫВАЕТ (как это реализовать - пока не знаю) в этот текстовый файл <имя существующего текстового файла> (это вроде хвост, так?) и содержимое своего блока окружения (как это сделать - вообще не представляю). Затем выводится содержимое файла на экран. Начал решать и впал в ступор:
Т.е я не могу записать "хвост" с именем файла в файл. Споткнулся в самом начале, т.е. программа ничего не пишет, а должна ДОПИСЫВАТЬ. Файловая система - FAT32. В NTFS даже корректная программа, скорее всего, работать не будет... Как решить задачку? Это сообщение отредактировал(а) boobie - 13.10.2012, 09:28 |
||||
|
|||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: 4 Всего: 10 |
Тип файовой системы тебя в таком контексте волновать не должен, для этого есть ОС.
Схематично дозапись выглядит так: 1. OPEN int 21h Fn=3dh, на чтение и запись (AX=2) 2. LSEEK int 21h Fn=42h, установить указатель на конец файла. 3. WRITE int 21h Fn=40h ................................ N. WRITE int 21h Fn=40h N+1. CLOSE int 21h Fn=3eh Как добраться до копии переменных окружения: 1. В PSP по адресу (по смещению) 2Ch находится номер параграфа (сегмента) строки среды (переменных окружения), создаваемой DOS для выполняемой программы. 2. Каждая пременная отделена от следующей числом 00h, а если за таким разделителем следует ещё один 00h, то блок переменных окружения закончился. Т.к. всё сразу отладать невозможно, то выполняй поэтапно: 1. Вывод на экран переменных окружения. 2. Вывод в файл. Ещё, судя по
речь идёт о: 1. запуск прикладной программы 2. вывод на экран строки "введите имя файла" 3. ввод строки с именем файла Но никак не о параметре программы. |
|||
|
||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Тогда что такое "хвост" и зачем он тут нужен?
Спасибо! А можно еще по-подробней, если не сложно? Т.е. немного конкретней, относительно данной задачи Это сообщение отредактировал(а) boobie - 13.10.2012, 11:20 |
|||
|
||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: 4 Всего: 10 |
Ну всю задачу за тебя решать не буду, а пример добавления четырёх строк в файл приведу. Файл должен уже существовать.
Что такое "хвост" в контексте данной задачи, наверное, стоит уточнить у преподавателя. Это сообщение отредактировал(а) ФедосеевПавел - 13.10.2012, 12:51 |
|||
|
||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Tasm 5 (линковщик) ругается - stack segment present.
|
|||
|
||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: 4 Всего: 10 |
Прошло уже 2 часа. Наверное, ты и сам разобрался - у меня пример exe программы, а не com. Она линкуется без параметров:
tlink myprog.obj |
|||
|
||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Ой... Я теперь пару дней разбиратся буду |
|||
|
||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Написал программулину, которая записывает в файл "хвост":
Так вот она начинает писать с самого начала - ее не интересует, что там уже написано. Как сделать так, чтобы она дописывала? Если размер файла 32 байта, то она запишет только 32 первых символа "хвоста", поэтому приходится "вручную" делать файл бОльшего размера. Есть какие-нибудь предложения? И да, она работает только в FAT! Как дописывать блок окружения - не предсавляю... Это сообщение отредактировал(а) boobie - 14.10.2012, 13:01 |
|||
|
||||
| ФедосеевПавел |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: 4 Всего: 10 |
Давай по-порядку.
1. Дозапись в файл Попробуй посмотреть мой пример. Я его отладил и он действительно работает. Он дописывает в конец текстового файла 'text.txt'. Это связано с тем, что после открытия файла выполняется операция перемещения указателя в конец файла (LSEEK) и только после этого перемещения записываются строки. А в твоём примере файл открывается, а потом в него производится запись. Но указатель стоит на начале файла, поэтому в начало запись и происходит. Т.е. не дозапись, а перезапись. Как исправить - после открытия файла добавить перемещение указателя в конец (int 21h Fn=42h - "LSEEK").
2. Блок окружения. Чтобы добраться до переменных среды окружения нужно добраться до PSP. Словесное описание: а) int 21h Fn=62h вернёт в BX сегмент PSP. б) в PSP по смещению 2ch находится сегмент переменных среды окружения. в) зная адрес и формат хранения переменных среды окружения, можно их копировать в буфер, можно давать подпрограммам (прерываниям) адреса, вычислять длины строк и т.д. и т.п. Вот пример, он не самый лучший и не самый удачный, но показывает как "добраться" до ENVIRONMENT
Это сообщение отредактировал(а) ФедосеевПавел - 14.10.2012, 15:00 |
||||
|
|||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
1. Да, после введения в код функции 42h 21 -го прерывания она записывает "хвост" в конец... При этом пропускает около 400 пробелов
2. Все отлично... выводится... P.S. Я сегодня, возможно, не смогу ответить - отвечу завтра. Спасибо за помощь! Это сообщение отредактировал(а) boobie - 15.10.2012, 05:47 |
|||
|
||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: 4 Всего: 10 |
1. Покажи код. Или в файле были 400 пробелов или при вызове int 21h Fn=42 в dx:cx что-то было.
2. EXE и COM - в учебнике по асму для DOS. Например, "С.В. Зубков. Ассемблер для DOS, Windows и UNIX" |
|||
|
||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Проблема с выводом файла на экран. При записи в файл все знаки "$" заменяются на "S", в конце добавляется "$". Затем происходит считывание в буфер и вывод на экран... Когда натыкается на знак '$' - прекращает вывод. Как вывести полностью
Как организовать вывод? Что делать? Это сообщение отредактировал(а) boobie - 15.11.2012, 14:27 |
|||
|
||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
Как вывести файл по-другому? Причем целиком, в т.ч. с символами "$"?
Это сообщение отредактировал(а) boobie - 15.10.2012, 15:43 |
|||
|
||||
| ФедосеевПавел |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 7.2.2009 Репутация: 4 Всего: 10 |
По-другому строки можно выводить:
1) средствами BIOS, 2) выводить на экран как в файл - если handle, т.е. содержимое bx, сделать равным 01h то вывод будет перенаправляться на дисплей. Т.о. у тебя в руках окажутся одни и те же процедуры и для вывода в файл и для вывода на экран. Для вывода на экран файл открывать и закрывать не нужно. Пример:
Компилировать tasm myprog.asm tlink myprog.obj P.S. Наступила рабочая неделя, я возвращаюсь домой поздно. Поэтому хочу выразить свою надежду на твою самостоятельную работу. P.P.S. Как я вижу твою программу: 1) ввод имени файла 2) открытие файла для дозаписи (кстати по сию пору не реализованное) 3) дозапись параметров пограммы (хвост) 4) запись окружения 5) закрытие файла 6) вывод на экран содержимого текстового файла теми же процедурами, что и в файл. Это сообщение отредактировал(а) ФедосеевПавел - 15.10.2012, 20:39 |
|||
|
||||
| boobie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 162 Регистрация: 16.9.2011 Репутация: нет Всего: нет |
1. Нужно сделать COM-программу. Именно COM, под дос.
2. Моя программа полностью работает, она все дописывает в файл, т.е. файл содержит все, что нужно. ТОЛЬКО В FAT-32! Осталось только вывести его на экран. И вот тут проблема. Я не знаю какого он размера, т.к. размер постоянно меняется. Можно считывать 4096 байт и выйти за пределы файла, вывести мусор. Можно поставить символ "$" после записи в файл, и тогда всегда будет выводится только результат первого выполнения программы. Я знаю только один способ вывода на экран:
Т.е. сейчас стоит только одна задача - вывести... вывести этот гребаный файл на экран... Целиком, но без мусора. Как это можно сделать? Только это... Это сообщение отредактировал(а) boobie - 16.10.2012, 06:00 |
|||
|
||||
![]()
|
| Правила форума "Asm для начинающих" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для начинающих | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |