Выравнивание длины строки в файле с расширением строки (ассемблер 8086, 1999 г.)

Страницы работы

17 страниц (Word-файл)

Содержание работы

Введение

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

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

Постановка задачи

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

Выбор и обоснование метода решения задачи

            Задача будет решаться с применением языка Ассемблера. Как достаточно распространенная и удобная в обращении, для работы будет применена операционная система MS-DOS (версий 3 и старше). Дополнительным аргументом за ее использование будет то, что у этой ОС мощный и удобный механизм работы с файлами. Исходя из такой возможности, использование для работы с файлами низкоуровневых процедур работы с диском, доступных через базовую систему ввода-вывода (BIOS), таких как абсолютное чтение и  абсолютная запись секторов, будет нерациональным.

            Конечная программа будет иметь формат EXE, так как для работы необходимы значительные блоки данных и, возможно, стек, и размеров одного сегмента может не хватить, т.е. формат COM не подходит.

Разработка структуры задачи

            Задачу можно разбить на следующие этапы: получение имен файлов и проверка их корректности; поиск строки максимальной длины в исходном файле; формирование файла-приемника с одновременным изменением строк из источника; закрытие файлов и выход.

Поскольку работа с данными, исходя из задания, будет происходить с использованием файлов, то надо получить сначала имена этих файлов. Необходимо отметить, что в рамках ОС MS-DOS возможны 2 метода получения программой исходных данных (т.е. имен файлов в данном случае): непосредственный ввод с клавиатуры и получение параметров в командной строке. Значит, надо предусмотреть обе эти возможности.

            Вывод файла будет осуществляться средствами ОС.

            Строки в текстовых файлах MS-DOS разделяются парой символов возврат каретки – перевод строки. Это можно использовать при поиске конца строки.

            Вообще большинство сервисных функций MS-DOS  сосредоточены в программном прерывании под номером 21h. Среди них достаточно функций работы как с клавиатурой и дисплеем, так и с файлами. Причем отдельные функции представляют и клавиатуру, и дисплей как стандартные файлы.

            Для вывода приглашений удобно использовать функцию 9h. Ее преимущество – возможность вывода на экран информации строками, а не посимвольно. Недостаток – в качестве признака окончания строки используется символ ‘$’, хотя общепринятым являются нуль-терминированные строки (признак конца строки – символ с кодом 0). Поскольку программа учебная, это несущественно.

            Аналогично для ввода информации будет использована функция 0Ch. У нее есть 2 достоинства – построчный ввод и использование клавиш редактирования строки при вводе, что дает возможность исправить ошибочно набранные символы до их отсылки в программу, а также очистка буфера клавиатуры перед вводом символов, что дает безопасность от случайного неверного ввода.

            На этом этапе необходимо осуществлять проверку вводимых данных. Это можно сделать, попытавшись открыть эти файлы для дальнейшего использования. Если открытие не прошло успешно, пользователя необходимо предупредить об этом и выйти из программы, т.к. ее работа без файлов данных невозможна.

            Файл-источник можно открывать только для чтения, поскольку в нем не планируется ничего изменять. Этой цели служит функция 3Dh. Режим открытия (запись, чтение, чтение/запись), режим совместного доступа (запрещен, разрешен, разрешен только дочерним процессам) выставляются путем изменения битов в регистре AL. Но для работы функции необходимо, чтобы имя открываемого файла представляло собой нуль-терминированную строку. Здесь придется обрабатывать введенные из командной строки или с клавиатуры имена файлов так, чтобы они удовлетворяли этому условию. Индикатором неудачной попытки является выставление в 1 флага переноса (CF).

            Файл-приемник необходимо создавать заново. Для этого существует функция 3Ch. Все сказанное выше о режимах открытия, имени файла и  признаке ошибки относится и к ней.

            Дальнейший доступ к открытым файлам осуществляется по логическим номерам, присваиваемым файлам операционной системой. Это – большое усовершенствование по отношению к ранним версиям ОС, где для работы с файлами использовался механизм FCB (блоков управления файлом).

            Для доступа к параметрам командной строки необходимо использовать префикс программного сегмента (PSP). Это структура, где содержатся сведения, необходимые для корректной работы программы в ОС (размер памяти, вектора ошибки, завершения работы, прерывания работы, указатель строк связи с окружающей средой и т.п.). В том числе по смещению 80h содержится длина строки параметров (в байтах), а начиная со смещения 81h в области длиной 127 байт содержится собственно строка параметров. При запуске программы на сегмент, где расположен PSP, указывают регистры ES и DS. Смещение PSP всегда ноль. Поскольку обычно затем регистр DS устанавливается так, чтобы указывать на сегмент данных, для обращения к PSP надо использовать регистр ES.

            Для перемещения в пределах файла существует функция 42h. Она дает возможность перемещаться на заданное число байт относительно текущей позиции в файле, относительно его конца или начала, т.е. обладает большой гибкостью.

            Для считывания заданного количества байт с текущей позиции в файле есть функция 3Fh.

            По окончании работы программы необходимо закрыть открытые файлы, чтобы не потерять данные. Этой цели служит функция 3Eh.

Особенности представления данных стандартными функциями ОС

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

Похожие материалы

Информация о работе