Dos fn 0fh открыть файл через fcb


Содержание

Электронная библиотека

Для выполнения операции ввода и вывода файлов в базовый DOS необходимо в сегменте данных определить блок управления файлов (FCB). Блок FCB содержит описание файла и его записей в следующем ниже формате. Программист должен инициализировать байты 0-15 и 32-36. Остальные байты установит DOS.

Дисковод, 01 для A, 02 для B и т.д., 0-текущий дисковод

Имя файла, дополненное справа пробелами

Номер текущего блока. Блок содержит 128 записей. Номер текущей записи находится в байте 32. Первый блок имеет номер 0. После открытия файла равен 0

Логический размер записи. При открытии файла устанавливается в 0. Можно установить любое другое число

Размер файла. Это поле изменить нельзя

Дата создания или изменения

Текущий номер записи в текущем блоке (см. байты 12-13)

Относительный номер записи

Для создания нового файла на диске используются следующие функции прерывания 21h:

16h — создание файла

1Ah — установка адреса области передачи данных DTA

15h — запись из области DTA в файл

10h — закрытие файла

В сегменте данных надо определить блок FCB и буфер DTA для данных, которые будут записываться на диск:

fcb db 1 ;дисковод A

blkptr dw 0 ;номер текущего блока

recsize dw ? ;размер записи

dw 8 dup(?) ;байты 16-31

recptr db 0 ;номер текущей записи

dw 2 dup(?) ;байты 33-36

buffer db 512 dup(?)

Для создания файла filename.ext выполнить команды

Размер записи устанавливается при открытии по умолчанию 128 байт.

Буфер, из которого будут записываться данные на диск, устанавливается командами

С помощью функции 15h осуществляется запись содержимого буфера DTA на диск:

Размер файла в блоке FCB и текущие номера записи и блока изменяет DOS. В конце работы следует закрыть файл:

Рассмотрим теперь операцию чтения файла по FCB. Для чтения файла необходимо вызвать следующие функции прерывания 21h:

0Fh — открытие файла

1Ah — формирование адреса буфера

14h — чтение данных из файла в буфер

Открытие файла осуществляется командами

Установка буфера DTA рассматривалась выше. После установки буфера DTA осуществляется чтение:

Так как при чтении файла записи в каталоге не изменяются, то нет необходимости закрывать файл после завершения чтения.

Напишем программу, читающую собственный текст и выводящую его на экран:

Создаем вирус и антивирус (34 стр.)

При DL=0FFh выполняет ввод с консоли «Без ожидания», возвращая включенный флаг нуля ZF, если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF и возвращает считанный символ в AL. Если DL не равен 0FFh, то DL направляется на стандартный вывод.

DOS, функция 07h Нефильтрующий консольный ввод без эха

Выход: AL – символ, полученный через стандартный ввод

Описание. Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не проверяет на Ctrl-Break, BackSpace и другие.

Для ввода расширенного символа ASCII должна быть вызвана дважды. Для проверки статуса используется функция DOS 0Bh (чтобы не ожидать нажатия клавиши).

DOS, функция 08h Консольный ввод без эха

Выход: AL – символ, полученный через стандартный ввод

Описание. Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23h.

Для ввода расширенного символа ASCII должна быть вызвана дважды.

DOS, функция 09h Запись строки на стандартный вывод

DS:DX – адрес строки, заканчивающейся символом «$» (ASCII 24h)

Строка, исключая завершающий ее символ «$», посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02h (вывод на дисплей). Чтобы перейти на новую строку, обычно включают в текст пару CR/LF (ASCII 0Dh и ASCII 0Ah). Строки, содержащие «$», можно передать на стандартное устройство вывода с помощью функции 40h (BX=0).

DOS, функция 0Ah Ввод строки в буфер

DS:DX – адрес входного буфера (Таблица Б-1)

Таблица Б-1. Формат входного буфера

Буфер содержит введенные данные, в конце – символ CR (ASCII 0Dh)

DOS, функция 0Bh Проверка статуса ввода

Выход: AL=FFh, если символ доступен со стандартного ввода AL=00h, если нет доступного символа

Описание. Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23h.

Используется перед функциями 01h, 07h и 08h, чтобы избежать ожидания нажатия клавиши.

Эта функция дает простой неразрушающий способ проверки Ctrl-Break в процессе длинных вычислений или другой обработки, обычно не требующей ввода. Это позволяет снимать счет по нажатию Ctrl-Break.

DOS, функция 0Ch Ввод с очисткой

AL – номер функции ввода DOS:

AL=01h – ввод с клавиатуры


AL=06h – ввод с консоли

AL=07h – нефильтрующий без эха

AL=08h – ввод без эха

AL=0Ah – буферизованный ввод

Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа.

DOS, функция 0Dh Сброс диска

Сбрасывает диск (записывает на диск все файловые буферы). Файл, размер которого изменился, должен быть предварительно закрыт (при помощи функций 10h или 3Eh).

DOS, функция 0Eh Установить текущий диск DOS

DL – номер диска (0 – A, 1 – B и так далее), который становится текущим

Выход: AL – общее число дисководов в системе

Описание. Диск, указанный в DL, становится текущим. Проверка: используется функция 19h (дать текущий диск). В регистре AL возвращается число дисководов всех типов, включая жесткие диски и «логические» диски (как диск B: системе с одним гибким диском).

AL имеет то же значение, что и LASTDRIVE, указанное в файле CONFIG.SYS, и по умолчанию равно 5.

DOS, функция 0Fh Открыть файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

Таблица Б-2. Формат FCB

AL=00h, если функция выполнена успешно (FCB заполнен)

AL=FFh, если файл не найден или доступ к файлу не разрешен

Файл, описываемый неоткрытым FCB, должен существовать в текущем оглавлении на диске, специфицированном в FCB (0 – текущий, 1 – A, 2 – B и так далее). Если файл не существует, возвращается AL=0FFh. Файл открывается в режиме совместимости. Если поле «Номер диска» в FCB равно нулю в момент вызова, то оно заполняется номером текущего дисковода (1 – A, 2 – B и так далее). Поле FCB «Номер текущего блока» устанавливается в ноль. Поле FCB «Размер логической записи» устанавливается в 80h. Поля даты и размера файла в FCB устанавливаются из оглавления.

DOS, функция 10h Закрыть файл через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если файл не найден там, где он находился при открытии с помощью функции 0Fh

