| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для начинающих > Дописать в файл "хвост" и блок окружения |
| Автор: boobie 13.10.2012, 08:27 | ||||
Доброго времени суток! Передо мной стоит задачка:
Как я понимаю это задание: в консоли пишем <имя программы> <имя существующего текстового файла>, программа ДОПИСЫВАЕТ (как это реализовать - пока не знаю) в этот текстовый файл <имя существующего текстового файла> (это вроде хвост, так?) и содержимое своего блока окружения (как это сделать - вообще не представляю). Затем выводится содержимое файла на экран. Начал решать и впал в ступор:
Т.е я не могу записать "хвост" с именем файла в файл. Споткнулся в самом начале, т.е. программа ничего не пишет, а должна ДОПИСЫВАТЬ. Файловая система - FAT32. В NTFS даже корректная программа, скорее всего, работать не будет... Как решить задачку? |
| Автор: boobie 13.10.2012, 11:10 | ||
Тогда что такое "хвост" и зачем он тут нужен?
Спасибо! А можно еще по-подробней, если не сложно? Т.е. немного конкретней, относительно данной задачи |
| Автор: ФедосеевПавел 13.10.2012, 12:45 | ||
Ну всю задачу за тебя решать не буду, а пример добавления четырёх строк в файл приведу. Файл должен уже существовать.
Что такое "хвост" в контексте данной задачи, наверное, стоит уточнить у преподавателя. |
| Автор: boobie 13.10.2012, 13:46 |
| Tasm 5 (линковщик) ругается - stack segment present. |
| Автор: ФедосеевПавел 13.10.2012, 14:53 |
| Прошло уже 2 часа. Наверное, ты и сам разобрался - у меня пример exe программы, а не com. Она линкуется без параметров: tlink myprog.obj |
| Автор: boobie 14.10.2012, 06:28 | ||
Ой... Я теперь пару дней разбиратся буду |
| Автор: boobie 14.10.2012, 12:28 | ||
Написал программулину, которая записывает в файл "хвост":
Так вот она начинает писать с самого начала - ее не интересует, что там уже написано. Как сделать так, чтобы она дописывала? Если размер файла 32 байта, то она запишет только 32 первых символа "хвоста", поэтому приходится "вручную" делать файл бОльшего размера. Есть какие-нибудь предложения? И да, она работает только в FAT! Как дописывать блок окружения - не предсавляю... |
| Автор: ФедосеевПавел 14.10.2012, 14:42 | ||||
| Давай по-порядку. 1. Дозапись в файл Попробуй посмотреть мой пример. Я его отладил и он действительно работает. Он дописывает в конец текстового файла 'text.txt'. Это связано с тем, что после открытия файла выполняется операция перемещения указателя в конец файла (LSEEK) и только после этого перемещения записываются строки. А в твоём примере файл открывается, а потом в него производится запись. Но указатель стоит на начале файла, поэтому в начало запись и происходит. Т.е. не дозапись, а перезапись. Как исправить - после открытия файла добавить перемещение указателя в конец (int 21h Fn=42h - "LSEEK").
2. Блок окружения. Чтобы добраться до переменных среды окружения нужно добраться до PSP. Словесное описание: а) int 21h Fn=62h вернёт в BX сегмент PSP. б) в PSP по смещению 2ch находится сегмент переменных среды окружения. в) зная адрес и формат хранения переменных среды окружения, можно их копировать в буфер, можно давать подпрограммам (прерываниям) адреса, вычислять длины строк и т.д. и т.п. Вот пример, он не самый лучший и не самый удачный, но показывает как "добраться" до ENVIRONMENT
|
| Автор: boobie 14.10.2012, 15:33 |
| 1. Да, после введения в код функции 42h 21 -го прерывания она записывает "хвост" в конец... При этом пропускает около 400 пробелов 2. Все отлично... выводится... P.S. Я сегодня, возможно, не смогу ответить - отвечу завтра. Спасибо за помощь! |
| Автор: ФедосеевПавел 14.10.2012, 17:05 |
| 1. Покажи код. Или в файле были 400 пробелов или при вызове int 21h Fn=42 в dx:cx что-то было. 2. EXE и COM - в учебнике по асму для DOS. Например, "С.В. Зубков. Ассемблер для DOS, Windows и UNIX" |
| Автор: boobie 15.10.2012, 05:48 |
| Проблема с выводом файла на экран. При записи в файл все знаки "$" заменяются на "S", в конце добавляется "$". Затем происходит считывание в буфер и вывод на экран... Когда натыкается на знак '$' - прекращает вывод. Как вывести полностью Как организовать вывод? Что делать? |
| Автор: boobie 15.10.2012, 15:33 |
| Как вывести файл по-другому? Причем целиком, в т.ч. с символами "$"? |
| Автор: ФедосеевПавел 15.10.2012, 20:24 | ||
| По-другому строки можно выводить: 1) средствами BIOS, 2) выводить на экран как в файл - если handle, т.е. содержимое bx, сделать равным 01h то вывод будет перенаправляться на дисплей. Т.о. у тебя в руках окажутся одни и те же процедуры и для вывода в файл и для вывода на экран. Для вывода на экран файл открывать и закрывать не нужно. Пример:
Компилировать tasm myprog.asm tlink myprog.obj P.S. Наступила рабочая неделя, я возвращаюсь домой поздно. Поэтому хочу выразить свою надежду на твою самостоятельную работу. P.P.S. Как я вижу твою программу: 1) ввод имени файла 2) открытие файла для дозаписи (кстати по сию пору не реализованное) 3) дозапись параметров пограммы (хвост) 4) запись окружения 5) закрытие файла 6) вывод на экран содержимого текстового файла теми же процедурами, что и в файл. |
| Автор: boobie 16.10.2012, 05:18 | ||
| 1. Нужно сделать COM-программу. Именно COM, под дос. 2. Моя программа полностью работает, она все дописывает в файл, т.е. файл содержит все, что нужно. ТОЛЬКО В FAT-32! Осталось только вывести его на экран. И вот тут проблема. Я не знаю какого он размера, т.к. размер постоянно меняется. Можно считывать 4096 байт и выйти за пределы файла, вывести мусор. Можно поставить символ "$" после записи в файл, и тогда всегда будет выводится только результат первого выполнения программы. Я знаю только один способ вывода на экран:
Т.е. сейчас стоит только одна задача - вывести... вывести этот гребаный файл на экран... Целиком, но без мусора. Как это можно сделать? Только это... |
| Автор: ФедосеевПавел 16.10.2012, 18:55 | ||
Без обид. Ты читаешь мои посты? Для кого я привёл пример вывода на экран как в файл (второй способ)? Файл уже разбит на строки - в нём в конце каждой строки присутствует пара CR и LF. К чему это я... Читаешь из файла блок кратный 80 (длине строки) и выводишь на экран как в файл. А ОС сама разберётся с переводом на новую строку. Читаешь в цикле до тех пор, пока количество считанных байт не станет меньше размера буфера. Такая ситуация будет означать, что считан последний буфер. Описание int 21h Fn=3fh На входе: ah=3fh - номер функции DOS bx - описатель (хендл) файла cx - размер буфера для чтения, считано будет не более чем размер буфера ds:dx - адрес буфера для чтения На выходе: если была ошибка чтения: CY=1, AX-код ошибки если чтение безошибочно: CY=0, AX-количество реально считанных байт. AX будет меньше размера буфера, если считан последний буфер. COM и EXE в исходниках отличаются лишь в оформлении - ничто не мешает использовать то, что я приводил ранее в COM. Вот COM программа чтения из файла "text.txt" и вывода на дисплей.
|
| Автор: boobie 15.11.2012, 14:27 |
| Спасибо большое! |