В практике программирования часто встречаются задачи, решение которых требует большого количества относительно мало изменяемых во времени данных. Ввод данных с экрана заново при каждом счете для этих задач очень трудоемок, а часто просто невозможен из-за временных ограничений. Для решения этой проблемы в языках программирования была реализована концепция файлов, что позволяет после набора информации на клавиатуре запоминать ее на некотором носителе и обращаться к ней непосредственно из обрабатывающих программ при каждом счете.
Напомним, что файл — это структурированный тип данных, состоящий из компонентов одного типа. Файлы записей часто называют базой данных и относят к так называемым типизированным файлам. Типизированный Файл с точки зрения языка ПАСКАЛЬ — это структурированный тип данных, состоящий из последовательности компонентов одного типа и одной длины. Для типизированных файлов файловый тип и файловую переменную задают с помощью следующей синтаксической конструкции:
где типом компонент файла данных может быть любой тип Паскаля, кроме файлов, но чаще всего является комбинированный тип RECORD (запись).
Определение типа файлов начинается ключевыми словами FILE OF, после которых задается тип компонентов файла, который описывает, что содержит данный файл. Далее следует идентификатор предварительно определенного типа файла. Число компонентов, называемое длиной файла, определением типа файла не фиксируется.
Идентификатор файловой переменной определяет имя файла в программе. Можно в разделе VAR определить несколько файловых переменных, что дает возможность программе работать одновременно с несколькими файлами одного или различных типов. В качестве примера приведем фрагмент программы, работающей с файлом Fstd базы данных, хранящим сведения о студентах:
В этом примере имя типа файла в явном виде не используется. Для описания файла использован второй способ, так называемое неявное определение файлового типа непосредственно в разделе VAR:
где F – переменная для доступа к файлу (файловая переменная). Вторая форма описания файлов проще запоминается и не вызывает ошибок при программировании. Переменные файлового типа нельзя использовать в выражениях. Их используют только в качестве аргументов процедур и функций, предназначенных для работы с файлами.
Файл хранится во внешней памяти на магнитном диске, и по мере необходимости данные из файла вызываются в оперативную память для обработки. Различают следующие состояния файла:
закрыт для чтения и записи;
открыт для записи, закрыт для чтения;
открыт для чтения закрыт для записи компонент;
открыт для чтения, открыт для записи компонент.
Доступ к компонентам файла осуществляется через указатель файла (буферную переменную). При чтении или записи этот указатель перемешается к следующему компоненту и делает его доступным для обработки. Буферная переменная имеет отличие от всех других переменных: она не может участвовать в выражения и операторах присваивания.
Для типизированных файлов, к которым относятся и файлы записей, используют два способа доступа к компонентам файла: последовательный и прямой (произвольный).
Исторически это разделение вызвано наличием устройств с последовательным (стримеры) и прямым доступом (магнитные диски). При последовательном способе доступа поиск начинается с первой записи файла и проверяется по очереди каждый компонент, пока не будет найден нужный (нужные). Произвольный способ доступа позволяет обращаться к компоненту по его порядковому номеру в файле. Если файлы расположены на магнитных дисках, то допускается значительная гибкость при работе с компонентами. Например, компоненты последовательно организованного файла могут обрабатываться с помощью прямого доступа компоненты произвольного файла — последовательно.
Однако программист самого начала на основе анализа структуры данных, требований к функциям программы и существующих ограничений должен четко уяснить, какой способ доступа к компонентам ему необходимо выбрать. От этого во многом зависит успех решения задачи и эффективность работы разрабатываемой программы.
Концептуальная схема файла приведена на рис.1
На рис. 1. а) представлен файл, с именем S, содержащий N компонент (записей). А на рис. 1. б) изображен пустой файл, в котором нет ни одной компоненты, только название и метка конца файла EOF.
Каждому файлу пользователя должно быть присвоено уникальное имя (в рамках каталога, в котором этот файл хранится), которое используется при обращении к этому файлу. Имя должно соответствовать стандарту MS-DOS и состоит из собственно имени (от 1 до 8 символов: букв или цифр) и необязательного типа файла (до 3-х символов). Если тип файла присутствует, он отделяется от первой части имени точкой. Тип файла присваивается обычно в мнемонической зависимости от содержимого файла.
Пример имени файла: STUDENTS.DAT
Для обращения к файлу необходимо указать путь, то есть имя диска, на котором расположен нужный файл (А, В, С, D, Е. ), корневой директорий и поддиректории, если они есть. Пример пути и имени файла, расположенного в корневом каталоге на диске:
Встроенные процедуры и функции обработки файлов
Процедуры осуществляют все необходимые действия по организации файлов и доступу к компонентам файлов. Процедуры и функции для работы с файлами записей весьма похожи на аналогичные процедуры и функции для текстовых файлов.
Для организации доступа к файлу записей следует объявить файловую переменную F следующим образом:
Assign (F, ST) — присвоить в программе имя файлу. Имя файла, которое является значением ST (строка текста типа String), ставится в соответствие с переменной файлового типа F. С момента выполнения процедуры Assign все действия над этой переменной будут эквивалентны действиям над файлом с именем, определяемым значением ST.
Rewrite (F) — создать новый пустой файл. Эта процедура служит для создания нового файла на диске. Имя файла должно быть предварительно определено в процедуре Assign. Если на диске уже был файл с таким именем, он уничтожается. Указатель файла устанавливается в первую позицию (с номером 0). Фактически файл не содержит ни одного компонента, он только подготовлен для загрузки (см. схему на рис. 2).
Reset (F) — установить указатель в начало файла. Выполнение процедуры обеспечивает установку указателя файла на первый компонент (запись с номером 0). Если эта процедура применена к несуществующему в указанном каталоге файлу, возникает ошибка ввода-вывода.
Read (F, Z) — читать текущий компонент из файла. С помощью этой команды производится чтение из дискового файла, определенного файловой переменной F значений Z1, Z2. ZN. После завершения выполнения процедуры, то есть чтения текущего компонента в переменную Z, указатель файла устанавливается на следующий компонент (запись).
Write (F, Z) — записать новый компонент в файл. Переменные Z1, Z2. ZN записываются в дисковый файл, определенный переменной F. После выполнения процедуры указатель перемещается к следующему компоненту.
Seek (F, к) — установить указатель на компонент Zk с порядковым номером k в файле. Указатель перемещается к компоненту с номером k, начиная счет с нуля, то есть первый компонент имеет номер 0, второй — 1, третий — 2 и т. д.
Close(F) — закрыть файл. Выполнение процедуры обеспечивает закрытие файлла, назначенного переменной F. Если файл был открыт, никогда не следует выходить из программы, предварительно не закрыв его.
Erase(F) — уничтожить файл. Выполнение процедуры вызывает уничтожение файла, назначенного переменной F. Если производится уничтожение открытого файла, его необходимо предварительно закрыть с помощью процедуры Close.
Rename(F, ST) — переименовать файл. Выполнение процедуры вызывает занесение в каталог диска (директорий) нового имени файла, определенного перемен ной F. Новое имя определяется значением текста в строке ST.
Truncate (F) — уничтожить все компоненты файла, начиная с места текущего положения указателя, и подготовить файл для записи.
Помимо перечисленных выше процедур следует использовать перечисленные ниже функции, которые выполняют дополнительные действия, облегчающие программисту обслуживание уже существующих файлов.
Eof (F) — проверить маркер «конец файла». Значение функции равно TRUE если указатель файла находится сразу за последним компонентом файла, и FALSE в любом другом случае.
FilePos (F) — определить текущий номер компонента. Функция возвращает целочисленное значение, равное номеру компонента, на котором установлен в данный момент указатель файла, соответствующего переменной F. Отсчет номера компонента начинается с нуля.
FileSize (F) — определить размер файла. Функция возвращает целочисленное значение, равное количеству компонентов файла, соответствующего переменной F. Эта функция обычно используется для проверки, содержит файл какую-либо информацию или является пустым. Если FileSize (F) = 0, то файл пуст, в другом случае файл содержит данные.
IOResult (F) — проверить результат выполнения последней операции ввода вывода на наличие ошибок. Если ошибка обнаружена, функция возвращает номер ошибки, если ошибок нет, возвращает значение 0. Эта функция используется при пассивном состоянии директивы <$1->для организации обработки ошибок ввода вывода самим пользователем. Покупайте качественные женские часы наручные по доступным ценам. Если программа для обработки ошибок отсутствует, наличие ошибки ввода-вывода не вызывает прерывания программы и выполняется следующий оператор.
Dos fn 22h: писать произвольную запись файла
важное примечание для тех кто считает, что здесь место халявных исполнений курсовых и лабораторных работ. тут обычно помогают тем, кто сам хоть что-то пытается понять и сделать, но что-то не понимает, что-то не получается. ведь ассемблер изучают и задачки на нём дают обычно не менеджерам по продажам и даже не всем физ.-мат. специальностям вы сами избрали этот путь? вот и идите по нему сами, ножками. с ручками и с головой.
короче, тут не сборище придурков-альтруистов, которым нечего делать и они ждут-не дождутся когда вы их попросите что-то сделать _за_ вас если позарез надо и вы даже готовы заплатить, тогда вам сюда удачи
Просьба все большие листинги оформлять тегом more.
если вам вдруг не отвечают или ответ вас не устраивает и вообще полезно прочитать всем спрашивающим
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Друзья,помогите доработать программу. Имеется программа на Assembler которая ищет целое слово, введенное с клавиатуры в файле «wesna.dat». как сделать так, чтобы поиск осуществлялся не в одном файле, а в нескольких-например, в четырех. Подробнее.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Товарищи, нужна помощь в решении. Написал две программки, 1-я заполняет файл «константными записями», заданными в самой программе, 2-я осуществляет буферезированный ввод строки. Как теперь осуществить буферезированное заполнение файла?
код 1-ой программы: ; заполнение ; файла ‘wesna.dat’
sega segment assume cs:sega,ds:sega org 100h beg: mov ah,3dh ;открытие файла mov al,1 ;атрибут 0-чт 1-з 2-чт-з lea dx,fname int 21h mov handle,ax mov si,0 mov di,0 m1: mov ah,42h ;установка указ mov al,0 ;код метода смещ 0-абс смещ mov bx,handle ;1-от нач ф с текущ позиции ;2- от конца ф с текущ поз mov cx,0 ;старш часть смещ mov dx,t ;младш часть смещ int 21h mov ah,40h ;чтение ф mov bx,handle mov cx,5 ;сколько читать lea dx,buf[di] ;куда читать int 21H add di,5 add t,5 inc si cmp si,5 jne m1
int 20h t dw 0 fname db ‘wesna.dat’,0 handle dw ? buf db ‘a111k’ db ‘b222l’ db ‘c333k’ db ‘d444l’ db ‘e555k’
код 2-ой программы: art segment assume cs:art,ds:art org 100h m1: mov ah,0ah lea dx,buf int 21h mov ah,09h lea dx,t3 int 21h mov bl,t1 mov di,0 m2: mov al,t2[di] mov t4[di],al inc di cmp di,bx jne m2 mov t4[di],’$’ mov ah,09h lea dx,t4 int 21h mov ah,08h int 21h int 20h ; fname db ‘leto.dat’,0 handle dw ? buf db 10 t1 db ? t2 db 9 dup (‘ ‘),’$’ t3 db 10,13,’$’ t4 db 9 dup (‘ ‘),’$’ art ends end m1
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору блин. и что понимать под Цитата:
буферезированное заполнение файла
?
зы. оформь всё в more, ShIvADeSt’у скоро надоест исправлять
Всего записей: 1744 | Зарегистр. 21-06-2006 | Отправлено:21:29 16-12-2006
HRyk
Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Нет проблем. Специально для ShIvADeSt’а готов на любые трудности. Буферезированное заполнение файла означает заполнение его любыми словами, вводимыми с клавиатуры. (Сейчас я умею заполнять файл «пробитыми константами» вида: a111k,b222l,c333k, как в программке 1) (Во второй программке я осилил буферезированный ввод строки) теперь нужно «совместить» эти программы, тоесть заполнять файл словами произвольной длины, вводимыми с клавиатуры, до тех пор, пока в файле не окажется некоторое количество символов. Не могу осилить уже несколько дней. Rain87, на тебя вся надежда
Всего записей: 162 | Зарегистр. 04-11-2006 | Отправлено:21:43 16-12-2006
rain87
Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору ShIvADeSt конечно будет безумно рад, узнав что такое буферизированное заполнение файла но я имел в виду то что написано в первом посте — Цитата:
все большие листинги оформлять тегом more.
по поводу задач щас посмотрю
Добавлено: HRyk в общем, ни одна из прог работать не хочет, глючат и вылетают. разбираться почему — как бы влом, вылетают даже после фикса очевидных багов (вроде неинициализации DS и т.п.). может у меня компилер несовместим с твоим? у меня tasm5.0
по поводу задачи — ну а в чём проблема то? если умеешь вводить строку буферизовано вводи её (столько символов, сколько надо), а потом пиши в файл всё что ввёл
зы. по-моему разумно пользовать функции расширенного чтения и записи — DOS Fn 3fH: Читать файл через описатель DOS Fn 40H: Писать в файл через описатель
Всего записей: 1744 | Зарегистр. 21-06-2006 | Отправлено:22:28 16-12-2006
HRyk
Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору ОК, Rain87, подскажи такую штукенцию: я прогу написал, она файл заполняет словами, вводимыми с клавы, но эти слова (в файле) если они меньше 9 символов, забиваются «значками» случайными, как это исправить?
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору HRyk когда ты читаешь 21 интом 10 функцией, то она тебе возвращает количество реально считанных символов. вот ты когда пишешь в файл, СХ ставь не 9, а вот это число, которое вернула 10 функция инт 21
Всего записей: 1744 | Зарегистр. 21-06-2006 | Отправлено:20:04 17-12-2006
Morpy
Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору У меня две нерешённых задачи по ассемблеру. Интересует вариант решения нижеприведённых заданий за деньги.
1)Шестнадцатеричное число представлено в виде строки ASCII. Преобразовать данную строку во внутреннее представление. Предусмотреть возможность многобайтного результата.
2)Заданы массивы A[N], B[N] из элементов типа word(целое 16-ти разрядное со знаком). Составить программу, формирующую массив C[N] из разности элементов массивов А и В. (с[i]=a[i]-b[i]). Размерность элементов массива с[n] должна обеспечивать корректное вычитание(если результат не умещается в 16-ти разрядах)
Надеюсь на Вашу помощь.
Всего записей: 3 | Зарегистр. 18-12-2006 | Отправлено:20:36 18-12-2006
akaGM
Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору для Цитата:
Интересует вариант решения нижеприведённых заданий за деньги
сюда
Всего записей: 19544 | Зарегистр. 06-12-2002 | Отправлено:20:48 18-12-2006
Morpy
Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Перенёс. Извините, просмотрел не все разделы :о
Всего записей: 3 | Зарегистр. 18-12-2006 | Отправлено:23:12 18-12-2006
AHuTA
Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Объясните пож. как запустить TASM.exe в windowsXP? или дайте ссылку. Спасибо!
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ребят помогите пожалуйста решить пару задач? времени обс. не хватает! 1 Ввести с клавиатуры строку. Посчитать в ней количество запятых. Вывести результаты на экран.
2 Разработать две подпрограммы, одна из которых сравнивает две строки по лексикографическому порядку, а другая обменивает значения двух строк. Разработать программу, которая вводит с клавиатуры несколь-ко строк (конец ввода пустая строка) и сортирует их в лексикографическом порядке.(способ передачи параметров в процедуру выбирать произвольно. Зациклить программу по вводу строки, а признаком окончания работы считать ввод пустой строки.)
Всего записей: 6 | Зарегистр. 25-12-2006 | Отправлено:22:58 25-12-2006
Всего записей: 1744 | Зарегистр. 21-06-2006 | Отправлено:18:06 26-12-2006
Qwezar
Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Люди, помогите плиз, эта прога ищет все полиндромы до 5000 нужно их вывести на экран и в файл, с экраном все ОК, а вот с файлом проблема, создается пкстой txt и все.
Код:
MODEL TINY .486 .CODE assume cs:@code,ds:@code,es:@code,ss:@code org 100h
mov ah,3ch ;Создание файла mov cx,0 ;Для записи и чтения mov dx,offset fn mov bx,fnd int 21h mov fnd,ax
Добавлено: блин. слушай, а обязательно делать перестановку строк? имхо проще сделать массив индексов, т.е. 1й элемент обозначает, какая строка стоит на 1м месте, 2й — какая на 2м и т.д.
т.е. если надо обменять строки 3 и 5 местами, то я в массиве индексов обменяю 3 и 5 элемент, а сами строки останутся на месте. а при выводе я выведу сначала строку, номер которой записан в 3 ячейке индексного массива — т.е. 5ю строку, а потом — то что в 5й ячейке — т.е. 3ю строку
если же надо обязательно перемещать строки (хоть это и тупость), то надо делать строки фиксированной длины — т.е. не любой, а жёстко заданной. иначе перемещение строк будет сущим кошмаром
Работа с файлами
Для удобства обращения информация в запоминающих устройствах хранится в виде файлов.
Файл – именованная область внешней памяти, выделенная для хранения массива данных. Данные, содержащиеся в файлах, имеют самый разнообразный характер: программы на алгоритмическом или машинном языке; исходные данные для работы программ или результаты выполнения программ; произвольные тексты; графические изображения и т. п.
Каталог ( папка , директория ) – именованная совокупность байтов на носителе информации, содержащая название подкаталогов и файлов, используется в файловой системе для упрощения организации файлов.
Файловой системой называется функциональная часть операционной системы, обеспечивающая выполнение операций над файлами. Примерами файловых систем являются FAT (FAT – File Allocation Table, таблица размещения файлов), NTFS, UDF (используется на компакт-дисках).
Существуют три основные версии FAT: FAT12, FAT16 и FAT32. Они отличаются разрядностью записей в дисковой структуре, т.е. количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет (до 4 кбайт), FAT16 – для дисков малого объёма, FAT32 – для FLASH-накопителей большой емкости (до 32 Гбайт).
Рассмотрим структуру файловой системы на примере FAT32.
Файловая структура FAT32
Устройства внешней памяти в системе FAT32 имеют не байтовую, а блочную адресацию. Запись информации в устройство внешней памяти осуществляется блоками или секторами.
Сектор – минимальная адресуемая единица хранения информации на внешних запоминающих устройствах. Как правило, размер сектора фиксирован и составляет 512 байт. Для увеличения адресного пространства устройств внешней памяти сектора объединяют в группы, называемые кластерами.
Кластер – объединение нескольких секторов, которое может рассматриваться как самостоятельная единица, обладающая определёнными свойствами. Основным свойством кластера является его размер, измеряемый в количестве секторов или количестве байт.
Файловая система FAT32 имеет следующую структуру.
Нумерация кластеров, используемых для записи файлов, ведется с 2. Как правило, кластер №2 используется корневым каталогом, а начиная с кластера №3 хранится массив данных. Сектора, используемые для хранения информации, представленной выше корневого каталога, в кластеры не объединяются. Минимальный размер файла, занимаемый на диске, соответствует 1 кластеру.
Загрузочный сектор начинается следующей информацией:
EB 58 90 – безусловный переход и сигнатура;
4D 53 44 4F 53 35 2E 30 MSDOS5.0;
00 02 – количество байт в секторе (обычно 512);
1 байт – количество секторов в кластере;
2 байта – количество резервных секторов.
Кроме того, загрузочный сектор содержит следующую важную информацию:
0x10 (1 байт) – количество таблиц FAT (обычно 2);
0x20 (4 байта) – количество секторов на диске;
0x2С (4 байта) – номер кластера корневого каталога;
0x1E8 (4 байта) – количество свободных кластеров, -1 если не известно;
0x1EС (4 байта) – номер последнего записанного кластера;
0x1FE (2 байта) – сигнатура ( 55 AA ).
Таблица FAT содержит информацию о состоянии каждого кластера на диске. Младшие 2 байт таблицы FAT хранят F8 FF FF 0F FF FF FF FF (что соответствует состоянию кластеров 0 и 1, физически отсутствующих). Далее состояние каждого кластера содержит номер кластера, в котором продолжается текущий файл или следующую информацию:
00 00 00 00 – кластер свободен;
FF FF FF 0F – конец текущего файла.
Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:
8 байт – имя файла;
3 байта – расширение файла;
Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:
8 байт – имя файла;
3 байта – расширение файла;
1 байт – атрибут файла:
1 байт – зарезервирован;
1 байт – время создания (миллисекунды) (число от 0 до 199);
2 байта – время создания (с точностью до 2с):
2 байта – дата создания:
2 байта – дата последнего доступа;
2 байта – старшие 2 байта начального кластера;
2 байта – время последней модификации;
2 байта – дата последней модификации;
2 байта – младшие 2 байта начального кластера;
4 байта – размер файла (в байтах).
В случае работы с длинными именами файлов (включая русские имена) кодировка имени файла производится в системе кодировки UTF-16. При этого для кодирования каждого символа отводится 2 байта. При этом имя файла записывается в виде следующей структуры:
1 байт последовательности;
10 байт содержат младшие 5 символов имени файла;
1 байт атрибут;
1 байт резервный;
1 байт – контрольная сумма имени DOS;
12 байт содержат младшие 3 символа имени файла;
2 байта – номер первого кластера;
остальные символы длинного имени.
Далее следует запись, включающая имя файла в формате 8.3 в обычном формате.
Работа с файлами в языке Си
Для программиста открытый файл представляется как последовательность считываемых или записываемых данных. При открытии файла с ним связывается поток ввода-вывода . Выводимая информация записывается в поток, вводимая информация считывается из потока.
Когда поток открывается для ввода-вывода, он связывается со стандартной структурой типа FILE , которая определена в stdio.h . Структура FILE содержит необходимую информацию о файле.
Открытие файла осуществляется с помощью функции fopen() , которая возвращает указатель на структуру типа FILE , который можно использовать для последующих операций с файлом.
«r» — открыть файл для чтения (файл должен существовать);
«w» — открыть пустой файл для записи; если файл существует, то его содержимое теряется;
«a» — открыть файл для записи в конец (для добавления); файл создается, если он не существует;
«r+» — открыть файл для чтения и записи (файл должен существовать);
«w+» — открыть пустой файл для чтения и записи; если файл существует, то его содержимое теряется;
«a+» — открыть файл для чтения и дополнения, если файл не существует, то он создаётся.
Возвращаемое значение — указатель на открытый поток. Если обнаружена ошибка, то возвращается значение NULL .
Функция fclose() закрывает поток или потоки, связанные с открытыми при помощи функции fopen() файлами. Закрываемый поток определяется аргументом функции fclose() .
Возвращаемое значение: значение 0, если поток успешно закрыт; константа EOF , если произошла ошибка.
Чтение символа из файла:
Аргументом функции является указатель на поток типа FILE . Функция возвращает код считанного символа. Если достигнут конец файла или возникла ошибка, возвращается константа EOF .
Запись символа в файл:
Аргументами функции являются символ и указатель на поток типа FILE . Функция возвращает код считанного символа.
Функции fscanf() и fprintf() аналогичны функциям scanf() и printf() , но работают с файлами данных, и имеют первый аргумент — указатель на файл.
Функции fgets() и fputs() предназначены для ввода-вывода строк, они являются аналогами функций gets() и puts() для работы с файлами.
Символы читаются из потока до тех пор, пока не будет прочитан символ новой строки ‘\n’ , который включается в строку, или пока не наступит конец потока EOF или не будет прочитано максимальное символов. Результат помещается в указатель на строку и заканчивается нуль- символом ‘\0’ . Функция возвращает адрес строки.
Dos fn 22h: писать произвольную запись файла
Связь с администрацией сайта:
Среди толпы я одинок
Вы здесь:
Home >
Блог >
Документация и курсы >
Самоучитель по ассемблеру >
Глава 18 — практика: работа с файлами, перехват и восстановление прерываний
Глава 18 — практика: работа с файлами, перехват и восстановление прерываний
Written by Administrator
Tagged under АссемблерAssemblerСамоучитель по ассемблеру
Print
Замечание! Это пожалуй самая большая глава! информация представленная в ней в принципе довольно важна! К сожалению при работе в NT/Windows 2000/XP вам не удастся опробовать пример! Тут нужен чистый DOS, или хотя бы Win9x! Я например воспользуюсь эмулятором!
Работа с файлами через описатели
Если программы, написанные на языках высокого уровня могут открыть файл без выполнения подготовительных действий (они выполняются автоматически), то ассемблерные программы должны создать специальные области данных, которые используются при операциях ввода/вывода. Используется два метода доступа к файлам: метод управляющего блока файла (FCB) и метод дескриптора файла. С помощью метода FCB можно получить доступ только к файлам, находящимся в текущем каталоге. Метод дескриптора файла позволяет получить доступ к любому файлу, независимо от того, какой каталог является текущим. Начиная с DOS версии 2.0, в набор функций прерывания 21h включе-ны UNIX-подобные файловые функции. Идея их состоит в том, что, когда программа открывает файл, DOS возвращает 16-битовое значение «описателя файла» (дескриптора файла) (handle). После этого, когда программа читает, позиционирует, пишет или закрывает файл, она ссылаетесь на него через описатель. Одно из самых больших удобств – то, что можно обращаться к некоторым устройствам так, как будто это дисковые файлы, через зарезервированные описатели DOS:
Ниже приведен перечень наиболее часто используемых функций пре-рывания 21h для работы с файлами через описатели. Функция 3cH Создать файл. Вход. AH=3ch DS:DX=адрес строки ASCIIZ с именем файла CX=атрибут файла Выход. AX=код ошибки, если CF установлен и описатель файла, если ошибки нет. Описание. Файл создается в указанном (или умалчиваемом) оглав-лении и открывается в режиме доступа «чтение/запись». Если файл уже существует, то при открытии файл усекается до нулевой длины. Если атрибут файла – «только чтение», открытие отвергается (атрибут можно изменить функцией 43H). Функция 5bH Создать новый файл (не должен существовать). Вход. AH=5bh DS:DX=адрес строки ASCIIZ с именем файла CX=атрибут файла Выход. AX=код ошибки, если CF установлен и описатель файла, если ошибки нет Описание. Этот вызов идентичен функции 3ch, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Функция 5aH Создать уникальный файл. Вход. AH=5ah DS:DX=адрес строки ASCIIZ с путем (заканчивается \) CX=атрибут файла Выход. AX=код ошибки, если CF установлен и описатель файла, если ошибки нет DS:DX (не изменяется) становится полным ASCIIZ-именем нового файла. Описание. Открывает (создает) файл с уникальным именем в оглав-лении, указанном строкой ASCIIZ, на которую указывает DS:DX. Описа-ние пути должно быть готово к присоединению в его конец имени файла. Необходимо обеспечить минимум 12 байт в конце строки. После возврата строка DS:DX будет дополнена именем файла. DOS создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и времени. Ес-ли имя файла уже существует, DOS продолжает создавать новые имена, пока не получит уникальное имя. Функция 3dH Открыть файл. Вход. AH=3dh DS:DX=адрес строки ASCIIZ с именем файла AL=режим открытия Выход. AX=код ошибки, если CF установлен и описатель файла, если ошибки нет Описание. В момент открытия файл должен существовать. Файл открывается в выбранном режиме доступа (AL = 0 – для чтения; AL = 1 – для записи; AL = 2 – для чтения и записи) и указатель «чтения/записи» ус-танавливается в 0. Функция 3eH Закрыть файл. Вход. AH=3eh BX=описатель файла Выход. AX= код ошибки, если CF установлен Описание. BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфер сбрасываются, а оглавление обновляется корректными размером, временем и датой. Функция 41H Удалить файл. Вход. AH=41h DS:DX=адрес строки ASCIIZ с именем файла Выход. AX=код ошибки, если CF установлен Описание. Имя файла не может содержать обобщенные символы («?» и «*»). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изме-нить этот атрибут через функцию 43H. Функция 42H Установить указатель чтения/записи (можно также узнать размер файла). Вход. AH=42h BX=описатель файла CX:DX=смещение указателя: (CX * 65536) + DX AL=0 переместить к началу файла + CX:DX AL=1 переместить к текущей позиции + CX:DX AL=2 переместить к концу файла — CX:DX Выход. AX=код ошибки, если CF установлен DX:AX=новая позиция указателя файла (если нет ошибки) Описание. Перемещает логический указатель чтения/записи к нужному адресу, с которого начнется очередная операция чтения или за-писи. Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX * 65536) + AX. Функция 3fH Читать из файла/устройства. Вход. AH=3fh BX=описатель файла DS:DX=адрес буфера для чтения данных CX=число считываемых байт Выход. AX=код ошибки, если CF установлен AX=число действительно прочитанных байт Описание. CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей програм-мы, адресуемый через DS:DX. Всегда необходимо сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт): 1) если AX=CX, (и CF сброшен) – чтение было корректным без ошибок; 2) если AX=0 – достигнут конец файла (EOF); 3) если AX Функция 40H Писать в файл/устройство. Вход. AH=40h BX=описатель файла DS:DX=адрес буфера, содержащего данные CX=число записываемых байт Выход. AX=код ошибки, если CF установлен AX=число действительно записанных байт Описание. CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX и записываются, начиная с текущей позиции указателя чтения/записи файла. Необходимо всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи): если AX = CX, запись была успешной; если AX Некоторые функции в качестве параметра используют атрибут файла. Атрибут — это один байт битовых флагов, связанный с каждым файлом и находящийся в элементе оглавления для файла. В атрибуте определены следующие биты: x x A D V S H R R- только чтение (нельзя обновлять или удалять); H- скрытый; S- системный; V- метка тома; D- элемент подоглавления; A- архивный; x- не используются. ASCIIZ строка, содержащая имя файла, имеет вид:
«‘d:\путь\имя_файла’,0»
Если диск и/или путь опущены, они принимаются по умолчанию. После вызова функции описатель файла должен быть сохранен для последующих операций. Количество описателей в системе регламентируется файлом CONFIG.SYS. Приведенный ниже пример иллюстрирует процесс работы с файлом через описатели в ассемблерной программе.
;Создание файла MOV AH,3CH MOV CX,0 LEA DX,BUF ;DS:DX – адрес ASCIIZ строки с именем INT 21H JC NO_CREATE ;Проверка флага переноса . . . ;Работа с файлом NO_CREATE: . . . BUF DB ‘d:\Users\1.txt’,0
Работа с файлами через DTA
Как было сказано ранее, используются два метода доступа к файлу: метод управляющего блока файла (FCB) и метод дескриптора файла. В любом случае программа при работе с файлами должна указывать место в памяти, куда будут помещаться принимаемые данные или откуда будут извлекаться выводимые. Обычно временный буфер устанавливается раз-мером в одну запись и бывает удобно описать его как строковую переменную в сегменте данных. Буфер, используемый методом FCB доступа к файлам, называется областью обмена с диском или DTA. На этот буфер указывает условный указатель, который хранится операционной системой и который может быть изменен программой. В документации этот указатель на DTA часто сам называют DTA. Указатель на DTA устанавливается специальной функцией DOS и после того как он установлен все функции чтения/записи автоматически обращаются к нему. Это означает, что сами функции не должны содержать адрес временного буфера. Для установки указателя на DTA используется функцию 1AH прерывания 21H (DS:DX должны указывать на первый байт DTA). Функция 2FH прерывания 21H сообщает текущую установку указателя DTA (при возврате ES:BX содержат сегмент и смещение DTA). Префикс программного сегмента PSP обеспечивает каждую программу 128-байтным встроенным DTA, начиная со смещения 80H и до 9FH. Программа может использовать его при нехватке памяти. Первоначально указатель на DTA указывает именно на этот буфер, поэтому если программа будет использовать его, то нет нужды устанавливать указатель. Этот буфер по умолчанию особенно удобно использовать с COM файлами, где DS указывает на начало префикса программного сегмента. Для файлов EXE может потребоваться небольшой добавочный код, чтобы использовать DTA по умолчанию.
Примечание: после извлечения года к нему необходимо прибавить 1980. Существует ряд функций для работы с файлами, используя DTA. Наиболее употребимые из них приведены ниже. Функция 1ah Установить адрес DTA. Вход. AH=1aH DS:DX=адрес для DTA Выход. Нет Описание. Устанавливает адрес DTA. Функция 2fh Дать текущий DTA. Вход. AH=2fH Выход. ES:BX=адрес для DTA Описание. Возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре (например, при проходе по дереву оглавления) может потребоваться со-хранить адрес DTA, а впоследствии восстановить его посредством функ-ции 1aH. Функция 4eh Найти 1-й совпадающий файл. Вход. AH=4eH DS:DX=адрес строки ASCIIZ с именем файла CX=атрибут файла для сравнения Выход. AX=код ошибки, если CF установлен DTA=заполнена данными (если не было ошибки) Описание. DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они подразумевают-ся по умолчанию. Обобщенные символы * и ? допускаются в имени файла и расширении. DOS находит имя первого файла в оглавлении, которое совпадает с заданным именем и атрибутом, и помещает найденное имя и другую информацию в DTA. Функция 4fh Найти следующий совпадающий файл. Вход. AH=4fH DS:DX= адрес данных, возвращенных предыдущей 4eH. Выход. AX=код ошибки, если CF установлен DTA=заполнена данными (если не было ошибки) Описание. DS:DX указывает на 2bH-байтовый буфер с информаци-ей, возвращенной функцией 4eH (либо DTA, либо буфер, скопированный из DTA).Необходимо использовать эту функцию после вызова 4eH. Сле-дующее имя файла, совпадающее по обобщенному имени и атрибуту фай-ла, копируется в буфер по адресу DS:DX вместе с другой информацией (см. функцию 4eH о структуре файловой информации в буфере, заполняе-мом DOS). Ниже приведен фрагмент программы, иллюстрирующий организацию поиска файлов в текущем каталоге.
;Установить адрес DTA MOV AH,01AH LEA DX,FDTA INT 21H . . . ;Наити первый совпадающий файл MOV AH,4EH LEA DX,MASKA MOV CX,10H INT 21H JC EXIT NEXT: . . . ;Найти следующий совпадающий файл MOV AH,4FH MOV CX,10H LEA DX,MASKA INT 21H JNC NEXT EXIT: . . . ;========== DTA ========= FDTA DB 15H DUP (?) FATTR DB ? FTIME DW ? FDATA DW ? FSIZE DD ? FNAME DB 0DH DUP (‘$’) ;======================== MASKA DB ‘*.*’,0
Структура PSP
Префикс программного сегмента PSP (Program Segment Prefics) – специальная область оперативной памяти размером 256 (100h) байт. PSP может использоваться в программе для определения имен файлов и пара-метров из командной строки, введенной при запуске программы на выпол-нение, объема доступной памяти, переменных окружения системы и так далее. После загрузки программы в память сегментные регистры DS и ES указывают на начало PSP этой программы.
Окружение DOS
DOS поддерживает область памяти, содержащую набор строк ASCIIZ, которые могут использоваться приложениями для получения некоторой системной информации и для передачи данных между программами. Эта область памяти называется окружением DOS. Структура окружения DOS:
Здесь «0» — это символ ASCII NUL (00H), а «xxxx» — 16-битовое дво-ичное значение (количество дополнительных строк). Окружение не превышает 32K байт и начинается на границе парагра-фа. Смещение 2cH в PSP текущей программы содержит номер параграфа окружения. Используя окружение, можно найти нужное имя’ серией срав-нений строк ASCIIZ, пока не достигнута пустая строка (нулевой длины), что указывает конец окружения. В последних версиях DOS, за концом официального окружения по-мещается дополнительная строка, которая содержит диск и путь, с которых была загружена программа. Вслед за последней строкой ASCIIZ окруже-ния находится нулевой байт, указывающий конец официального окруже-ния. Следующие два байта содержат 16-битовый двоичный счетчик допол-нительных строк (обычно 0001H). Вслед за значением счетчика находится строка ASCIIZ, содержащая путь и имя файла. Это в точности та строка, которая использовалась функцией DOS 4bH (EXEC) для загрузки и запуска программы.
Работа с прерываниями
Иногда необходимо выполнить одну из набора специальных проце-дур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре. Действие, стимулирующее вы-полнение одной из таких процедур, называется прерыванием. Существует два общих класса прерываний: внутренние и внешние. Первые иницииру-ются состоянием ЦП или командой, а вторые — сигналом, подаваемым от других компонентов системы. Переход к процедуре прерывания осуществляется из любой програм-мы, а после выполнения процедуры прерывания обязательно происходит возврат в прерванную программу. Перед обращением к процедуре преры-вания должно быть сохранено состояние всех регистров и флагов, исполь-зуемых процедурой прерывания, а после окончания прерывания эти реги-стры должны быть восстановлены. Последовательность прерывания состоит в следующем: 1) текущее значение регистра Flags включается в стек; 2) текущее значение регистра CS включается в стек; 3) текущее значение регистра IP включается в стек; 4) сбрасываются флаги IF и TF. Новое содержимое IP и CS определяет начальный адрес выполняемой процедуры прерывания (обслуживание прерывания). Возврат в прерван-ную программу осуществляется командой, которая извлекает из стека со-держимое для IP, CS и регистра флагов (обычно это команда IRET). Адреса подпрограмм обслуживания прерываний (вектора прерыва-ний) хранятся в таблице векторов прерываний. Таблица векторов прерыва-ний располагается по адресу 0000:0000 и представляет собой массив из 256 элементов, каждый элемент которого занимает 4 байта и представ-ляет собой начальный адрес процедуры обработки прерывания. Иногда в программе возникает необходимость переопределения (пе-рехвата) прерываний (например, выполнение дополнительных действий при нажатии определенной клавиши клавиатуры). Процесс перехвата пре-рываний состоит в следующем: 1) подготавливается FAR-процедура – новый обработчик прерыва-ний (должна заканчиваться командой IRET); 2) сохраняется старый вектор прерывания (функция 35h прерывания 21h) 3) адрес нового обработчика заносится в таблицу векторов прерыва-ний (функция 25h прерывания 21h); 4) в конце программы происходит восстановление первоначального обработчика прерываний. Функция 35h Вход. AH=35H AL=номер прерывания (00H до 0ffH) Выход. ES:BX=адрес обработчика прерывания Описание. Возвращает значение вектора прерывания для INT (AL), то есть загружает в BX 0000:[AL*4], а в ES – 0000:[(AL*4)+2]. Функция 25h Вход. AH=25H AL=номер прерывания (00H до 0ffH) DS:DX=вектор прерывания (адрес подпрограммы) Выход. Нет Описание. Устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. Это равно-сильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, в момент записи прерывания будут заблокированы.
Разбор практической программы
Задание: Создать текстовый файл «Dir.Txt», содержащий перечень файлов в текущем каталоге. Написать программу переопределения прерывания 05h (клавиша Print Screen). Примечание: 1) файл «Dir.txt» можно создавать через описатели; 2) получение пути по которому была запущена программа (первая строка в файле «Dir.Txt») можно осуществить, используя окружение DOS. Для этого, во-первых, необходимо получить адрес PSP (функция 062H прерывания 21H), во-вторых, найти в нем адрес окружения DOS. В-третьих, получив из окружения DOS строку, содержащую путь и имя за-пущенного файла, выделить из нее путь к текущему каталогу; 3) на следующем этапе производится поиск первого совпадающего с маской «*.*» файла и его имя записывается в файл «Dir.Txt». Перед на-чалом поиска необходимо правильно установить атрибут файла в CX для сравнения. Далее производится поиск следующего совпадающего с маской файла, используя функцию 04FH прерывания 21H. Если такой файл най-ден, то его имя записывается в «Dir.Txt», иначе осуществляется выход из программы; 4) перед загрузкой нового вектора прерывания необходимо сохранить старый вектор (функция 35h прерывания 21h); 5) новый обработчик прерывания должен быть FAR-процедурой; 6) для проверки, новая процедура обработки прерывания 05h должна выводить в динамик сигнал (прерывание 21H). В основной программе не-обходимо организовать большой цикл, например, выводящий на экран символы (прерывание 21h использовать нельзя, можно использовать, на-пример, прерывание 10h). Таким образом, при нажатии на PrintScreen во время этого цикла компьютер должен издавать сигнал.
Файл fandp.asm .model tiny .186 .code ;благодаря этой директиве мы сразу имеем адрес окружения! удобно! org 2Ch okr dw ? org 100h start: ;так можно загрузить сегм. регистр! push okr pop es ;начали искать строку с именем в окружении DOS xor ax,ax xor di,di cld met:scasb jne d cmp es:[di+1],byte ptr 0 je quit d:jmp met quit:add di,2 xor si,si ms:mov al,byte ptr es:[di] cmp al,0 je poka mov path[si],byte ptr al inc si inc di jmp ms ;закончили сканировать окружение в поисках пути ;перехватываем прерывание poka:sub si,9 mov ax,3505h int 21h mov word ptr oldint, bx mov word ptr oldint+2,es mov ax,2505h mov dx,offset inter int 21h ;выдаем писк! а то принт скрин всё равно нажать не успеем! int 5h mov ah,0h int 16h lea dx,mesg mov ah,9 int 21h ;открываем файл call openfile mov handle,ax mov ah,40h mov bx,handle mov cx,si lea dx,path int 21h mov ah,40h mov bx,handle mov cx,2 lea dx,crlf int 21h ;установить адрес dta mov ah,01ah lea dx,fdta int 21h ;начать поиск файлов mov ah,4eh lea dx,maska mov cx,10h int 21h jc exit mov di,0 mov cx,14 m0:cmp fname[di],’0′ je h0 inc di h0:loop m0 mov ah,40h mov bx,handle mov cx,di lea dx,fname int 21h mov ah,40h mov bx,handle mov cx,2 lea dx,crlf int 21h next:mov ah,4fh mov cx,10h lea dx,maska int 21h jc exit mov di,0 mov cx,14 m2:cmp fname[di],’0′ je h1 inc di h1:loop m2 mov ah,40h mov bx,handle mov cx,di lea dx,fname int 21h mov ah,40h mov bx,handle mov cx,2 lea dx,crlf int 21h xor ax,ax mov di,0 mov cx,14 m1:mov fname[di],al inc di loop m1 jmp next exit: mov ah,3eh mov bx,handle int 21h ;восстанавливаем вектор обратно mov ax,2505h mov dx,word ptr oldint+2 mov ds,dx mov dx,word ptr cs:oldint int 21h ret ;процедура обработки прерывания inter proc far pusha push es push ds mov dl,07 mov ah,02 int 21h pop ds pop es popa jmp cs:oldint inter endp ;процедура открытия файла openfile proc near mov ah,3ch mov cx,0 mov dx,offset buf int 21h jnc nerr mov dx,offset myerr mov ah,9 int 21h ;перевод строки mov dx,offset crlf mov ah,09h int 21h nerr: ret openfile endp ;. oldint dd ? mesg db «Find files$» crlf db 0Dh,0Ah,’$’ buf db «filedir»,0 myerr db «WARNING.File not create$» handle dw ? maska db «*.*»,0 fdta db 15h dup (?) fattr db ? ftime dw ? fdata dw ? fsize dd ? fname db 14 dup (‘0’) path db 256 dup (?) end start
Вот что имеем в результате запуска: (под эмулятором и на реальном DOS при запуске вы услышите «писк») список найденых файлов сохраняется в файле filedir
Dos fn 22h: писать произвольную запись файла
Ассемблер? Это просто! Учимся программировать (FAQ) ______________________________________
Вопросы, которые поступили от подписчиков рассылки «Ассемблер? Это просто! Учимся программировать»
Дата выхода: 2001-08-16
Здравствуйте! Значит, история такая: мой приятель купил винт Quantum AS на 10 гигов. И принёс мне — временно, пока он не купит все остальные части компа. А у меня его не видно. BIOS-то этот винт детектит, а вот Виндоуз — ни в какую. Я джамперы и так и сяк ставил — безуспешно. Быть может, дело в моей матплате Acorp для Pentium MMX ? Она у меня старая, 1997 года. Если так, то мне перед тем, как тоже винт покупать, и матплату сменить? (А заодно и процессор, и корпус с AT на ATX. ) Кстати, какую лучше брать матплату для Дюрона? Спасибо за внимание. Константин.
Привет! А ты его отформатировал? Если нет, то вначале иди запускай fdisk, создавай логические диски, а потом форматируй их с помощью format disk: Если хочешь, чтобы весь диск можно было одним куском отформатировать в программе fdisk надо согласиться на поддержку больших дисков( >2ГБ).
Отправил эксперт: Александр Эксперт отправил ответов (всего): 65
Экспертная группа: Модели, виды и типы компьютеров (hard)
Пишу программу работающую в реальном режиме времени Использую прерывание по таймеру Основная программа пишется на Паскале (Borland Pascal 7.0) Иницилизация таймера и обработка прерывания на ассемблере. В обработке прерывания работа с lpt-портом. И. проблема : добавление команд out dx,al (время выполнения по некоторым данным на 486 машине — 10 тактов, а у меня Celeron 433) приводит к изменению промежутка времени между прерываниями. Я в шоке! Помогите — горит проект и меня ждет жестокая расправа. Ниже привожу исходник.
Не знаю, что у меня хорошего получилось, но лучше, думаю, сделать так (см. приложение, там все написано).
Отправил эксперт: Василий Эксперт отправил ответов (всего): 20
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Здравствуйте, Broken Sword, уважаемые эксперты,
_программа_ должна трассировать Int 21h и сама принимять решение о местонахождении заданной функции. Весь процесс проходит _автоматически_ без человеческого вмешательства.
Ко всему, возможно, добавляются защиты от трассировки, вроде уничтожения векторов 1 и 3, проверка и подмена флагов трассировки, запись «мусора» в регистры TR1, TR2 . и т.д.
С нетерпением жду ответа, Андрей.
Не понял, ты хочешь, чтобы я тебе такую программу написал или у тебя есть идеи, но требуются консультации?
Отправил эксперт: Василий Эксперт отправил ответов (всего): 21
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
У меня проблема с завершением работы Windows98, мне приходится два раза повотрять операцию «Выключить компьютер». Каким образом мне изабивться от этого глюка?
Здравствуйте, Владимир! Могу сходу предложить три варианта действий: 1.Проверить машину стандартным regclean-ом (можно взять на download.com. 2.Проверить машину с помощью приблуды типа Нортон Виндоктор. Если ошибка была связана со сбоем в реестре — должно помочь. 3.Вариант, связанный с запуском приложения типа AVX ICQ checker. (Мне также приходится по два раза выключаться, после первого раза он выкидывает aqmon, после второго — собственно выключается.Но если пользуешься ICQ и не хочешь заловить вируса луче перестраховаться, не так ли =|;о) ).
Отправил эксперт: RANDOM Эксперт отправил ответов (всего): 10
Экспертная группа: Пользовательская работа с Windows
Как взять с дискетв серийный номр? Как записать в файл текстовую информациь?
Описание: CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX. Данные записываются, начиная с текущей позиции указателя чтения/записи файла.
Используйте функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает указатель в 0).
Обновляет указатель чтения/записи файла, чтобы подготовиться к последующим операциям последовательного чтения или записи.
Вы должны всегда сравнивать возвращаемое значение AX (число запи- санных байт) с CX (запрошенное число байт для записи). если AX = CX, запись была успешной если AX Эксперт отправил ответов (всего): 22
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Здравствуйте! Значит, история такая: мой приятель купил винт Quantum AS на 10 гигов. И принёс мне — временно, пока он не купит все остальные части компа. А у меня его не видно. BIOS-то этот винт детектит, а вот Виндоуз — ни в какую. Я джамперы и так и сяк ставил — безуспешно. Быть может, дело в моей матплате Acorp для Pentium MMX ? Она у меня старая, 1997 года. Если так, то мне перед тем, как тоже винт покупать, и матплату сменить? (А заодно и процессор, и корпус с AT на ATX. ) Кстати, какую лучше брать матплату для Дюрона? Спасибо за внимание. Константин.
Здравствуйте, Константин! Просто напросто у тебя жёсткий диск новый, поэтому на нем нет никакой файловой системы(для Win — обычно Fat 32, для Пингвина — Ext2+Swap). Тебе надо найти FDisk(стандартная для Win) или Partition Magic, затем создать основной раздел дос на нём(или ещё дополнительный), тогда всё будет в порядке. А, вообще, обычно к жёсткому диску при покупке должна прилагаться дискета с утилитой установки жесткого диска!
Отправил эксперт: Orlando Эксперт отправил ответов (всего): 10
Экспертная группа: Модели, виды и типы компьютеров (hard)
Как взять с дискетв серийный номр? Как записать в файл текстовую информациь?
Здравствуйте, fagot! По первому вопросу читай выпуск 056 этой рассылки, там есть как найти серийный номер винта(и дискеты соответственно) По второму вопросу Для открытия функция 3dh al=Access mode(0-read, 1-write, 2-both) DS:DX=ASCIIZ строка полного пути файла Выход если бит С=1 AX=Error code, иначе AX=Handle Тогда для записи используем ф-цию 40h AX=40h BX=Handle CX=кол-во байт для записи DS:DX-адрес буфера Выход если бит С=1 AX=кол-во реально записанных байт
Отправил эксперт: Sensey Эксперт отправил ответов (всего): 76
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Здравствуйте! Значит, история такая: мой приятель купил винт Quantum AS на 10 гигов. И принёс мне — временно, пока он не купит все остальные части компа. А у меня его не видно. BIOS-то этот винт детектит, а вот Виндоуз — ни в какую. Я джамперы и так и сяк ставил — безуспешно. Быть может, дело в моей матплате Acorp для Pentium MMX ? Она у меня старая, 1997 года. Если так, то мне перед тем, как тоже винт покупать, и матплату сменить? (А заодно и процессор, и корпус с AT на ATX. ) Кстати, какую лучше брать матплату для Дюрона? Спасибо за внимание. Константин.
Здравствуйте, Константин! Кажись ты прав- твоя мать видит винты до 8 гиг Хотя! Попробуй его на отдельный шлейф, причем строго Primary Master А загружайся с другого, то есть типа с D Для Дюрона лучше всего Soltek, хотя Canyon лучше, но дороже И не пожалей лишних 3$ на корпус, возьми CodeGen- он пошире, охлаждение получше, и Дюрон с хорошим вентилятором точно влезет.
Отправил эксперт: Sensey Эксперт отправил ответов (всего): 77
Экспертная группа: Модели, виды и типы компьютеров (hard)
с ЛЕМЪ РЮЙЮЪ ОПНАКЕЛЮ. лЮРЕПХМЯЙЮЪ ОКЮРЮ Asus CUEP2-M. мЮЯРПНИЙХ ОН СЛНКВЮМХЧ ГЮБНДЯЙХЕ. оНД DOCНЛ (МЕ ГЮЦПСФЮЪ Windows) Ъ МЕ БХФС ЛШЬЭ Х ХМНЦДЮ ОПНОЮДЮЕР ЙКЮБХЮРСПЮ. щРН ВРН МЕХЯОПЮБМНЯРЭ ЛЮРЕПХ ХКХ ЦДЕ-РН Ъ МЕСЯКЕДХК, МН МЮЯРПНИЙХ РН ГЮБНДЯЙХЕ. (Х ОНРНЛ МЮЯЙНКЭЙН Ъ ГМЮЧ ЛШЬЭ Х ЙКЮБХЮРСПЮ МХЙЮЙ МЕМЮЯРПЮХБЮЧРЯЪ Б BIOS). нОЕПЮЖХНММСЧ ЯХЯРЕЛС ОЕПЕЯРЮБХК, ПЮГЗЕЛШ ЛШЬХ Х ЙКЮБХЮРСПШ PS/2
Отправил эксперт: яРЮЯ Эксперт отправил ответов (всего): 6
Экспертная группа: лНДЕКХ, БХДШ Х РХОШ ЙНЛОЭЧРЕПНБ (hard)
КАК МОЖНО ПОЛУЧИТЬ ВСЮ рассылку с начала. Чтобы не повторять вопросы не отнимать время и неказаться совсем глупым
С уважением к Твоей просветительной деятельности Олег
Олег Никуленков! http://www.kalashnikoff.ru/, ссылка Ассемблер, там архив — ВСЕ номера рассылки «Ассемблер, это просто», и 33 (помоему) FAQ из 60 полных, все FAQ можно получить токо осенью
Отправил эксперт: Broken Sword Эксперт отправил ответов (всего): 51
Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32
гДПЮБЯРБСИРЕ, СБЮФЮЕЛШЕ ЩЙЯОЕПРШ. мЕДЮБМН С МЮЯ КНЙЮКЭМСЧ ЯЕРЭ ОПНРЪМСКХ. яПЮГС ФЕ БНГМХЙКЮ ОПНАКЕЛЮ, Р.Й. Ъ ПЮАНРЮЧ ХГ ОНД ДБСУ НЯЕИ — WinXP RC2 Х Win98. рЮЙ БНР, ЯСРЭ ОПНАКЕЛШ Б РНЛ, ВРН ХГ ОНД БХМ98 БЯё МНПЛЮКЭМН ПЮЯЬЮПХБЮЕРЯЪ, БЯё ОНКЭГНБЮРЕКХ ОЮОЙХ БХДЪР, Б МЕЙНРНПШЕ ЛНЦСР ОХЯЮРЭ ЦДЕ ПЮГПЕЬЕМН, Ю ОНД WinXP ОНВЕЛС РПЕАСЕРЯЪ ОЮПНКЭ ОПХВЕЛ Й ОЮОЙЕ IPC$. лНФЕР ЩРН МЕДНДЕКЙХ ЙЮЙХЕ, БЕДЭ НТХЖХЮКЭМНЦН ПЕКХГЮ ЕЫЕ МЕ БШЬКН. ю ЛНФЕР БЯё-РЮЙХ ЛНФМН ЙЮЙ-МХАСДЭ МЮЯРПНХРЭ ? P.s. вРН-РН ОНУНФЕЕ МЮАКЧДЮЕРЯЪ Х Я Win2000 Professional SP1. я СБЮФЕМХЕЛ, дЛХРПХИ.
гДПЮБЯРБСИРЕ, дЛХРПХИ! б НОЕПЮЖХНМЙЮУ НЯМНБЮММШУ МЮ NT (NT 4.0, w2k, winXP) ОПХЛЕМЪЕРЯЪ ДПСЦЮЪ ЯХЯРЕЛЮ ОПНБЕПЙХ ОНКЭГНБЮРЕКЪ. р.Е. ВРНАШ ОНКСВХРЭ ДНЯРСО Й ПЮЯЬЮПЕМНЛС ПЕЯСПЯС МЕНАУНДХЛН ББНДХРЭ МЕ РНКЭЙН ОЮПНКЭ МН Х КНЦХМ. ЩРН ЛНФМН ОПХ ОНЛНЫХ ЯОЕЖХЮКЭМНИ ОПНЦПЮЛЙХ (e.g. Essential NetTools ЙНЛОЮМХХ «TamosSoft» www.tamos.com), КХАН МЮДН КНЦХМХРЭЯЪ Б win’9x Я ХЛЕМЕЛ Х ОЮПНКЕЛ ОНКЭГНБЮРЕКЪ ЙНРНПНЛС МЮ WinXP ПЮГПЕЬёМ ДНЯРСО Й ПЮЯЬЮПЕМНЛС ПЕЯСПЯС. ю КСВЬЕ ОНЯРЮБЭРЕ ЯЕПБЕП, ОСРЮМХЖШ АСДЕР ЛЕМЭЬЕ.
Отправил эксперт: яРЮЯ Эксперт отправил ответов (всего): 8
Экспертная группа: оНКЭГНБЮРЕКЭЯЙЮЪ ПЮАНРЮ Я Windows
Как взять с дискетв серийный номр? Как записать в файл текстовую информациь?
Уважаемый fagot! Вот пример проги, замени ‘Текст’ text_mes db ‘Текст’ на любой свой, и придумай имя файла filename db ‘c:\text.txt’,0
Отправил эксперт: Broken Sword Эксперт отправил ответов (всего): 52
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Здравствуйте! У меня усть вопросики 1) Где можно найти tasm32.exe, tlink32.exe & import32.lib 2) Сейчас я пользуюсь Масмом, но у меня есть проблемка с созданием экзешника вот, то что я делаю. файл Digger.asm:
.386 .model flat,stdcall option casemap:none .data ;Инициализированные данные .data? ;Неинициализированные данные .code start: ;Точка входа
push 0 call ExitProcess ;Выход из программы end start —————- А потом я запускаю. masm /Ic:\masm digger.asm link digger.obj,digger.exe —————- Выводиться сообщение об шибке. Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992 Copyright (C) Microsoft Corp 1984-1992. All rights reserved.
List File [nul.map]: Libraries [.lib]: Definitions File [nul.def]: LINK : warning L4021: no stack segment
There was 1 error detected ———————- Может я неправильно создал kernal32.lib. НО kernal32.lib от Visual C++ не подошёл. ии я сделал implib.exe kernal32.lib kernal32.dll (предварительно скопировав dll в ту директорию где запускал implib
Я думаю что это связано с ограничением длинны имен, которое присутствует в некоторых объектных файлах.
Или (что вернее) в данном случае у тебя просто отсутствует глобальная переменная _imp_ExitProcess@4
Или же masm все имена приводит к нижнему регистру.
Или же все вместе. не знаю точно.
Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html — Операционная система с нуля!) Эксперт отправил ответов (всего): 53
Экспертная группа: Работа с MASM/TASM
А существуют ли разные всякие ассемблерные библиотеки? Где их можно поискать? (может есть сайты специальные?) Мне например нужен оконный интерфейс для ассемблерной проги. Не как Turbo Vision конечно, поскромнее, но желательно готовый. PS прилиновать TV не предлогайте
Ну и обленился же ты! Самому состряпать слабо?! Можно даже, используя объекты, благо TASM их поддерживает. Могу если что с этим помочь.
Отправил эксперт: Василий Эксперт отправил ответов (всего): 23
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Здравствуйте,уважаемые эксперты. ) Ответьте, пожалуйста вот на такой вопрос:)как создать файл, что-нить записать в него, удалить файл с диска, памяти, переместить файл, скопировать?
Здравствуйте, Веселый Эдик!
Как много ты сразу хочешь знать.
Обрати свое внимание на следующие функции DOS:
int 21h fn 3ch Create file via handle fn 3dh Open file via handle fn 3eh Close file via handle fn 3fh Read from file via handle fn 40h Write to file via handle fn 41h Delete file
Функции копирования файлов в досе не существует. реализуется через чтение/запись.
Помимо функций, работающих черех handle есть еще функции работающие через FCB, ноони гораздо неудобнее!.
Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html — Операционная система с нуля!) Эксперт отправил ответов (всего): 54
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Подписаться на рассылки
Форма подачи вопроса
ВНИМАНИЕ. Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!
Нажимайте кнопку «Отправить» только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!
Ведущий рассылки,
По вопросам сотрудничества, рекламы и спонсорства обращайтесь:
MS-DOS Команда для создания *.txt файла с вложенным в него текстом
copy con имяфайла. txt
Вводишь всю необходимую информацию, когда заканчиваешь — жмешь F6 или Ctrl+Z. Такой способ поможет запиндюлить в файл не одну строку, а несколько.
Главное помнить: текст на русском языке вписанный подобным образом блокнотом отобразится в виде иероглифов, т. к. у DOS и Windows разные кодировки. Для вывода на экран такого файла в DOS необходимо набрать: type имяфайла. txt
Также, конкретную описанную задачу можно выполнить строкой:
Если нужно к файлу добавить что-то, то вместо > надо использовать >>:
Запись файла построчно с помощью отдельных функций. С++?
Хочу получить файл:
fileConfiguration.cfg Station name,1,2001 14,6A,8D 1,ток ф А. A,1.290489E-01,0,0,-32767,32767,3000.00000000,1.00000000,P 2,ток В. A,5.139708E-02,0,0,-32767,32767,3000.00000000,1.00000000,P
Помогите довести это до ума. 1. Как описать реализацию void writesecondline (std::ostream &file, InfAnalogChanel const &iac);
InfAnalogChanel a = (1,»ток ф А». «A»,1.290489E-01,0,0,-32767,32767,3000.00000000,1.00000000,»P»); InfAnalogChanel b = (2,»ток В». «A»,5.139708E-02,0,0,-32767,32767,3000.00000000,1.00000000,»P»);
Работа с файловой системой
Как и большинство языков программирования, PHP поддерживает работу с файлами, которые являются одним из способов хранения информации.
Чтение и запись файлов
Открытие и закрытие файлов
Для открытия файлов в PHP определена функция fopen() . Она имеет следующее определение: resource fopen(string $filename, string $mode) . Первый параметр $filename представляет путь к файлу, а второй — режим открытия. В зависимости от цели открытия и типа файла данный параметр может принимать следующие значения:
‘r’ : файл открывается только для чтения. Если файла не существует, возвращает false
‘r+’ : файл открывается только для чтения с возможностью записи. Если файла не существует, возвращает false
‘w’ : файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет — то он создается
‘w+’ : файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет — то он создается
‘a’ : файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается
‘a+’ : файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается
Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.
После окончания работы файл надо закрыть с помощью функции fclose() , которая принимает в качестве параметра дескриптор файла. Например, откроем и закроем файл:
Конструкция or die(«текст ошибки») позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen не смогла открыть файл.
Чтение файла
Для чтения файла можно использовать несколько функций. Для построчного чтения используется функция fgets() , которая получает дескриптор файла и возвращает одну считанную строку. Пройдем построчно по всему файлу:
При каждом вызове fgets() PHP будет помещать указатель в конец считанной строки. Чтобы проследить окончание файла, используется функция feof() , которая возвращает true при завершении файла. И пока не будет достигнут конец файла, мы можем применять функцию fgets().
Чтение файла полностью
Если нам надо прочитать файл полностью, то мы можем облегчить себе жизнь, применив функцию file_get_contents() :
При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.
Поблочное считывание
Также можно провести поблочное считывание, то есть считывать определенное количество байт из файла с помощью функции fread() :
Функция fread() принимает два параметра: дескриптор считываемого файла и количество считываемых байтов. При считывании блока указатель в файле становится в конец этого блока. И также с помощью функции feof() можно отследить завершение файла.
Запись файла
Для записи файла применяется функция fwrite() , которая записывает в файл строку:
Аналогично работает другая функция fputs() :
Работа с указателем файла
При открытии файла для чтения или записи в режиме ‘w’, указатель в файле помещается в начало. При считывании данных PHP перемещает указатель в файле в конец блока считанных данных. Однако мы также вручную можем управлять указателем в файле и устанавливать его в произвольное место. Для этого надо использовать функцию fseek, которая имеет следующее формальное определение:
Параметр $handle представляет дескриптор файла. Параметр $offset — смещение в байтах относительно начала файла, с которого начнется считывание/запись. Третий необязательный параметр задает способ установки смещения. Он может принимать три значения:
SEEK_SET : значение по умолчанию, устанавливает смещение в offset байт относительно начала файла
SEEK_CUR : устанавливает смещение в offset байт относительно начала текущей позиции в файле
SEEK_END : устанавливает смещение в offset байт от конца файла
В случае удачной установки указателя функция fseek() возвращает 0, а при неудачной установке возвращает -1.
Asmworld Программирование на ассемблере для начинающих и не только
Работа с файлами в DOS
Автор: xrnd | Рубрика: Исходники | 25-12-2010 | Распечатать запись
Эта статья лишь небольшой пример того, как можно работать с файлами, используя функции DOS. Я не буду описывать все возможные значения параметров и вдаваться в подробности. Это вы можете найти самостоятельно в справочнике.
Первая программа будет создавать файл и записывать в него данные. Вторая программа — открывать файл, читать данные и выводить их на консоль.
Создание нового файла
Прежде, чем что-то записывать, необходимо создать файл. Для этого используется функция DOS 3Ch.
Имя файла должно быть в формате 8.3 — 8 символов имени и 3 символа расширения. Естественно, можно использовать только английский буквы, цифры и некоторые другие символы. Строка с именем файла должна заканчиваться нулевым байтом. Если файл уже существует, то его содержимое будет удалено.
Об ошибке можно узнать, проверяя значение флага CF (1 — ошибка, 0 — нет ошибки). Аналогично для других функций работы с файлами. Если флаг CF равен 0, то в регистре AX будет находиться дескриптор (или описатель) файла. Дескриптор — это просто специальное число, по которому операционная система отличает один открытый файл от другого.
Запись данных в файл
Запись в файл выполняется функцией DOS 40h. Этой функции нужно передать в регистре BX тот самый дескриптор, который был получен при создании файла.
Если вам требуется записать много данных, можно вызывать эту функцию несколько раз.
Закрытие файла
После работы с файлом нужно его закрыть с помощью функции DOS 3Eh.
Если вы не закроете файл, то он будет закрыт системой при выходе из программы. Однако, хорошим стилем программирования является явное закрытие файла после завершения работы с ним.
Пример первый
Программа создаёт новый файл и записывает в него данные. Так как диск и директория не указаны, то файл создаётся в текущей папке. В данном примере в файл записываются 2 строки, получается текстовый файл. Можно работать с двоичными файлами, записывая любые байты, слова и т.д.
use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h jmp start ;Перепрыгнуть данные ;——————————————————————————- ; Данные file_name db ‘hello.txt’,0 buffer db ‘asmworld.ru’,13,10,’Hello!’ size db 19 s_error db ‘Error!’,13,10,’$’ s_pak db ‘Press any key. $’ handle rw 1 ;Дескриптор файла ;——————————————————————————- ; Код start: mov ah,3Ch ;Функция DOS 3Ch (создание файла) mov dx,file_name ;Имя файла xor cx,cx ;Нет атрибутов — обычный файл int 21h ;Обращение к функции DOS jnc @F ;Если нет ошибки, то продолжаем call error_msg ;Иначе вывод сообщения об ошибке jmp exit ;Выход из программы @@: mov [handle],ax ;Сохранение дескриптора файла mov bx,ax ;Дескриптор файла mov ah,40h ;Функция DOS 40h (запись в файл) mov dx,buffer ;Адрес буфера с данными movzx cx,[size] ;Размер данных int 21h ;Обращение к функции DOS jnc close_file ;Если нет ошибки, то закрыть файл call error_msg ;Вывод сообщения об ошибке close_file: mov ah,3Eh ;Функция DOS 3Eh (закрытие файла) mov bx,[handle] ;Дескриптор int 21h ;Обращение к функции DOS jnc exit ;Если нет ошибки, то выход из программы call error_msg ;Вывод сообщения об ошибке exit: mov ah,9 mov dx,s_pak int 21h ;Вывод строки ‘Press any key. ‘ mov ah,8 ;\ int 21h ;/ Ввод символа без эха mov ax,4C00h ;\ int 21h ;/ Завершение программы ;——————————————————————————- ; Процедура вывода сообщения об ошибке error_msg: mov ah,9 mov dx,s_error int 21h ;Вывод сообщения об ошибке ret
В результате работы программы создаётся файл, который можно открыть блокнотом:
Открытие существующего файла
Для открытия файла используется функция DOS 3Dh. В отличие от создания файла, эта функция завершится ошибкой, если файл не существует.
Чтение данных из файла
Чтение из файла выполняется функцией DOS 3Fh.
Размер буфера для данных должен быть больше или равен количеству считываемых байтов. Обратите внимание, что в AX функция возвращает количество реально прочитанных байтов. Это количество может быть меньше требуемого, например, если файл слишком короткий.
Пример второй
Программа читает данные из текстового файла и выводит на консоль. Для того, чтобы вывести данные, нужно добавить символ ‘$’ в конец строки.
use16 ;Генерировать 16-битный код org 100h ;Программа начинается с адреса 100h jmp start ;Перепрыгнуть данные ;——————————————————————————- ; Данные file_name db ‘hello.txt’,0 s_error db ‘Error!’,13,10,’$’ s_file db ‘—-[ file «Hello.txt» ]$’ endline db 13,10,’$’ s_pak db ‘Press any key. $’ buffer rb 81 ;80 + 1 байт для символа конца строки ‘$’ handle rw 1 ;Дескриптор файла ;——————————————————————————- ; Код start: mov ah,3Dh ;Функция DOS 3Dh (открытие файла) xor al,al ;Режим открытия — только чтение mov dx,file_name ;Имя файла xor cx,cx ;Нет атрибутов — обычный файл int 21h ;Обращение к функции DOS jnc @F ;Если нет ошибки, то продолжаем call error_msg ;Иначе вывод сообщения об ошибке jmp exit ;Выход из программы @@: mov [handle],ax ;Сохранение дескриптора файла mov bx,ax ;Дескриптор файла mov ah,3Fh ;Функция DOS 3Fh (чтение из файла) mov dx,buffer ;Адрес буфера для данных mov cx,80 ;Максимальное кол-во читаемых байтов int 21h ;Обращение к функции DOS jnc @F ;Если нет ошибки, то продолжаем call error_msg ;Вывод сообщения об ошибке jmp close_file ;Закрыть файл и выйти из программы @@: mov bx,buffer add bx,ax ;В AX количество прочитанных байтов mov byte[bx],’$’ ;Добавление символа ‘$’ mov ah,9 mov dx,s_file int 21h ;Вывод строки с именем файла mov cx,56 call line ;Вывод линии mov ah,9 mov dx,buffer int 21h ;Вывод содержимого файла mov dx,endline int 21h ;Вывод перехода на новую строку mov cx,80 call line ;Вывод линии close_file: mov ah,3Eh ;Функция DOS 3Eh (закрытие файла) mov bx,[handle] ;Дескриптор int 21h ;Обращение к функции DOS jnc exit ;Если нет ошибки, то выход из программы call error_msg ;Вывод сообщения об ошибке exit: mov ah,9 mov dx,s_pak int 21h ;Вывод строки ‘Press any key. ‘ mov ah,8 ;\ int 21h ;/ Ввод символа без эха mov ax,4C00h ;\ int 21h ;/ Завершение программы ;——————————————————————————- ; Процедура вывода сообщения об ошибке error_msg: mov ah,9 mov dx,s_error int 21h ;Вывод сообщения об ошибке ret ;——————————————————————————- ; Вывод линии ; CX — количество символов line: mov ah,2 ;Функция DOS 02h (вывод символа) mov dl,’-‘ ;Символ @@: int 21h ;Обращение к функции DOS loop @B ;Команда цикла ret
Результат работы программы:
Некоторые другие функции DOS для работы с файлами
Подробное описание смотрите в справочнике.
5Bh — создание нового файла без удаления существующего;
5Ah — создание файла с уникальным именем (например, временного файла);
41h — удаление файла;
42h — установка указателя чтения/записи;
56h — переименование файла;
43h — получение или изменение атрибутов файла;
57h — получение или изменение метки времени файла;
39h — создание папки;
3Ah — удаление папки;
3Bh — изменение текущей папки;
47h — получение текущей папки.
Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусология
Профессия программиста удивительна и уникальна. В наше время науку и жизнь невозможно представить без новейших технологии. Все что связано
Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусология
Другие курсовые по предмету
Вирусы первого типа размножается следующим образом. Для каждого инфицируемого ЕХЕ-файла в том же каталоге создается файл с вирусным кодом, имеющий такое же имя, что и ЕХЕ-файл, но с расширением СОМ. Вирус активируется, если при запуске программы в командной строке указано только имя исполняемого файла. Если СОМ-файл с таким именем не найден, ведется поиск одноименного ЕХЕ-файла. Если не найден и ЕХЕ-файл, DOS попробует обнаружить ВАТ (пакетный) файл. Другими словами, когда пользователь хочет за- пустить программу и набирает в командной строке только ее имя, первым управление получает вирус, код которого находится в СОМ-файле. Он создает СОМ-файл еще к одному или нескольким ЕХЕ-файлам (распространяется), а затем исполняет ЕХЕ-файл с указанным в командной строке именем. Пользователь же думает, что работает только запущенная ЕХЕ-программа. Вирус-спутник обезвредить довольно просто — достаточно удалить СОМ-файл.
Вирусы второго типа действуют более тонко. Имя инфицируемого ЕХЕ-файла остается прежним, а расширение заменяется каким-либо другим, отличным от исполняемого (СОМ, ЕХЕ и ВАТ), Например, файл может получить расширение DAT (файл данных) или OVL (программный оверлей). Затем на место ЕХЕ-файла копируется вирусный код. При запуске такой инфицированной программы управление полу- чает вирусный код, находящийся в ЕХЕ-файле. Инфицировав еще один или несколько ЕХЕ-файлов таким же образом, вирус возвращает оригинальному файлу исполняемое расширение (но не ЁХЕ, а СОМ, поскольку ЕХЕ-файл с таким именем занят вирусом), после чего исполняет его. Когда работа инфицированной программы закончена, ее запускаемому файлу возвращается расширение неисполняемого. Лечение файлов, зараженных вирусом этого типа, может быть затруднено, если вирус-спутник шифрует часть или все тело инфицируемого файла, а перед исполнением его расшифровывает.
Вирусы, внедряющиеся в программу (Parasitic)
Вирусы этого вида самые незаметные: их код записывается в инфицируемую программу, что существенно затрудняет лечение зараженных файлов. Рассмотрим методы внедрения ЕХЕ-вирусов в ЕХЕ-файл.
Способы заражения ЕХЕ-файлов
Самый распространенный способ заражения ЕХЕ-файлов такой: в конец файла дописывается тело вируса, а заголовок корректируется (с сохранением оригинального) так, чтобы при запуске инфицированного файла управление получал вирус. Похоже на заражение СОМ-файлов, но вместо задания в коде перехода в начало вируса корректируется собственно адрес точки запуска программы. После окончания работы вирус берет из сохраненного заголовка оригинальный адрес запуска программы, прибавляет к его сегментной компоненте значение регистра DS или ES (полученное при старте вируса) и передает управление на полученный адрес.
Второй способ таков — внедрение вируса в начало файла со сдвигом кода программы. Механизм заражения такой: тело инфицируемой программы считывается в память, на ее место записывается вирусный код, а после него — код инфицируемой программы. Таким образом, код программы как бы «сдвигается» в файле на длину кода вируса. Отсюда и название способа — «способ сдвига». При запуске инфицированного файла вирус заражает еще один или несколько файлов. После этого он считывает в память код программы, записывает его в специально созданный на диске временный файл с расширением исполняемого файла (СОМ или ЕХЕ), и затем исполняет этот файл. Когда программа закончила работу, временный файл удаляется. Если при создании вируса не применялось дополнительных приемов защиты, то вылечить инфицированный файл очень просто — достаточно удалить код вируса в начале файла, и программа снова будет работоспособной. Недостаток этого метода в том, что приходится считывать в память весь код инфицируемой про- граммы (а ведь бывают экземпляры размером больше 1Мбайт).
Следующий способ заражения файлов — метод переноса который является самым совершенным из всех ранее перечисленных. Вирус размножается следующим образом: при запуске инфицированной программы тело вируса из нее считывается в память. Затем ведется поиск неинфицированной программы. В память считывается ее начало, по длине равное телу вируса. На это место записывается тело вируса. Начало программы из памяти дописывается в конец файла. Отсюда название метода — «метод переноса». После того, как вирус инфицировал один или несколько файлов, он приступает к исполнению программы, из которой запустился. Для этого он считывает начало инфицированной программы, сохраненное в конце файла, и записывает его в начало файла, восстанавливая работоспособность программы. Затем вирус удаляет код начала программы из конца файла, восстанавливая оригинальную длину файла, и исполняет программу. После завершения программы вирус вновь записывает свой код в начало файла, а оригинальное начало программы — в конец. Этим методом могут быть инфицированы даже антивирусы, которые проверяют свой код на целостность, так как запускаемая вирусом программа имеет в точности такой же код, как и до инфицирования.
Рассмотрим алгоритм распространения Вируса.
1. Открыть файл, из которого вирус получил управление.
2. Считать в буфер код вируса.
4. Искать по маске подходящий для заражения файл.
5. Если файлов больше не найдено, перейти к пункту 11.
6. Открыть найденный файл.
7. Проверить, не заражен ли найденный файл этим вирусом.
8. Если файл заражен, перейти к пункту 10.
9. Записать в начало файла код вируса.
10. Закрыть файл (по желанию можно заразить от одного до всех фай- лов в каталоге или на диске).
11. Выдать на экран какое-либо сообщение об ошибке, например «Abnormal program termination» или «Not enough memory», — как бы, пусть пользователь не слишком удивляется тому, что программа не запустилась.
12. Завершить программу.
В большинстве случаев для написания вируса широко используются функции DOS-а. Их достаточно много всех не будем рассматривать, приведу пример только одного из них.
DOS, функция 21h Считать произвольную запись файла
AH-21h DS:DX — адрес открытого FCB (Таблица Б-2)
AL=OOh, если чтение было успешным и DTA заполнена данными AL°01h, если достигнут конец файла (EOF) и чтения не было AL=02h, если произошел выход за сегмент (чтения нет) AL°03h, если встречен EOF и усеченная запись дополнена нулями
Данная функция читает из файла с текущей позиции как с указанной в полях FCB «Запись с текущей позиции» и «Номер записи при непосредственном доступе к файлу».
DOS, функция OOh Завершить программу
DOS, функция 01h Считать со стандартного устройства ввода
DOS, функция 02h Записать в стандартное устройство вывода
DOS, функция 03h
Считать символа со стандартного вспомогательногоустройства
DOS, функция 04h Записать символ в стандартное вспомогательное устройство
DOS, функция 05h Вывести на принтер
DOS, функция 06h Консольный ввод-вывод
DOS, функция 09h Запись строки на стандартный вывод
DOS, функция OAh Ввод строки в буфер
DOS, функция ODh Сброс диска
DOS, функция OEh Установить текущий диск DOS
DOS, функция 13h Удалить файл через FCB
DOS, функция 15h Последовательная запись в файл через FCB
DOS, функция 17h Переименовать файл через FCB
DOS, функция 22h Писать произвольную запись файла
DOS, функция 26h Создать новый PSP
DOS, функция 27h Читать произвольный блок файла
DOS, функция 28h Писать произвольный блок файла
DOS, функция 31h Завершиться и остаться резидентным
DOS, функция 3Ah Удалить оглавление
DOS, функция 41h Удалить файл
DOS, функция 43h Установить/опросить атрибуты файла
DOS, функция 44h Управление устройством ввода/вывода
DOS, функция 4Bh Выполнить или загрузить программу
DOS, функция 4Ch Завершить программу
DOS, функция 57h Установить/опросить дату/время файла
DOS, функция 5Ah Создать уникальный временный файл
DOS, функция 68h Завершить файл.
Список наиболее часто используемых функций DOS.(ассемблер при