Закрывает файл, открытый функцией 0Fh. Файл должен находиться на своем первоначальном месте в текущем оглавлении диска, на котором он был открыт. Если файл найден, оглавление обновляется, файловые буфера сбрасываются и возвращается AL=00h. Если файл не найден, оглавление не обновляется и возвращается AL=FFh.

DOS, функция 11h Найти первый совпадающий файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если подходящее имя найдено

AL=FFh, если подходящего имени нет

В текущем оглавлении DOS происходит поиск файлов с именем, соответствующим заданному шаблону. При неудаче возвращается AL=0FFh. Если имя найдено, AL очищается, в первый байт DTA помещается номер дисковода (A – 1, B – 2 и так далее), а в следующие 32 байта помещается элемент оглавления для найденного файла.

Можно использовать при вызове расширенный FCB, чтобы выбирать файлы с указанными атрибутами. В этом случае в DTA помещаются: байт FFh, 7 байт нулей, номер диска и элемент оглавления.

DOS, функция 12h Найти следующий совпадающий файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если подходящее имя найдено

DTA заполнен AL=FFh, если подходящего имени нет

Используется после вызова функции 11h (Найти первый совпадающий файл через FCB) с обобщенным именем файла. Каждый последующий вызов заполняет DTA очередным подходящим элементом оглавления и возвращает AL=00h. Если подходящих имен больше нет, возвращается AL=FFh.

Резервируемая область в FCB сохраняет информацию, необходимую для продолжения поиска. Поэтому не стоит открывать и изменять FCB между вызовами.

DOS, функция 13h Удалить файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если файл не найден или доступ к файлу не разрешен

Эта функция удаляет все подходящие файлы в текущем оглавлении указанного диска согласно спецификации в FCB. Если подходящие файлы не найдены или если доступ отвергнут (как при попытке удалить файл с атрибутом Read-Only), функция возвращает в регистре AL значение FFh.

DOS, функция 14h Последовательное чтение из файла через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если чтение было успешным и DTA содержит данные

AL=01h, если достигнут конец файла (EOF) и данные не считаны

AL=02h, если произошел выход за сегмент (чтения не было)

AL=03h, если EOF и считана усеченная запись (дополнена нулями)

Функция читает файл, специфицированный в FCB. Затем соответственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать CurRec в ноль, так как функция 0Fh не инициализирует это поле.

DOS, функция 15h Последовательная запись в файл через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если запись была успешной

AL=01h, если ошибка переполнения диска (данные не записаны)

AL=02h, если произошел выход за сегмент (записи не было)

Функция записывает файл, специфицированный в FCB. Затем соответственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать «Номер текщей записи» в ноль, так как функция 0Fh не инициализирует это поле.

DOS буферизует данные, записывая полный сектор за один раз.

DOS, функция 16h Создание файла через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

Fn 00H: завершить программу

Вход


  • AH = 00H
  • CS = сегмент PSP завершающегося процесса

Выход

Описание:

передает управление на вектор завершения в PSP (выходит в родительский процесс). Идентична функции INT 20H Terminate. регистр CS должен указывать на PSP. восстанавливает векторы прерываний DOS 22H-24H (завершение, Ctrl-Break и Критическая ошибка), устанавливая значения, сохраненные в родительском PSP. выполняет сброс файловых буферов. файлы должны быть предварительно закрыты, если их длина изменилась.

Замечание:

Проще и более аккуратно — использовать функцию DOS Fn 4cH Exit.

Fn 01H: ввод с клавиатуры

Вход

Выход

  • AL = символ, полученный из стандартного ввода

Описание:

Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). при распознавании Ctrl-Break выполняется INT 23H.

Замечание:

ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и т.п.) требует двух обращений к этой функции. первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.

Fn 09H: Выдать строку на дисплей

Вход

  • AH = 09H
  • DS:DX = адрес строки, заканчивающейся символом ‘$’ (ASCII 24H)

Выход

Описание:

строка, исключая завершающий ее символ ‘$’, посылается на стандартный вывод. символы Backspace обрабатываются как в функции 02H Display Char. обычно, чтобы перейти на новую строку, включают в текст пару CR/LF (ASCII 13H и ASCII 0aH). строки, содержащие ‘$’, можно выдать через 40H Write Handle (BX=0).

Fn 06H: Консольный ввод-вывод

Вход

  • AH = 06H
  • DL = символ (от 0 до 0feH), посылаемый на стандартный вывод
  • = 0ffH запрос ввода со стандартного ввода

Выход

  • ZF = Сброшен (NZ), если символ готов ҐҐЈҐ при запросе ввода

Описание:

при DL = 0ffH выполняет ввод с консоли «без ожидания», возвращая взведенный флаг нуля (ZF), если на консоли нет готового символа. если символ готов, сбрасывает флаг ZF (NZ) и возвращает считанный символ в AL. если DL не равен 0ffH, то DL направляется на стандартный вывод.

Замечание:

Не проверяет Ctrl-Break. вызывайте дважды для расширенного ASCII.

Fn 0aH: ввод строки в буфер

Вход

  • AH = 0aH
  • DS:DX = адрес входного буфера (смотри ниже)

Выход

  • нет = буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)

Описание:

при входе буфер по адресу DS:DX должен быть оформлен так:

¦max¦ ? ¦ ? ? ? ? ? MAX — максимально допустимая

при выходе буфер заполнен данными следующим образом:

¦max¦len¦ T E X T 0dH LEN — действительная длина данных

символы считываются со стандартного ввода вплоть до CR (ASCII 0dH) или до достижения длины MAX-1. если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter).

Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. последний символ в буфере — всегда CR (который не засчитан в байте длины). символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редакти рования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т.д. большинство расширенных кодов ASCII игнорируются. при распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается неизменным).

Fn 25H: установить вектор прерывания

Вход

  • AH = 25H
  • AL = номер прерывания
  • DS:DX = вектор прерывания: адрес программы обработки прерывания

Выход

Описание:

устанавливает значение элемента таблицы векторов прерываний для прерывания с номером AL равным DS:DX. это равносильно записи 4-байтового адреса в 0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и гарантирует, что в момент записи прерывания будут заблокированы.

Предупреждение:

Не забудьте восстановить DS (если необходимо) после этого вызова.

Fn 35H: дать вектор прерывания

Вход

  • AH = 35H
  • AL = номер прерывания (00H до 0ffH)


Выход

  • ES:BX = адрес обработчика прерывания

Описание:

возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX 0000:[AL*4], а в ES — 0000:[(AL*4)+2].

Предупреждение:

Эта функция изменяет сегментный регистр ES.

Fn 27H: читать произвольный блок файла

Вход

  • AH = 27H
  • DS:DX = адрес открытого FCB
  • CX = число считываемых записей

Выход

  • AL = 0 если чтение успешно и DTA заполнена данными
  • AL = 1 если достигнут конец файла (EOF) и данные не считаны
  • AL = 2 если DTA + FCB (RecSize * CX) выходит за границу сегмента
  • AL = 3 если EOF и считана усеченная порция (дополнена нулями)
  • CX = действительное число считанных записей
Илон Маск рекомендует:  Фильтр Shadow

Описание:

Читает несколько записей из файла, начиная с файлового адреса, специфицированного полем RandomRec в FCB. Помещает данные в память, начиная с адреса DTA. число считанных байт = FCB RecSize*CX. Поля RandomRec, CurBlk и CurRec корректируются, чтобы указывать на следующую запись (первую запись за прочитанными).

Fn 31H: завершиться и остаться резидентным — KEEP

Вход

  • AH = 31H
  • AL = код выхода
  • DX = объем памяти, оставляемой резидентной, в параграфах

Выход

Описание:

выходит в родительский процесс, сохраняя код выхода в AL. код выхода можно получить через функцию 4dH Wait. DOS устанавливает начальное распределение памяти, как специфицировано в DX, и возвращает управление родительскому процессу, оставляя указанную память резидентной (число байт = DX * 16). Эта функция перекрывает функцию INT 27H, которая не возвращает код выхода и неспособна установить резидентную программу, большую 64K.

Функция 0ah: Ввод строки с клавиатуры в буфер

DS:DX = адрес входного буфера (смотри ниже)

Выход Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh)

Описание: При обращении буфер по адресу DS:DX должен содержать значение максимально допустимой длины ввода. На выходе функции в следующем байте содержится действительная длина ввода, затем введенный текст, завершающийся символом возврата каретки (0dh). Символы считываются с устройства стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter). Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере — всегда CR (не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т. д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание int 23h (буфер остается неизменным).

Завершение программы

Функция 4ch: Завершить программу (EXIT)

Вход AH = 4ch

AL = код возврата

Описание: Возвращает управление от порожденного процесса его родителю, устанавливая код возврата, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершаемой программы. В векторах Ctrl-Break и Critical Error восстанавливаются старые значения, сохраненные в родительском PSP.

Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода возврата самой последней программы.

Функция 4dh: Дать код возврата программы (WAIT)

Вход AH = 4dh

Выход AL = код возврата последнего завершившегося процесса

AH = 0 — нормальное завершение

АН = 1 — завершение через Ctrl-Break int 23h

АН = 2 — завершение по критической ошибке устройства int 24h

АН = 3 — завершение через функцию 31h KEEP

Описание: Возвращает код возврата последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.

Функция 4dh: Дать код возврата программы (WAIT)

Вход AH = 4dh

Выход AL = код возврата последнего завершившегося процесса

AH = 0 — нормальное завершение

АН = 1 — завершение через Ctrl-Break int 23h

АН = 2 — завершение по критической ошибке устройства int 24h

АН = 3 — завершение через функцию 31h KEEP

Описание: Возвращает код возврата последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.

Работа с файлами

Функция 3ch: Создать файл через дескриптор

Вход AH = 3ch

DS:DX = адрес строки ASCIIZ с именем файла

CX = атрибут файла

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибки нет

Описание: DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. файл создается в указанном (или текущем) каталоге файл открывается в режиме доступа чтение/запись вы должны сохранить дескриптор (handle) для последующих операций, если файл уже существует:

· при открытии файл усекается до нулевой длины

· если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43h Изменить Атрибут)


CONFIG.SYS определяет число доступных дескрипторов в системе

Используйте функцию 5bh Создать Новый Файл, если вы не хотите

испортить существующий файл.

Функция 5bh: Создать новый файл

Вход AH = 5bh DOS 3.0+

DS:DX = адрес строки ASCIIZ с именем файла

CX = атрибут файла

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибок нет

Описание: DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имя_файла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом Режиме Доступа.

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого.

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ — конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой.

Whatis.Ru

Информация о компьютерах доступным языком
Назад на сайт

Страниц: 1 2

#26 18-01-2011 19:35:39

Re: . Введение в Ассемблер

Программа DEBUG

Программируем под DOS на ассемблере, используя виндовый DEBUG.

Программа DEBUG — мощный отладчик, входящий в состав Windows. Для запуска — жмём [Win+R] и вводим DEBUG. Перед нами мигающий курсор. Введём знак вопроса ? и получим список команд:

— A (assemble) — Создание двоичного кода процессоров 8086 непосредственно в памяти.
— С (compare) — Сравнение двух блоков памяти.
— D (dump) — Просмотр содержимого заданного диапазона адресов памяти.
— E (enter) — Ввод данных в память по заданному адресу.
— F (fill) — Заполнение адресов в области памяти заданными значениями.
— G (go) — Выполнение загруженной программы.
— H (hexadecimal) — Выполнение шестнадцатеричных арифметических операций.
— I (input) — Считывание и вывод на экран одного байта из указанного порта ввода.
— L (load) — Загрузка файла или содержимого сектора диска в память.
— M (move) — Копирование содержимого одного блока памяти в другой.
— N (name) — Задание имени исполняемого файла, L (load) или W (write).
— O (output) — Вывод байта в порт вывода.
— P (proceed) — Выполнение цикла, инструкции, прерывания или процедур.
— Q (quit) — Выход из Debug, без сохранения тестируемого файла.
— R (register) — Редактирование содержимого регистров ЦПУ.
— S (search) — Поиск в области памяти по шаблону.
— T (trace) — Выполнение одной инструкции с выводом содержимого регистров.
— U (unassemble) — Дезассемблирование и просмотр исходного кода программы.
— W (write) — Запись файла на диск.

Подробное описание команд с примерами можно найти в справке винды ([Win+F1]debug).

Теперь, запустим DEBUG и просмотрим, что у нас в регистрах. Вводим команду «R». Как видим, значение всех регистров процессора равняется нулю:

AX, BX, CX, DX = 0000

Мы можем вносить требуемые значения в регистры.

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#27 18-01-2011 19:39:28

Re: . Введение в Ассемблер

Пишем прогу на ассемблере.

Как уже говорилось, ассемблер — это самый низкий уровень программирования, который понимает проц. Теперь проведём эксперемент, чтоб убедиться в этом:

1) Создадим *.сом в программе DEBUG
2) Дизассемблируем его, при помощи того-же DEBUG
3) Полученные 16-тиричные значения и есть инструкции, которые выполняет процессор

Итак, начнём с создания *.сом, который выведет символ на экран. Запустим DEBUG и введём команду «А». Дальше, «топчем клаву» как на рисунке:

Чтоб вывести символ на экран, в регистр AH помещается 02H, а в DL — код выводимого символа, плюс 30H. Далее вызываем прерывание-DOS INT 21H (вывод на экран), и закрываем программу дёрнув прерывание INT 20H (exit). Всё, что находится после INT 20H игнорируется процессором.

В листинге дизассемблирования указывается сегмент памяти, в который была загружена наша программа (13F2) и смещение внутри сегмента 100H, обязательное для СОМ-файлов. Необходимо помнить, что прикладные программы загружаются в первую-свободную область памяти, поэтому у Вас значение 13F2 может быть другим, в зависимости от свободной памяти.

Следующим столбцом в дизассемблерном листинге идут 16-тиричные значения (выделены серым), которые представляют собой непосредственные инструкции процессору. Ниже — уже ничего нет, ..только ядро. Вообще-то есть ещё интерператор 16-тиричных чисел в двоичные, но он невсчёт. В конечном виде наша программа TEST_PROGA.COM обрабатывается процессором в таком вот виде:

Но вернёмся в реальность. Чтоже дают нам эти опыты. . а то, что программы написанные на ассемблере имеют наименьший размер, по сравнению с другими языками программирования. В качестве примера возьмём программу (окно с одной кнопкой в центре) написанную на языках высокого уровня. После компиляции получим такие размеры файла:

C++ Builder 4 — 22kb
Delphi 5 — 291kb
Delphi 5 + библиотека KOL — 26kb
Ассемблер MASM — около 3kb

Так, что смотрите и делайте выводы, что лучше использовать. Программу таких размеров можно легко внедрить в свободное пространство любого исполняемого файла. э-э-э чтот меня не туда занесло

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#28 19-01-2011 01:37:15

Re: . Введение в Ассемблер

..а вон чё WinHex показывает:

Да такой код можно хоть-куда пихнуть, ..к примеру в заголовок EXE-файла. Там столько свободного пространства, что можно слона разместить. 200-300h байт всегда найдётся. ..а нам больше и не надо, вешеприведённая TEST_PROGA.COM весит всего 17 байт (17 символов в исходнике). 300h — это уже 768 символов, ..целый материк, свобода мысли.

Достаточно перехватить управление в коде, перевести его на себя и замутить чё-нить. Объясню «в двух словах»: как это делается! ..Пишется прога на асме (желаемого характера), которая привычным движением руки вставляется в WinHex — в начало, середину, или «конец» EXE-файла жертвы. Желательно, конечно, в начало. после «PE»-заговка. Самый оптимальный вариант — после перечисления DLL-лок (инклудов). Там как-раз достаточно места, и быстрее примем управление. Фрагмент внедрения в CHKDSK.EXE нашей «Бацилы»:

Если Вы запустите такой инфицированный CHKDSK.EXE, то сначала отработает наш код, а только потом запустится сам chkdsk. . но не всё так просто. Там есть своя «Техника внедрения». Дизассемблируется chkdsk.exe, и в листинге ищется команда JMP (переход на метку). Перехватываем этот JMP и после исполнения основного кода «бацилы» передаём управление обратно на эту метку, командой RET ассемблера в коде нашей программы.

В качестве бонуса, вешаю в скрепке пару примеров программ на ассемблере.

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#29 19-01-2011 12:49:58

Re: . Введение в Ассемблер

Что нужно знать о прерываниях

Как уже отмечалось, прерывания бывают двух типов — DOS и BIOS. Но что они из себя представляют. Попробуем ответить на этот вопрос.

Прерывания — это вовсе не прерывания, а готовые программы (процедуры), которые компьютер вызывает для выполнения определенной задачи. Внутри этих «программ-прерываний» имеются вложенные подпрограммы, каждая из которых выполняет определённую задачу. Эти подпрограммы вызываются векторами прерываний!

Программа-прерывание вызывается по номеру (к примеру INT 13H, дисковый ввод/вывод BIOS), где в качестве «параметра» заносится её вектор, т.е. подпрограмма. Например, для вывода информации на экран, нам нужно воспользоваться сервисом-DOS и запросить прерывание с номером INT 21H. Подпрограмму 02H необходимо указать в регистре AH:

При включении компьютера, BIOS выстраивает таблицу векторов прерывания в первых 1024 байтах памяти. Этот килобайт памяти начинается с адреса 0000:0000 и заканчивается 0000:0400 (1024d = 0400h). Откроем в WinHex память, и взглянем на эту таблицу:

Каждый вектор имеет длину 4 байта. Вектор для прерывания 0 начинается с ячейки 0000:0000, прерывания 1 — с 0000:0004, 2 — с 0000:0008, 3 — с 0000:000C и т.д.

Если посмотреть на четыре байта, начиная с адреса 0000:0020, в которых содержится вектор прерывания 8H (прерывание времени суток), то Вы обнаружите там A5FE00F0. Имея ввиду, что младший байт слова расположен сначала, это 4-байтное значение переводится в F000:FEA5. Это стартовый адрес программы ПЗУ, выполняющей прерывание 8H.

Если размер таблицы 1024 байт, а один вектор имеет длинну 4 байта, то выходит чтобы найти общее кол-во векторов нужно 1024/4. . получаем 256. Таким образом, в общем пространстве имеется место для 256 векторов (подпрограмм), которые «разбиваются» по всем номерам прерываний BIOS и DOS. В каждом прерывании может находиться до 20 подпрограмм.

Прерывания с номерами до INT 20H обслуживает BIOS. Номера прерываний DOS лежат в пределах от 20 до 32H:

Прерывания BIOS (без подфункций) Прерывания DOS (без подфункций)


00h: Деление на ноль. 20h: Завершить программу
01h: Пошаговое. 21h: Сервис DOS
02h: Немаскируемое. 25/26h: Абсолютные чтение/запись диска
03h: Точка прерыв. 27h: Завершиться, но остаться резидентным
04h: Переполнение. 28h: Квант времени DOS (НЕТ В ДОКУМЕНТАЦИИ)
05h: Печать экрана. 2eh: Выполнить команду DOS (НЕТ В ДОКУМЕНТАЦИИ)
06h: (резерв) 2fh: Мультиплексное прерывание (спулинг печати)
07h: (резерв) 22h: Адрес завершения
08h: Таймер. 23h: Адрес Control-Break
09h: Клавиатура. 24h: Адрес обработчика критических ошибок
0Ah-0dh: (hdwr ints)
0Eh: Дискета.
0Fh: (hdwr int)
10h: Видео сервис.
11h: Список оборудования.
12h: Размер исп.памяти.
13h: Дисковый в/в.
14h: В/в последовательный порт
15h: Расшир.сервис AT.
16h: В/в клавиатуры.
17h: В/в принтера.
18h: ROM-BASIC.
19h: Загрузка.
1Ah: В/в таймера.
1Bh: Прерывание клавиатуры.
1Ch: Прерывание по таймеру
1Dh: Видео параметры
1Eh: Параметры дискет
1Fh: Символы графики

Приведу краткое описание прерывания-BIOS INT 13H:

INT 13H: дисковый ввод-вывод
Этот сервис предоставляет прямой доступ к адаптерам дискеты и жёсткого диска. Рекомендуется там, где это возможно, использовать INT 25H и INT 26H, чтобы предоставить драйверам устройств-DOS выполнять всю низкоуровневую обработку. Разумеется, для таких операций, как форматирование диска или установка защиты от копирования, прерывание INT 13H может оказаться единственной альтернативой.

подфункции: 00H сброс контроллера 08H дать парам диска 10H проверить готовность
01H дать статус 09H иниц табл парам 11H рекалибрация
02H читать секторы 0aH длинное чтение 14H диагностика
03H писать секторы 0bH длинная запись 15H дать тип диска
04H верификация 0cH искать цилиндр 16H изменить статус
05H форматир дорожку 0dH альтерн сброс 17H уст тип диска

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#30 20-01-2011 13:39:20

Re: . Введение в Ассемблер

Использование сервисов DOS. Прерывание INT 21H.

После загрузки MS-DOS в память, операционная система предоставляет нам свои услуги, в виде прерывания INT 21H (сервисы DOS). Используя это прерывание в своих программах мы можем выполнять около 80-ти операций. Не буду перечислять все функции этого прерывания, остановлюсь только на наиболее значимых:

00H: завершить программу 27H: читать блок произвольного файла
01H: ввод с клавиатуры 28H: писать блок произвольного файла
02H: вывод на дисплей 2aH: дать дату DOS
05H: вывод на принтер 2cH: дать время DOS
09H: Выдать строку 2fH: дать текущий DTA
0dH: Сбросить диск 30H: дать номер версии DOS
0eH: Выбрать умалчиваемый диск DOS 31H: завершиться и остаться резидентным — KEEP
0fH: открыть файл через FCB 32H: дать дисковую информацию DOS
10H: Закрыть файл через FCB 35H: дать вектор прерывания
13H: Удалить файл через FCB 36H: дать свободную память диска
14H: читать файл через FCB 39H: создать новое оглавление — MKDIR
15H: писать файл через FCB 40H: Писать в файл через описатель
16H: создать файл через FCB 48H: дать размер памяти
17H: Переименовать файл через FCB 56H: Переименовать/переместить файл
25H: установить вектор прерывания 5bH: создать новый файл

Илон Маск рекомендует:  $X - Директива компилятора Delphi

Функция 09H прерывания INT 21H (вывод строки символов на экран).

Процедуры, которые выводят целые строки символов на экран — очень полезны, но они могут накладывать ограничения на содержимое выводимой строки. Надо обращать внимание на то, какие управляющие коды (табуляция, пробел и т.п.) интерпретируются, а какие нет.

Как уже говорилось, при вызове прерывания необходимо указать значение функции в регистре AH (в нашем случае — 09H). Далее, вводятся инструкции и вызывается само прерывание. Регистр DX должен указывать на первый символ строки (т.е. расположение текстовой строки). В конце строки обязательно должен присутствовать символ «$». Это означает, что сам символ «$» не может входить в строку. Сама строка может быть любой длины.

Чтоб перевести текст на следующую строку, в конце указываются спец-символы 0AH (перевод строки), и 0DH (возврат каретки). Без них — текст будет располагаться в одну строчку.

. пришло время скачать инструментарий, чтоб проводить эксперементы. Программы, целиком написанные на ассемблере, транслируются в машинный код при помощи ассемблера. Под DOS-ом большой популярностью пользуется пакет TASM, для винды — MASM от Microsoft. С ним конкурирует FASM, поддерживающий более естественный синтаксис. Его и качаем с сайта WASM.RU. Он отличается от предшественников тем, что это и транслятор и компилятор в одном флаконе. Вводиш в окне инструкции, жмёш F9 и на выходе получаеш готовый исполняемый файл! Очень удобно. особенно для начинающих!

. значит скачали FASM 1.67, и в поле набиваем текстовые строки нашей программы. Вот пример:

Программа, приветствующая WHATIS из досовского окна.

use16 ; DOS работает в 16-тиразрядном режиме
org 100h ; Делаем СОМ-файл с начальным смещением 100h

mov AH,09h ; Суём в регистр AH функцию 09h прерывания 21h
mov dx,text ; В регистре DX указываем от куда брать строку
int 21h ; Вызываем прерывание 21h
ret ; Возвращаемся туда, от куда были вызваны

; Текстовая строка (адрес для регистра DX)
text db ‘Hello, WHATIS. $’

. если нужно вывести несколько строк, то можно сделать так:

. на выходе — СОМ-файл размером 63 байт. Таким способом можно выводить текстовые строки из памяти, которые содержат информацию об оборудовании, объёме свободной памяти и т.д. и т.п.

Программа составляется из нескольких-подобных участков кода, которые выполняют определённые задачи. На каждый участок кода ставится индивидуальная метка, к которой можно обратиться с любого места программного кода. Эти участки объединяются в модули, а несколько модулей образуют законченный софт, . в чём мы убедимся позже.

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#31 21-01-2011 12:22:44

Re: . Введение в Ассемблер

Определение Стека

Стек — это такое место хранения данных, которые при надобности можно обратно восстановить. В нём хранятся адреса переходов, различные данные и т.д. Регистр SP указывает на адрес вершины стека. Регистр ВР содержит адрес, начиная с которого в стек вносится или забирается информация.

Представьте, что одна подпрограмма вызывает другую. Вызываемая подпрограмма завершила свое выполнение, теперь ей надо передать управление подпрограмме, которая её вызвала. Как-раз адрес следующей команды (после вызова подпрограммы) находится на верхушке стека, в регистре SP.

Стек — как штанга с блинами: засунули адрес, засунули второй, засунули третий, и достают адреса в порядке обратном засовыванию, ..сначала третий, второй, первый. Следовательно, подпрограмма, может вызвать ещё одну подпрограмму, а она в свою очередь ещё одну и так, сколько хошь, всё ограничивается только размером стека.

Таким образом, программа продолжит выполнение инструкций только после того, как отработают ПОДпрограммы, принявшие управление:

В стек можно заносить не только адреса, но и данные, текстовые строки и т.п. Команда ассемблера PUSH помещает данные в стек, а команда POP снимает их от туда. При использовании стека наша программа «Hello, Whatis. » примет следующий вид:

Здесь, мы закинули в стек вторую строчку текста, вывели на экран первую, а потом извлекли из стека вторую. Дело в том, что регистр не может хранить сразу два разных значения, поэтому перед тем как внести в него, нужно сохранить имеющееся, дабы не потерять всё.

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

#32 24-01-2011 12:34:02

Re: . Введение в Ассемблер

Память 16-тиразрядных систем (DOS).

Самое главное преимущество ассемблера состоит во взаимодействии с памятью. Программировать на ассемблере не зная, как устроена память — бессмысленно.

В DOS — память сегментная. Вся память делится на сегменты по 64К, и адрес задаётся форматом «сегмент:офсет». Сегмент — задаёт порядковый номер сегмента, а офсет — смещение в этом сегменте. Это объяснение для 16-тиразрядных программ (32-хразрядные обсудим позже).

На рис. общая память, разделённая на сегменты по 64kb. Здесь — максимум 65536 сегментов:

;; 16 двоичных разрядов — это 1111 1111 1111 1111, или 65535d (FFFFh).
;; 65535 * 64Кб = 4 194 240Кб (или 4096Мб, или 4Гб памяти).

С помощью 16 бит можно адресовать только 65536 байт памяти и 65536 сегментов. Например, 0000:4012 это означает: сегмент 0, смещение 4012. Чтобы узнать, что находится в том адресе, вы сначала переходите на сегмент 0, а затем в сегменте смещаетесь на 4012.

Память 32-хразрядных систем (WIN-32).

В 32-хразрядном Windows (95 и выше) Вы всё еще имеете сегменты, но вам не нужно заботиться о них, потому, что они уже не 64kb (как в 16-разрядном), а 4 Гб. Это называеся плоской моделью памяти (flat). Здесь есть только смещения и они теперь 32-разрядные (в диапазоне от 0 до 4 294 967 295). Каждая ячейка в памяти указывается смещением.

Но 4ГБ может и не быть на машине, поэтому эта память называется виртуальной. Мало того, каждый процесс выполняется в своём виртуальном адресном пространстве, . а это значит, что никакой другой процесс не сможет получить доступ к вашей памяти. Для этого существуют специальные API функции.

Память 0-0000FFFF не используется и служит для выявления нулевых указателей, значит, если вы укажете адрес 0000С567, то он будет считаться нулевым. Любая попытка обратится к этой памяти приводит к ошибке. Память выше 80000000 одна для всех процессов. В этой памяти находится код нулевого кольца, структуры ядра, код планировщика задач, код драйверов, диспетчер ввода вывода, таблица прерываний и т.д. Любая попытка обратиться к памяти ядра приводит к ошибке и к немедленному завершению приложения.

Память в диапазоне 00001000-7FFFFFFF доступна для 3 кольца (т.е. для вашего приложения). С ней Вы, что хотите то и делаете, в неё также грузятся DLL-ки.

Если Вам даётся 2ГБ памяти, то это не означает, что вы можете обратиться к любому участку памяти. Для того чтобы получить доступ к некоторому участку памяти надо сначала её зарезервировать. Минимальный размер выделяемой памяти — страница, равна 1000h байтам (1000h байт = 4096d байт, или 4КБ). Даже если вы захотите выделить 5 байт, то всё равно выделится 4КБ. Думаю, вы не столкнётесь с тем, что вам надо будет выделять память. Это нужно при работе с файлами для того, что бы в эту память читать файл.

Болтовня ничего не стоит. Покажите мне код.. (Linus Torvalds)

Функция 0ah: Ввод строки с клавиатуры в буфер

DS:DX = адрес входного буфера (смотри ниже)

Выход Буфер содержит ввод, заканчивающийся символом CR (ASCII 0dh)

Описание: При обращении буфер по адресу DS:DX должен содержать значение максимально допустимой длины ввода. На выходе функции в следующем байте содержится действительная длина ввода, затем введенный текст, завершающийся символом возврата каретки (0dh). Символы считываются с устройства стандартного ввода вплоть до CR (ASCII 0dh) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter). Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере — всегда CR (не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т. д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание int 23h (буфер остается неизменным).

Завершение программы

Функция 4ch: Завершить программу (EXIT)

Вход AH = 4ch

AL = код возврата

Описание: Возвращает управление от порожденного процесса его родителю, устанавливая код возврата, который можно опросить функцией 4dh WAIT. Управление передается по адресу завершения в PSP завершаемой программы. В векторах Ctrl-Break и Critical Error восстанавливаются старые значения, сохраненные в родительском PSP.

Замечание: Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода возврата самой последней программы.

Функция 4dh: Дать код возврата программы (WAIT)


Вход AH = 4dh

Выход AL = код возврата последнего завершившегося процесса

AH = 0 — нормальное завершение

АН = 1 — завершение через Ctrl-Break int 23h

АН = 2 — завершение по критической ошибке устройства int 24h

АН = 3 — завершение через функцию 31h KEEP

Описание: Возвращает код возврата последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.

Функция 4dh: Дать код возврата программы (WAIT)

Вход AH = 4dh

Выход AL = код возврата последнего завершившегося процесса

AH = 0 — нормальное завершение

АН = 1 — завершение через Ctrl-Break int 23h

АН = 2 — завершение по критической ошибке устройства int 24h

АН = 3 — завершение через функцию 31h KEEP

Описание: Возвращает код возврата последнего из завершившихся процессов. Эта функция возвращает правильную информацию только однажды для каждого завершившегося процесса.

Работа с файлами

Функция 3ch: Создать файл через дескриптор

Вход AH = 3ch

DS:DX = адрес строки ASCIIZ с именем файла

CX = атрибут файла

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибки нет

Описание: DS:DX указывает на строку ASCIIZ в формате: «d:\путь\имяфайла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. файл создается в указанном (или текущем) каталоге файл открывается в режиме доступа чтение/запись вы должны сохранить дескриптор (handle) для последующих операций, если файл уже существует:

· при открытии файл усекается до нулевой длины

· если атрибут файла — только чтение, открытие отвергается (атрибут можно изменить функцией 43h Изменить Атрибут)

CONFIG.SYS определяет число доступных дескрипторов в системе

Используйте функцию 5bh Создать Новый Файл, если вы не хотите

испортить существующий файл.

Функция 5bh: Создать новый файл

Вход AH = 5bh DOS 3.0+

DS:DX = адрес строки ASCIIZ с именем файла

CX = атрибут файла

Выход AX = код ошибки, если CF установлен

АХ = дескриптор файла, если ошибок нет

Описание: DS:DX указывает на строку ASCIIZ в форме: «d:\путь\имя_файла»,0. Если диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен функции DOS 3ch CREATE, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует. Файл открывается для чтения/записи в совместимом Режиме Доступа.

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).

Папиллярные узоры пальцев рук — маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни.

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ — конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой.

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим.

DOS Fn 4cH: завершить программу — EXIT

Выход

Вход

DOS Fn 4bH: выполнить или загрузить программу — EXEC

Выход

Вход

DOS Fn 4aH: Сжать или расширить блок памяти

Выход

Вход

  • AH = 49H
  • ES = сегментный адрес (параграф) освобождаемого блока памяти
  • AX = код ошибки если CF установлен

Описание:

Освобождает блок памяти, начинающийся с адреса ES:0000. этот блок становится доступным для других запросов системы. Вообще говоря, вы должны освобождать лишь те блоки памяти, которые вы получили через функцию 48H распределить память. Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует вам освобождать память чужих проыессов.

  • AH = 4aH
  • ES = сегмент распределенного блока памяти
  • BX = желаемый размер блока в 16-байтовых параграфах
  • AX = код ошибки если CF установлен
  • BX = наибольший доступный блок (если расширение неудачно)


Описание:

Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4bH EXEC уже распределила блок памяти, начиная с PSP, который содержит всю доступную память. чтобы освободить память для запуска порождаемых процессов, блок памяти, начинающийся с PSP, необходимо сначала сжать.

Замечание:

функция 31H (KEEP) и INT 27H (TSR) сжимают блок по адресу PSP.

  • AH = 4bH
  • DS:DX = адрес строки ASCIIZ с именем файла, содержащего программу
  • ES:BX = адрес EPB (EXEC Parameter Block — блока параметров EXEC)
  • AL = 0 = загрузить и выполнить
  • AL = 3 = загрузить программный оверлей
  • AX = код ошибки если CF установлен

Описание:

предоставляет средства одной программе (родителю) вызвать другую программу (ребенка), которая по завершению возвратит управление родителю.

DS:DX указывает на строку ASCIIZ в форме: «d:путьимяфайла»,0. если диск или путь опущены, они подразумеваются по умолчанию.

ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL.

AL=0 EXEC: так как родительская программа первоначально получает всю доступную память в свое распоряжение, вы должны освободить часть памяти через функцию 4aH до вызова EXEC (AL=0). обычная последовательность:

1. Вызовите функцию 4aH с ES=сегменту PSP и BX=минимальному объему памяти, требуемой вашей программе (в параграфах).

2. Подготовьте строку ASCIIZ с именем вызываемого программного файла и установите DS:DX на первый символ этой строки.

3. Подготовьте блок параметров EXEC со всеми необходимыми полями.

4. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных, адресуемых через регистр CS (CS — это единственная точка для ссылок после того, как EXEC вернет управление от ребенка).

5. Выдайте вызов EXEC с AL=0.

6. Восстановите локальные значения SS и SP.

7. Проверьте флаг CF, чтобы узнать, не было ли ошибки при EXEC.

8. Восстановите DS, ES и локальную DTA, если необходимо.

9. Проверьте код выхода через функцию 4dH WAIT (если надо).

Все открытые файлы дублируются, так что ребенок может обрабатывать данные как через описатели файлов, так и через стандартный в/в. режимы доступа описателей дублируются, но любые активные блокировки файлов не будут относиться к ребенку. См. функцию 5cH. после возврата из ребенка, векторы INT 22H Terminate, INT 23H Ctrl-Break и INT 24H Critical Error восстанавливаются в их предыдущие значения.

AL=3 LOAD: Эта подфункция используется для загрузки «оверлея».

Илон Маск рекомендует:  Как в Word вызвать линейку

DS:DX указывает на ASCIIZ имя файла, а ES:BX указывает на «LOAD»-версию блока параметров EXEC. Главное значение этой подфункции в том, что она считывает заголовок EXE и выполняет необходимые перемещения сегментов, как это требуется для программ .EXE.

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 — получение текущей папки.

Старый DOS


Сайт старых программ

  • Список форумовПрограммное обеспечениеОперационные системы
  • Изменить размер шрифта
  • Для печати
  • FAQ
  • Регистрация
  • Вход

Config.sys. Команда FCBS.

Config.sys. Команда FCBS.

Bazaroff » 02 сен 2015, 01:42

Что это за блоки такие? Разъясните пожалуйста с примерами.(

Re: Config.sys. Команда FCBS.

Freeman » 02 сен 2015, 04:06

Re: Config.sys. Команда FCBS.

Nika » 02 сен 2015, 05:58

Re: Config.sys. Команда FCBS.

Gawobeka » 02 сен 2015, 12:10

Re: Config.sys. Команда FCBS.

Bazaroff » 02 сен 2015, 13:41

Да, в учебнике почерпнул, что широко использовалось в ранних версиях ДОС.
Любопытство гложет что это за такое. «Служебные структуры» — как-то не вовсе понятно. Можно на примерах?

Re: Config.sys. Команда FCBS.

Nika » 02 сен 2015, 15:33

Можно и на примерах.

Код: Выделить вс� =================================================================
INT 21 — DOS 1+ — OPEN FILE USING FCB
AH = 0Fh
DS:DX -> unopened File Control Block (see below)
Return: AL = status
00h successful
FFh file not found or access denied
Notes: (DOS 3.1+) file opened for read/write in compatibility mode
an unopened FCB has the drive, filename, and extension fields filled
in and all other bytes cleared
not supported by MS Windows 3.0 DOSX.EXE DOS extender
SeeAlso: AH=16h,AH=3Dh

Format of File Control Block:
Offset Size Description
-7 BYTE extended FCB if FFh
-6 5 BYTEs reserved
-1 BYTE file attribute if extended FCB
00h BYTE drive number (0 = default, 1 = A, etc)
01h 8 BYTEs blank-padded file name
09h 3 BYTEs blank-padded file extension
0Ch WORD current block number

=================================================================
INT 21 — DOS 1+ — SEQUENTIAL READ FROM FCB FILE
AH = 14h
DS:DX -> opened FCB (see AH=0Fh)
Return: AL = status
00h successful
01h end of file (no data)
02h segment wrap in DTA
03h end of file, partial record read
[DTA] = record read from file
Notes: reads a record of the size specified in the FCB beginning at the
current file position, then updates the current block and current
record fields in the FCB
if a partial record was read, it is zero-padded to the full size
not supported by MS Windows 3.0 DOSX.EXE DOS extender
SeeAlso: AH=15h,AH=1Ah,AH=3Fh,INT 2F/AX=1108h
=================================================================

В новых версиях DOS рекомендуется вместо этих int21/0F и int21/14 использовать int21/3D и int21/3F

Re: Config.sys. Команда FCBS.

Bazaroff » 02 сен 2015, 18:25

Re: Config.sys. Команда FCBS.

Gawobeka » 02 сен 2015, 20:07

Если очень упрощенно: когда операционная система открывает файл, то в определенном месте оперативной памяти она выделяет участок, в который записывает различную служебную информацию об открытом файле (дисковод, на котором расположен файл, его имя и размер, в каком месте файла расположена в данный момент точка считывания/записи информации и т.д.). С помощью этой информации ОС работает с файлом, т.е. позволяет прикладным программам как-то использовать этот файл. В разных версиях ДОС структура и размер этих участков различны.

В ранних версиях ДОС они назывались FCB (File Control Block). FCBS=8 — значит, что одновременно можно создать 8 блоков описания файла, т.е. одновременно открыть 8 файлов, которые будут доступны для программ, написанных для ранних версий MS-DOS. В FCB не предусмотрено место для указания папки, в которой находится файл, поэтому старые программы, хотя и могут запускаться в Win, могут работать с файлами только из текущей папки.

Языки программирования типа Бейсика работают с файлом через ДОС, т.е. знать им о FCB не обязательно. Обращаться к файлу напрямую — через FCB, не используя ДОС, могут низкоуровневые языки программирования — Ассемблер, С.

Re: Config.sys. Команда FCBS.

Nika » 02 сен 2015, 20:19

Re: Config.sys. Команда FCBS.

Bazaroff » 02 сен 2015, 22:01

Архивация файлов в MS DOS или в командной строке (cmd).

В среде MS DOS наибольшее распространение получил архиватор ARJ, RAR. Формат записи команды обращения к этому архиватору из командной строки имеет вид

В ней используются следующие параметры.

— символ, с помощью которого задается вид выполняемого действия. Наиболее часто применяемые команды:

a — добавление файлов в архив (архивация). Если архивный файл отсутствует, то он создается архиватором заново;

e — извлечение файлов из архива (разархивация);

x — извлечение файлов из архива в соответствующие каталоги (разархивация);

l — просмотр оглавления архива;

d — удаление файла из архива;

— необязательный символ (совокупность символов), с помощью которых уточняются, заданные командой действия. Режимы указываются с предшествующим символом «» или «/«. Наиболее часто используемые режимы:

d — удаление исходных файлов при архивировании, а при разархивировании — удаление файлов из архива;

r — включение в архив файлов из подкаталогов;

— необязательная последовательность из имен каталогов, разделенных символом «\», устанавливающая местонахождение архивного файла. Если в команде архиватора не указывается, то по умолчанию считается, что архивный файл находится в текущем каталоге.

— имя архивного файла. Если расширение имени архивного файла не указывается, то архиватор в процессе его создания присвоит ему тип .arj.

— необязательная последовательность из имен каталогов, разделенных символом «\«, задающая для архиватора базовый каталог. При архивации файлы из базового каталога включаются в архив, а при разархивации из архива извлекаются в базовый каталог. Если базовый каталог в команде архиватора не указывается, то по умолчанию базовым считается текущий каталог.

— имена файлов, включаемых в архив или извлекаемых из архива. При их указании можно использовать шаблоны. Если имена файлов в команде архиватора не указываются, то по умолчанию подразумеваются все файлы из базового каталога (при архивации) или все файлы из архива (при разархивации).

Примеры записи некоторых команд программы ARJ.

1.Создание архива из файлов только базового каталога

2.Создание архива из файлов входящих, как в базовый каталог, так и в его подкаталоги

3.Извлечение файлов из архива в базовый каталог

4.Извлечение файлов из архива с выводом их в соответствующие подкаталоги

5.Удаление файлов из архива

Кроме рассмотренных команд и режимов работы архиватора имеется множество других. Для вывода на экран их полного списка нужно в командную строку MS DOS ввести команду

Удобные средства для работы с архивами предоставляет операционная оболочка FAR. Правда она поддерживает не все возможности архиваторов, а только наиболее часто используемые: просмотр оглавления; удаление и извлечение файлов из архива; помещение файлов в архив.

Для просмотра оглавления архива нужно на панели FAR выделить имя архивного файла и нажать Enter. В результате оглавление архива будет выведено на панель в виде содержимого каталога, работать с которым можно как обычно:

· для извлечения файлов из архива в его оглавлении помечаются требуемые файлы и копируются в нужное место;

· для помещения новых файлов в уже существующий архив, нужно сначала на одной панели вывести его оглавление. Затем перейти на другую панель, выделить в ней имена требуемых файлов и скопировать их в оглавление архива на другой панели.

Для создания нового архива нужно выделить имена помещаемых в архив файлов и каталогов и нажать клавиши Alt+F5. В появившемся окне диалога указать полное имя (с маршрутом) архивного файла и отметить опции: включать подкаталоги, удалять архивируемые файлы, использовать фильтр. В этом же окне с помощью кнопки Метод сжатия можно выбрать используемый архиватор.

Для распаковки имеющегося архива нужно его выделить и нажать клавиши Alt+F6.

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Для студентов недели бывают четные, нечетные и зачетные. 9438 — | 7438 — или читать все.

188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL