Брябрин. Программное обеспечение персональных ЭВМ. 1990
Страница 2 из 2
Страница 2 из 2 • 1, 2
Re: Брябрин. Программное обеспечение персональных ЭВМ. 1990
...
ДЕБЮТ - СИСТЕМА ОБРАБОТКИ ШАХМАТНОЙ ИНФОРМАЦИИ. На протяжении всей истории шахматных соревнований важнейшим условием успешного выступления шахматиста является тщательная подготовка к турнирам. Эта подготовка включает подробный анализ партий, сыгранных в разное время будущими соперниками. Анализируются также дебютные продолжения, избиравшиеся данным шахматистом или его противниками. Это приобрело особое значение в наши дни, с развитием теории дебютов, поскольку от информационной подготовки игрока часто непосредственно зависит результат каждой сыгранной партии и всего турнира.
В настоящее время ежегодно в официальных соревнованиях играются десятки тысяч партий, из них около 30 тысяч представляют теоретический интерес. Большая часть партий публикуется в журналах, и работа шахматистов по отбору и изучению необходимой информации превращается в весьма тяжелый труд. Многие из них пользуются при подготовке специальными картотеками, работа с которыми весьма трудоемка. Многие гроссмейстеры создают свои собственные дебютные картотеки, а гроссмейстерам экстра-класса в этом помогают ассистенты.
Появление персональных компьютеров дает возможность организовать на их основе хранение и обслуживание шахматных банков информации. При этом важнейшим обстоятельством является общедоступность ПЭВМ, их малые физические размеры, отсутствие необходимости в обслуживающем персонале. Благодаря этим качествам ПЭВМ может сопровождать шахматистов на любом турнире. Кроме использования в качестве непосредственного инструмента информационной подготовки шахматистов, ПЭВМ на шахматных турнирах, как и на любых спортивных соревнованиях, может служить для визуализации результатов и их трансляции по телевидению, для комментирования и разбора партий и др. Технические средства современных персональных компьютеров, такие как цветная графика, твердый диск большой емкости, устройство ввода типа "мышь" и др. позволяют создавать программы, значительно облегчающие разыгрывание партий и их анализ.
Система обработки шахматной информации Дебют, разработанная в Вычислительном центре АН СССР, ориентирована на пользователей шахматистов различной квалификации. Система состоит из блока ввода и анализа партий, подсистемы поиска партий в базе данных, подсистемы обучения, программы автоматической классификации партий по дебютам и подсистемы обработки результатов турниров. Система состоит из 7 функциональных модулей, взаимодействующих через общие области памяти.
Модуль MAIN - это программа инициализации, которая считывает из базы данных закодированные изображения фигур и заполняет ими соответствующие массивы. Затем эта программа обеспечивает выбор одного из следующих модулей. Модуль PLAYER осуществляет ввод текстов партий, программно-логический контроль ходов и автоматическое разыгрывание партий. Этот модуль поддерживает анализ позиций, во время которого шахматист может передвигать фигуры на изображении доски с использованием манипулятора "мышь".
Модуль INDEX автоматически классифицирует партию по дебютам. При этом применяется закодированный классификатор, который приписывает данной партии определенный индекс в зависимости от порядка ходов соперников. Модуль READER кодирует тексты партий и заполняет каталоги базы данных при вводе информации. Каждый ход вводится либо путем его набора на клавиатуре, либо в результате перемещения фигур на экране при помощи манипулятора "мышь". Другой модуль осуществляет поиск в базе данных, декодирование и вывод текстов партий в файлы или на печать. Модуль FILER обеспечивает просмотр каталогов и коррекцию информации. Модуль TEACHER позволяет получать справочную информацию по дебютам.
Файлы данных в системе подразделяются на 4 группы:
1) Файлы тина CHS составляют информационный архив: закодированные тексты партий, позиций, каталоги индексов, фамилий шахматистов и т.д. Это изменяемая часть системы.
2) Файлы типа DEB содержат закодированные изображения фигур, дебютный классификатор партий и другую служебную информацию.
3) Файлы типа TXT содержат турнириые таблицы или выведенные для дальнейшей обработки и печати тексты партий.
4) Файлы типа FW содержат данные подсистемы Рейтинг.
Все партии перед выводом на печать или при занесении в базу данных классифицируются по специальным шахматным индексаторам. Цель этой классификации состоит в более точной идентификации дебютного варианта. Именно индекс является во многих случаях главным признаком при поиске партий. Автоматическая индексация партий, реализованная в системе, основана на дебютном классификаторе Рабара. В основе алгоритма индексации лежит возможность представления классификатора древовидной структурой: ребрам дерева приписаны полуходы, вершинам соответствуют индексы.
Поиск индексов демонстрируется построением дерева рассматриваемых вариантов. Пользователь может управлять работой алгоритма индексации, изменяя ряд параметров в эвристических критериях и допустимую глубину перестановки ходов. Таким образом, для одной и той же партии можно получать различные мнржества индексов - кандидатов (дерево рассматриваемых вариантов меняет свою глубину и ширину) и различные конечные индексы партии. Это удобное средство позволяет шахматисту - индексатору исследовать различные варианты алгоритма.
Дерево классификатора представлено в базе данных однонаправленным списком с записями переменной длины. Каждый элемент списка содержит полуходы и соответствующие им индексы, а также ссылки на следующие вершины дерева. Количество ссылок определяется ветвлением в данном узле.
База данных системы содержит тексты партий и их параметры; индекс, фамилии игроков, соревнование, год, результат, а также позиции и дебютный классификатор. В целях экономии памяти тексты партий при записи в базу кодируются, что позволяет занимать лишь один байт для хранения полухода. Для обеспечения быстрого поиска система содержит 4 инвертированных файла прямого доступа - список дебютных индексов партий, фамилии шахматистов, список соревнований и список стран.
Для облегчения, и ускорения ввода текста партий разработаны следующие средства:
- каждый ход проходит синтаксический и семантический контроль, при этом проверяется правильность записи хода и его соответствие шахматным правилам; неправильные ходы не вводятся в систему;
- текст партии вводится прямо с листа, при этом производится автоматическая нумерация ходов;
- ввод очередного хода демонстрируется изменением позиции на экране.
При выводе партий пользователь формирует запрос, в котором может указать произвольную, но осмысленную комбинацию ключей. Система поддерживает около 50 различных видов запросов. Самым простым и наиболее быстрым способом вызыва партии или позиции является загрузка по номеру в каталоге. Специальный режим предусмотрен для поиска дебютных аналогов указанной партии. При этом достаточно вывести на одну из двух диаграмм на экране дисплея навальные ходы партии, и система будет последовательно разыгрывать на второй диаграмме все партии из базы данных с указанным дебютом. Отобранные по запросу партии могут быть выведены на печать или рассмотрены с помощью средств анализа.
Функция просмотра каталогов системы предназначена для ознакомления пользователя с тем, какая информация уже введена в систему. Программист имеет возможность контролировать правильность занесения информации в базу данных, просматривать ссылки и тексты партий во внутреннем представлении системы.
При обычном анализе партий и позиций возникают неудобства связанные с необходимостью работы с двумя объектами: позицией на доске и текстом партии в журнале. При автоматическом разыгрывании партии шахматист не отвлекается на "чтение" партии и перестановку фигур: розыгрыш осуществляет программа. Во время разыгрывания можно ускорить, замедлить, приостановить игру, вернуть назад несколько последних ходов. Предусмотрена возможность комментирования партий с помощью введения различных альтернативных вариантов для любого хода. Если партия была записана в архив с комментариями, то при разыгрывании они автоматически выводятся на вторую доску.
Устройство типа "мышь" позволяет имитировать взятие и перемещение фигуры. При вводе позиции нужно, двигая устройство по столу, подвести курсор к выбранной фигуре, "взять" ее с помощью нажатия правой кнопки манипулятора, переместить курсор на нужное поле и "поставить" фигуру с помощью левой кнопки. Клавиатура и устройство "мышь" работают в режиме параллельного ввода. При вводе ходов с помощью манипулятора "мышь" генерируется их текстовое представление и имеется возможность дальнейшей работы с текстом партии.
При анализе позиции каждый рассмотренный вариант записывается в текстовом виде, и затем можно автоматически повторить все рассмотренные ранее варианты.
Система поддерживает одновременную работу с двумя партиями или позициями. Это полезно для ввода и анализа комментариев, сравнительного анализа партий или позиций. Предусмотрен поиск партий, в которых встречалась расставленная позиция. На одной из диаграмм с помощью манипулятора "мышь" устанавливается произвольная позиция, на другую выводятся и разыгрываются партии, в которых она встречалась. Если позиция относится к дебютной стадии, то с помощью системы классификации поиск будет проведен быстро. В других же случаях для ускорения поиска можно задать один или несколько предполагаемых признаков партии: соревнование, фамилию шахматиста и др. Таким образом, при достаточном банке партий для любой указанной позиции можно узнать, встречалась ли она когда-либо ранее и какие ходы были при этом сделаны.
Пользуясь манипуляторами "мышь", два соперника могут сыграть блиц-партию. При этом ведется автоматическая запись текста партии, что позволяет сделать по окончании игры ее анализ, автоматически переключаются часы соперников. При этом нельзя сделать неправильный ход, так как некорректные ходы не вводятся в машину; партию легко отложить, сохранив текущую позицию, не возникает недоразумений по поводу положения той или иной фигуры, падения фигур и т.д.
Обучение дебютам построено на основе дебютных вариантов классификатора Рабара. На первом этапе инициатива полностью передается пользователю. Он указывает интересующий его дебют из приводимого списка. Далее, на экран выводится и последовательно разыгрывается фиксированная часть дебюта. Затем пользователь может рассматривать различные варианты, выбирая тот или иной ход в приводимом меню. Если дебютный вариант исчерпан, то указывается его индекс. Рассмотренный вариант можно повторить. Таким образом, одна из функций подсистемы обучения состоит в том, чтобы предоставить пользователю возможность получения справочной информации о том или ином варианте и его индексе.
Путем возврата ходов можно рассматривать различные варианты указанного дебюта. Для контроля полученных знаний предлагается выполнить ряд заданий. В 1-м задании необходимо указать ходы, определяющие данный дебют. Во 2-м и 3-м заданиях система генерирует некоторую позицию, характерную для данного дебюта, и просит сделать какой-либо из рекомендованных теорией ходов соответственно за белых или за черных. Далее машина отвечает на указанный пользователем ход и снова передает очередь хода человеку. Обучаемый может использовать также ограниченное число подсказок.
Подсистема Рейтинг предназначена для автоматической обработки информации в турнирных таблицах, расчета индивидуальных коэффициентов и международных рейтингов. Данная подсистема позволяет на основе начальных рейтингов прогнозировать результаты турниров, поддерживает полуавтоматическое заполнение турнирных таблиц, формирование таблиц движения по турам и очередности игры, графически отображает соотношение рейтингов нескольких шахматистов, изменения коэффициентов одного или группы шахматистов за последние 2 года и т.д. Система может быть использована в процессе подготовки и организации турниров.
Некоторые характеристики системы Дебют: объем программ - 90 Кбайт, среднее время выборки партии - 7 секунд, автоматической индексации - 15 секунд; диск объемом 360 Кбайт может вместить около 1500 партий, твердый диск объемом 10 Мбайт - до 50000 партий.
Обе рассмотренные системы - Эрудит и Дебют - включают характерные компоненты, которые должны быть в любом обучающем пакете. К таким компонентам относится база данных, средства визуализации (как правило, с активным использованием цветной графики), удобный интерфейс с пользователем, определенная схема или методика предъявления материала. Обязательно также выделение двух базовых режимов работы - в одном из них происходит заполнение базы данных, т.е. обучение самой системы; в другом режиме человек общается с системой и приобретает при этом новые знания или тренирует свои интеллектуальные способности.
Часто при обсуждении методов построения обучающих систем для школ или вузов говорят об "авторских" системах; при этом подразумевается, что такая система должна прежде всего давать учителю возможность ввода в машину своего материала и своей методики его предъявления будущему ученику. Система Эрудит отвечает этому требованию в полной мере, хотя набор допустимых методик обучения ограничен. В системе Дебют методика предъявления материала заложена разработчиками, что объясняется специальной ориентацией данного пакета; что же касается ввода нового материала в базу данных, то в этом отношении здесь предоставляются широкие возможности. Использованный подход может быть с успехом применен для создания обучающих систем в профориентации, в начальном, среднем и высшем образовании. Кроме того, аналогичный подход может быть применен для построения систем, предназначенных для обучения конкретным профессиональным навыкам - например, налаживанию станков, сборке-разборке сложных изделий и др.
ЭКСПЕРТНЫЕ СИСТЕМЫ КАК СРЕДСТВО ОБУЧЕНИЯ. Один из многообещающих подходов к построению обучающих систем может основываться на применении методов искусственного интеллекта, получивших развитие в последние годы в связи с созданием экспертных систем. Экспертные системы разрабатываются с целью применения в таких областях, где для принятия решений необходимо учитывать множество разнородных факторов. Основу типовой экспертной системы составляет база знаний, в которую закладывается информация о данной предметной области. Имеется две главных формы представления знаний в экспертных системах: ФАКТЫ и ПРАВИЛА. Факты фиксируют количественные и качественные показатели предметов и процессов. Правила описывают соотношения между фактами, обычно в виде логических условий, связывающих посылки и следствия.
Как и в обучающих системах, в типичной экспертной системе выделяются два главных процесса: формирование базы знаний и поддержка общения с человеком, который обращается к экспертной системе за советом и помощью.
Формирование базы знаний осуществляется разными методами. Самый простой метод - это запись фактов и правил в текстовой форме и ввод такого текста в машину. Синтаксическое оформление текстовых записей регламентируется конкретной инструментальной системой. Так, например, одним из общепринятых инструментальных средств для построения экспертных систем является язык пролог. Факты и правила на этом языке оформляются в точном соответствии с синтаксисом пролога. В более сложных инструментальных системах ввод фактов и правил в базу знаний может происходить на ограниченном естественном языке. Могут применяться также специальные методы познания - обучение по аналогии, по конкретным примерам, путем обобщения и композиции знаний и др., однако такие методы пока находятся в стадии отработки.
Функционирование экспертной системы обычно выглядит следующим образом. Человек формулирует в общих терминах стоящую перед ним задачу. Экспертная система выбирает определенный раздел своей базы знаний и начинает диалог с человеком на основе имеющихся правил и фактов. Человек (обучающийся) в таком диалоге обычно пассивен - он лишь отвечает на вопросы системы, выбирая ответ из нескольких предъявляемых альтернатив. Во время и после завершения серии вопросов-ответов система производит анализ ответов пользователя, сопоставляя их с имеющимися в базе знаний фактами. При этом производится логический вывод на основе подходящих правил и, в конечном счете, формируется ответ на интересующий человека вопрос.
Один из важных компонентов экспертной системы - объяснение сделанного вывода. Если человек запросит у системы такое объяснение, то оно выдается в соответствующей форме. Объясняющая подсистема пытается ответить на вопросы пользователя относительно своего поведения. В простых системах такое объяснение сводится просто к выдаче записанных фрагментов текста, извлекаемых по ключевым словам. Более развитые системы могут пересказывать правила на естественном языке и описывать ход своей работы в терминах таких правил. Объяснения необходимы также и разработчикам базы знаний при ее отладке. Если экспертная система может объяснить, как она пришла к тому или иному выводу, то ошибочные решения могут быть прослежены с целью обнаружения пропусков или несоответствий в базе знаний.
Экспериментальная экспертная система КЭС, ориентированная на специалиста в области сельскохозяйственного производства, разработана во ВНИПТИК ВАСХНИЛ Д.М.Блиновым. Эта система, реализованная на основе языка пролог, может быть использована для определения болезни сельскохозяйственной культуры по внешним признакам растения, для определения вредителя культуры, исходя из описания его внешнего вида, для определения болезни животного по симптомам ее проявления и данным лабораторного анализа, для прогнозирования урожайности культур и др. Знания в этой системе представлены в виде фактов и правил, состоящих из утверждений с условиями. Утверждения содержат посылки (классы объектов, их свойства и другие возможные сущности) и отклики С определенными характеристиками. Условия указывают на сочетания фактов или других условий, при удовлетворении которых устанавливается соответствие между посылками и откликами. Утверждение без условий трактуется как факт.
Правила организуются в иерархические структуры. База знаний представлена сетью из правил. Путь перехода по этой сети в каждом случае определяется ответами пользователя в процессе диалога. Диалог протекает следующим образом:
- программа сообщает пользователю возможные посылки, которые можно задать системе в процессе диалога. Примеры посылок: "болезни яровой пшеницы", "вредители яровой пшеницы", "болезни овощных культур";
- пользователь задает предмет диалога, выбирая одну из начальных посылок;
- система проводит опрос пользователя на предмет истинности или ложности соответствующих условий для данной посылки.
Если для какой-то посылки в процессе опроса пользователя выполнены все условия, то пользователю сообщается отклик, который становится посылкой для следующего этапа диалога. Так продолжается до тех пор, пока не будет достигнуто состояние выхода на конечный отклик. При этом пользователю предлагаются возможные пути перехода: продолжить диалог, пополнить знания системы или прекратить диалог.
Если просмотрены все условия и ни для одной посылки не выполнены условия, то пользователю сообщается распределение вероятностей между анализируемыми посылками. В этом случае пользователю выдается напоминание, что желательно пополнить базу знаний. Механизм выбора очередного условия для опроса пользователя определяется стратегией, реализованной в модуле логического вывода. На каждом шаге опроса пользователя сужается выбор претендентов-утверждений и претендентов-условий. В списке утверждений остаются только те, для которых выполнены все их условия. В списке условий остаются только те, которые принадлежат утверждениям с удовлетворенными посылками для всех опросов пользователя.
При вводе знаний в систему происходит диалог, в ходе которого программа для каждого правила запрашивает у пользователя посылку, отклик и перечень условий, определяющих принадлежность отклика к заданной посылке. По окончании диалога программа создает в базе данных новое правило в виде нескольких записей, определяющих утверждение, условие или факт. При начальном создании базы знаний осуществляется подготовка всех правил и фактов в виде текстов, которые создаются текстовым редактором, встроенным в систему. Программное обеспечение системы КЭС включает три программных модуля объемом 76, 72 и 32 Кбайт и файлов, представляющих собой базу знаний.
Таким образом, методы работы с экспертными и обучающими системами весьма сходны. Формирование и корректировка баз знаний, диалог с пользователем, выдача объяснений - все эти процессы являются чрезвычайно важными, и их эффективная реализация в обучающих системах может основываться на опыте разработки и применения экспертных систем. В то же время такие элементы обучающих систем, как графическая визуализация изучаемых объектов и процессов, удобный интерфейс с пользователем, ввод игровых компонентов в процесс общения, может существенно обогатить практику разработки и применения экспертных систем. Персональные компьютеры, благодаря своей массовости, дешевизне и общедоступности, безусловно стимулируют развитие и симбиоз обоих типов систем. Обучающие и экспертные системы на ПЭВМ могут стать достоянием любого человека.
Программное обеспечение персональных ЭВМ чрезвычайно многообразно. Может показаться, что при обилии прикладных пакетов для ПЭВМ отпадает необходимость в разработке новых систем, поскольку почти любую задачу можно пытаться решать на основе имеющегося программного обеспечения. Однако и технические, и программные средства ПЭВМ постоянно развиваются, и эта эволюция, в свою очередь, стимулирует постановку все новых задач и создание все новых программных средств для их решения.
ДЕБЮТ - СИСТЕМА ОБРАБОТКИ ШАХМАТНОЙ ИНФОРМАЦИИ. На протяжении всей истории шахматных соревнований важнейшим условием успешного выступления шахматиста является тщательная подготовка к турнирам. Эта подготовка включает подробный анализ партий, сыгранных в разное время будущими соперниками. Анализируются также дебютные продолжения, избиравшиеся данным шахматистом или его противниками. Это приобрело особое значение в наши дни, с развитием теории дебютов, поскольку от информационной подготовки игрока часто непосредственно зависит результат каждой сыгранной партии и всего турнира.
В настоящее время ежегодно в официальных соревнованиях играются десятки тысяч партий, из них около 30 тысяч представляют теоретический интерес. Большая часть партий публикуется в журналах, и работа шахматистов по отбору и изучению необходимой информации превращается в весьма тяжелый труд. Многие из них пользуются при подготовке специальными картотеками, работа с которыми весьма трудоемка. Многие гроссмейстеры создают свои собственные дебютные картотеки, а гроссмейстерам экстра-класса в этом помогают ассистенты.
Появление персональных компьютеров дает возможность организовать на их основе хранение и обслуживание шахматных банков информации. При этом важнейшим обстоятельством является общедоступность ПЭВМ, их малые физические размеры, отсутствие необходимости в обслуживающем персонале. Благодаря этим качествам ПЭВМ может сопровождать шахматистов на любом турнире. Кроме использования в качестве непосредственного инструмента информационной подготовки шахматистов, ПЭВМ на шахматных турнирах, как и на любых спортивных соревнованиях, может служить для визуализации результатов и их трансляции по телевидению, для комментирования и разбора партий и др. Технические средства современных персональных компьютеров, такие как цветная графика, твердый диск большой емкости, устройство ввода типа "мышь" и др. позволяют создавать программы, значительно облегчающие разыгрывание партий и их анализ.
Система обработки шахматной информации Дебют, разработанная в Вычислительном центре АН СССР, ориентирована на пользователей шахматистов различной квалификации. Система состоит из блока ввода и анализа партий, подсистемы поиска партий в базе данных, подсистемы обучения, программы автоматической классификации партий по дебютам и подсистемы обработки результатов турниров. Система состоит из 7 функциональных модулей, взаимодействующих через общие области памяти.
Модуль MAIN - это программа инициализации, которая считывает из базы данных закодированные изображения фигур и заполняет ими соответствующие массивы. Затем эта программа обеспечивает выбор одного из следующих модулей. Модуль PLAYER осуществляет ввод текстов партий, программно-логический контроль ходов и автоматическое разыгрывание партий. Этот модуль поддерживает анализ позиций, во время которого шахматист может передвигать фигуры на изображении доски с использованием манипулятора "мышь".
Модуль INDEX автоматически классифицирует партию по дебютам. При этом применяется закодированный классификатор, который приписывает данной партии определенный индекс в зависимости от порядка ходов соперников. Модуль READER кодирует тексты партий и заполняет каталоги базы данных при вводе информации. Каждый ход вводится либо путем его набора на клавиатуре, либо в результате перемещения фигур на экране при помощи манипулятора "мышь". Другой модуль осуществляет поиск в базе данных, декодирование и вывод текстов партий в файлы или на печать. Модуль FILER обеспечивает просмотр каталогов и коррекцию информации. Модуль TEACHER позволяет получать справочную информацию по дебютам.
Файлы данных в системе подразделяются на 4 группы:
1) Файлы тина CHS составляют информационный архив: закодированные тексты партий, позиций, каталоги индексов, фамилий шахматистов и т.д. Это изменяемая часть системы.
2) Файлы типа DEB содержат закодированные изображения фигур, дебютный классификатор партий и другую служебную информацию.
3) Файлы типа TXT содержат турнириые таблицы или выведенные для дальнейшей обработки и печати тексты партий.
4) Файлы типа FW содержат данные подсистемы Рейтинг.
Все партии перед выводом на печать или при занесении в базу данных классифицируются по специальным шахматным индексаторам. Цель этой классификации состоит в более точной идентификации дебютного варианта. Именно индекс является во многих случаях главным признаком при поиске партий. Автоматическая индексация партий, реализованная в системе, основана на дебютном классификаторе Рабара. В основе алгоритма индексации лежит возможность представления классификатора древовидной структурой: ребрам дерева приписаны полуходы, вершинам соответствуют индексы.
Поиск индексов демонстрируется построением дерева рассматриваемых вариантов. Пользователь может управлять работой алгоритма индексации, изменяя ряд параметров в эвристических критериях и допустимую глубину перестановки ходов. Таким образом, для одной и той же партии можно получать различные мнржества индексов - кандидатов (дерево рассматриваемых вариантов меняет свою глубину и ширину) и различные конечные индексы партии. Это удобное средство позволяет шахматисту - индексатору исследовать различные варианты алгоритма.
Дерево классификатора представлено в базе данных однонаправленным списком с записями переменной длины. Каждый элемент списка содержит полуходы и соответствующие им индексы, а также ссылки на следующие вершины дерева. Количество ссылок определяется ветвлением в данном узле.
База данных системы содержит тексты партий и их параметры; индекс, фамилии игроков, соревнование, год, результат, а также позиции и дебютный классификатор. В целях экономии памяти тексты партий при записи в базу кодируются, что позволяет занимать лишь один байт для хранения полухода. Для обеспечения быстрого поиска система содержит 4 инвертированных файла прямого доступа - список дебютных индексов партий, фамилии шахматистов, список соревнований и список стран.
Для облегчения, и ускорения ввода текста партий разработаны следующие средства:
- каждый ход проходит синтаксический и семантический контроль, при этом проверяется правильность записи хода и его соответствие шахматным правилам; неправильные ходы не вводятся в систему;
- текст партии вводится прямо с листа, при этом производится автоматическая нумерация ходов;
- ввод очередного хода демонстрируется изменением позиции на экране.
При выводе партий пользователь формирует запрос, в котором может указать произвольную, но осмысленную комбинацию ключей. Система поддерживает около 50 различных видов запросов. Самым простым и наиболее быстрым способом вызыва партии или позиции является загрузка по номеру в каталоге. Специальный режим предусмотрен для поиска дебютных аналогов указанной партии. При этом достаточно вывести на одну из двух диаграмм на экране дисплея навальные ходы партии, и система будет последовательно разыгрывать на второй диаграмме все партии из базы данных с указанным дебютом. Отобранные по запросу партии могут быть выведены на печать или рассмотрены с помощью средств анализа.
Функция просмотра каталогов системы предназначена для ознакомления пользователя с тем, какая информация уже введена в систему. Программист имеет возможность контролировать правильность занесения информации в базу данных, просматривать ссылки и тексты партий во внутреннем представлении системы.
При обычном анализе партий и позиций возникают неудобства связанные с необходимостью работы с двумя объектами: позицией на доске и текстом партии в журнале. При автоматическом разыгрывании партии шахматист не отвлекается на "чтение" партии и перестановку фигур: розыгрыш осуществляет программа. Во время разыгрывания можно ускорить, замедлить, приостановить игру, вернуть назад несколько последних ходов. Предусмотрена возможность комментирования партий с помощью введения различных альтернативных вариантов для любого хода. Если партия была записана в архив с комментариями, то при разыгрывании они автоматически выводятся на вторую доску.
Устройство типа "мышь" позволяет имитировать взятие и перемещение фигуры. При вводе позиции нужно, двигая устройство по столу, подвести курсор к выбранной фигуре, "взять" ее с помощью нажатия правой кнопки манипулятора, переместить курсор на нужное поле и "поставить" фигуру с помощью левой кнопки. Клавиатура и устройство "мышь" работают в режиме параллельного ввода. При вводе ходов с помощью манипулятора "мышь" генерируется их текстовое представление и имеется возможность дальнейшей работы с текстом партии.
При анализе позиции каждый рассмотренный вариант записывается в текстовом виде, и затем можно автоматически повторить все рассмотренные ранее варианты.
Система поддерживает одновременную работу с двумя партиями или позициями. Это полезно для ввода и анализа комментариев, сравнительного анализа партий или позиций. Предусмотрен поиск партий, в которых встречалась расставленная позиция. На одной из диаграмм с помощью манипулятора "мышь" устанавливается произвольная позиция, на другую выводятся и разыгрываются партии, в которых она встречалась. Если позиция относится к дебютной стадии, то с помощью системы классификации поиск будет проведен быстро. В других же случаях для ускорения поиска можно задать один или несколько предполагаемых признаков партии: соревнование, фамилию шахматиста и др. Таким образом, при достаточном банке партий для любой указанной позиции можно узнать, встречалась ли она когда-либо ранее и какие ходы были при этом сделаны.
Пользуясь манипуляторами "мышь", два соперника могут сыграть блиц-партию. При этом ведется автоматическая запись текста партии, что позволяет сделать по окончании игры ее анализ, автоматически переключаются часы соперников. При этом нельзя сделать неправильный ход, так как некорректные ходы не вводятся в машину; партию легко отложить, сохранив текущую позицию, не возникает недоразумений по поводу положения той или иной фигуры, падения фигур и т.д.
Обучение дебютам построено на основе дебютных вариантов классификатора Рабара. На первом этапе инициатива полностью передается пользователю. Он указывает интересующий его дебют из приводимого списка. Далее, на экран выводится и последовательно разыгрывается фиксированная часть дебюта. Затем пользователь может рассматривать различные варианты, выбирая тот или иной ход в приводимом меню. Если дебютный вариант исчерпан, то указывается его индекс. Рассмотренный вариант можно повторить. Таким образом, одна из функций подсистемы обучения состоит в том, чтобы предоставить пользователю возможность получения справочной информации о том или ином варианте и его индексе.
Путем возврата ходов можно рассматривать различные варианты указанного дебюта. Для контроля полученных знаний предлагается выполнить ряд заданий. В 1-м задании необходимо указать ходы, определяющие данный дебют. Во 2-м и 3-м заданиях система генерирует некоторую позицию, характерную для данного дебюта, и просит сделать какой-либо из рекомендованных теорией ходов соответственно за белых или за черных. Далее машина отвечает на указанный пользователем ход и снова передает очередь хода человеку. Обучаемый может использовать также ограниченное число подсказок.
Подсистема Рейтинг предназначена для автоматической обработки информации в турнирных таблицах, расчета индивидуальных коэффициентов и международных рейтингов. Данная подсистема позволяет на основе начальных рейтингов прогнозировать результаты турниров, поддерживает полуавтоматическое заполнение турнирных таблиц, формирование таблиц движения по турам и очередности игры, графически отображает соотношение рейтингов нескольких шахматистов, изменения коэффициентов одного или группы шахматистов за последние 2 года и т.д. Система может быть использована в процессе подготовки и организации турниров.
Некоторые характеристики системы Дебют: объем программ - 90 Кбайт, среднее время выборки партии - 7 секунд, автоматической индексации - 15 секунд; диск объемом 360 Кбайт может вместить около 1500 партий, твердый диск объемом 10 Мбайт - до 50000 партий.
Обе рассмотренные системы - Эрудит и Дебют - включают характерные компоненты, которые должны быть в любом обучающем пакете. К таким компонентам относится база данных, средства визуализации (как правило, с активным использованием цветной графики), удобный интерфейс с пользователем, определенная схема или методика предъявления материала. Обязательно также выделение двух базовых режимов работы - в одном из них происходит заполнение базы данных, т.е. обучение самой системы; в другом режиме человек общается с системой и приобретает при этом новые знания или тренирует свои интеллектуальные способности.
Часто при обсуждении методов построения обучающих систем для школ или вузов говорят об "авторских" системах; при этом подразумевается, что такая система должна прежде всего давать учителю возможность ввода в машину своего материала и своей методики его предъявления будущему ученику. Система Эрудит отвечает этому требованию в полной мере, хотя набор допустимых методик обучения ограничен. В системе Дебют методика предъявления материала заложена разработчиками, что объясняется специальной ориентацией данного пакета; что же касается ввода нового материала в базу данных, то в этом отношении здесь предоставляются широкие возможности. Использованный подход может быть с успехом применен для создания обучающих систем в профориентации, в начальном, среднем и высшем образовании. Кроме того, аналогичный подход может быть применен для построения систем, предназначенных для обучения конкретным профессиональным навыкам - например, налаживанию станков, сборке-разборке сложных изделий и др.
ЭКСПЕРТНЫЕ СИСТЕМЫ КАК СРЕДСТВО ОБУЧЕНИЯ. Один из многообещающих подходов к построению обучающих систем может основываться на применении методов искусственного интеллекта, получивших развитие в последние годы в связи с созданием экспертных систем. Экспертные системы разрабатываются с целью применения в таких областях, где для принятия решений необходимо учитывать множество разнородных факторов. Основу типовой экспертной системы составляет база знаний, в которую закладывается информация о данной предметной области. Имеется две главных формы представления знаний в экспертных системах: ФАКТЫ и ПРАВИЛА. Факты фиксируют количественные и качественные показатели предметов и процессов. Правила описывают соотношения между фактами, обычно в виде логических условий, связывающих посылки и следствия.
Как и в обучающих системах, в типичной экспертной системе выделяются два главных процесса: формирование базы знаний и поддержка общения с человеком, который обращается к экспертной системе за советом и помощью.
Формирование базы знаний осуществляется разными методами. Самый простой метод - это запись фактов и правил в текстовой форме и ввод такого текста в машину. Синтаксическое оформление текстовых записей регламентируется конкретной инструментальной системой. Так, например, одним из общепринятых инструментальных средств для построения экспертных систем является язык пролог. Факты и правила на этом языке оформляются в точном соответствии с синтаксисом пролога. В более сложных инструментальных системах ввод фактов и правил в базу знаний может происходить на ограниченном естественном языке. Могут применяться также специальные методы познания - обучение по аналогии, по конкретным примерам, путем обобщения и композиции знаний и др., однако такие методы пока находятся в стадии отработки.
Функционирование экспертной системы обычно выглядит следующим образом. Человек формулирует в общих терминах стоящую перед ним задачу. Экспертная система выбирает определенный раздел своей базы знаний и начинает диалог с человеком на основе имеющихся правил и фактов. Человек (обучающийся) в таком диалоге обычно пассивен - он лишь отвечает на вопросы системы, выбирая ответ из нескольких предъявляемых альтернатив. Во время и после завершения серии вопросов-ответов система производит анализ ответов пользователя, сопоставляя их с имеющимися в базе знаний фактами. При этом производится логический вывод на основе подходящих правил и, в конечном счете, формируется ответ на интересующий человека вопрос.
Один из важных компонентов экспертной системы - объяснение сделанного вывода. Если человек запросит у системы такое объяснение, то оно выдается в соответствующей форме. Объясняющая подсистема пытается ответить на вопросы пользователя относительно своего поведения. В простых системах такое объяснение сводится просто к выдаче записанных фрагментов текста, извлекаемых по ключевым словам. Более развитые системы могут пересказывать правила на естественном языке и описывать ход своей работы в терминах таких правил. Объяснения необходимы также и разработчикам базы знаний при ее отладке. Если экспертная система может объяснить, как она пришла к тому или иному выводу, то ошибочные решения могут быть прослежены с целью обнаружения пропусков или несоответствий в базе знаний.
Экспериментальная экспертная система КЭС, ориентированная на специалиста в области сельскохозяйственного производства, разработана во ВНИПТИК ВАСХНИЛ Д.М.Блиновым. Эта система, реализованная на основе языка пролог, может быть использована для определения болезни сельскохозяйственной культуры по внешним признакам растения, для определения вредителя культуры, исходя из описания его внешнего вида, для определения болезни животного по симптомам ее проявления и данным лабораторного анализа, для прогнозирования урожайности культур и др. Знания в этой системе представлены в виде фактов и правил, состоящих из утверждений с условиями. Утверждения содержат посылки (классы объектов, их свойства и другие возможные сущности) и отклики С определенными характеристиками. Условия указывают на сочетания фактов или других условий, при удовлетворении которых устанавливается соответствие между посылками и откликами. Утверждение без условий трактуется как факт.
Правила организуются в иерархические структуры. База знаний представлена сетью из правил. Путь перехода по этой сети в каждом случае определяется ответами пользователя в процессе диалога. Диалог протекает следующим образом:
- программа сообщает пользователю возможные посылки, которые можно задать системе в процессе диалога. Примеры посылок: "болезни яровой пшеницы", "вредители яровой пшеницы", "болезни овощных культур";
- пользователь задает предмет диалога, выбирая одну из начальных посылок;
- система проводит опрос пользователя на предмет истинности или ложности соответствующих условий для данной посылки.
Если для какой-то посылки в процессе опроса пользователя выполнены все условия, то пользователю сообщается отклик, который становится посылкой для следующего этапа диалога. Так продолжается до тех пор, пока не будет достигнуто состояние выхода на конечный отклик. При этом пользователю предлагаются возможные пути перехода: продолжить диалог, пополнить знания системы или прекратить диалог.
Если просмотрены все условия и ни для одной посылки не выполнены условия, то пользователю сообщается распределение вероятностей между анализируемыми посылками. В этом случае пользователю выдается напоминание, что желательно пополнить базу знаний. Механизм выбора очередного условия для опроса пользователя определяется стратегией, реализованной в модуле логического вывода. На каждом шаге опроса пользователя сужается выбор претендентов-утверждений и претендентов-условий. В списке утверждений остаются только те, для которых выполнены все их условия. В списке условий остаются только те, которые принадлежат утверждениям с удовлетворенными посылками для всех опросов пользователя.
При вводе знаний в систему происходит диалог, в ходе которого программа для каждого правила запрашивает у пользователя посылку, отклик и перечень условий, определяющих принадлежность отклика к заданной посылке. По окончании диалога программа создает в базе данных новое правило в виде нескольких записей, определяющих утверждение, условие или факт. При начальном создании базы знаний осуществляется подготовка всех правил и фактов в виде текстов, которые создаются текстовым редактором, встроенным в систему. Программное обеспечение системы КЭС включает три программных модуля объемом 76, 72 и 32 Кбайт и файлов, представляющих собой базу знаний.
Таким образом, методы работы с экспертными и обучающими системами весьма сходны. Формирование и корректировка баз знаний, диалог с пользователем, выдача объяснений - все эти процессы являются чрезвычайно важными, и их эффективная реализация в обучающих системах может основываться на опыте разработки и применения экспертных систем. В то же время такие элементы обучающих систем, как графическая визуализация изучаемых объектов и процессов, удобный интерфейс с пользователем, ввод игровых компонентов в процесс общения, может существенно обогатить практику разработки и применения экспертных систем. Персональные компьютеры, благодаря своей массовости, дешевизне и общедоступности, безусловно стимулируют развитие и симбиоз обоих типов систем. Обучающие и экспертные системы на ПЭВМ могут стать достоянием любого человека.
Программное обеспечение персональных ЭВМ чрезвычайно многообразно. Может показаться, что при обилии прикладных пакетов для ПЭВМ отпадает необходимость в разработке новых систем, поскольку почти любую задачу можно пытаться решать на основе имеющегося программного обеспечения. Однако и технические, и программные средства ПЭВМ постоянно развиваются, и эта эволюция, в свою очередь, стимулирует постановку все новых задач и создание все новых программных средств для их решения.
Gudleifr- Admin
- Сообщения : 3403
Дата регистрации : 2017-03-29
Re: Брябрин. Программное обеспечение персональных ЭВМ. 1990
СПИСОК ЛИТЕРАТУРЫ
1. Борковский А.Б. Многооконное текстовое взаимодействие с персональной ЭВМ//Микропроцессорные средства и системы.- 1984.- #4.- С.47-50.
2. Брябрин В.М. Профессиональные персональные ЭВМ//Прикладная информатика.- М.: Финансы и статистика.- 1984.- Вып.2(7).- С.143-162.
3. Брябрин В.М. Интеллектуальный интерфейс на основе персональной ЭВМ//Микропроцессорные средства и системы.- 1984,- #3.- С.38-44.
4. Брябрин В.М. Профессиональная персональная ЭВМ - рабочее место будущего//Кибернетика. Становление информатики.- М.: Наука, 1986.- Сер. Кибернетика.
5. Гнездилова Г.Г. К созданию интегрированной операционной среды персонального компьютера.- Препринт/ВЦ АН СССР.- М., 1985.
6. Громов Г.Р. Национальные информационные ресурсы.- М.: Наука, 1985.
7. Громов Г.Р. Персональные вычисления - новый этап информационной технологии//Микропроцессорные средства и системы.- 1984.- #1.
8. Ершов А.П. Автоматизация работы служащих//Персональные ЭВМ в задачах информатики.- Препрннт/ВЦ СО АН СССР.- Новосибирск, 1984.- С.6-39.
9. Кочетков Г.Б. Автоматизация конторской работы.- М.; Наука, 1985.
10. Лавров С.С. Кому и для чего нужна персональная машина// Микропроцессорные средства и системы.- 1984.- #1.
11. Программное обеспечение персональных ЭВМ/Под ред. В.М.Брябрина - Препринт/ВЦ АН СССР.- М., 1985.
12. ТИИЭР. Тематический выпуск "Персональные ЭВМ".- М.: Мир, 1984.- Т.72, #3.
13. Alperson B., Fluegelman A., Magid L. The Fully Powered PC//PC World Books.- Simon & Schuster, 1985.
14. BYTE. The Small Systems Journal.- McGraw-Hill, 1983-1986.- Vol.8-11.
15. Barstow D.R., Shrobe H.E., Sandewall E. Interactive Programming Environments.- McGraw-Hill, 1984.
16. Comer D. Operating System Design. The XINU Approach.- Prentice-Hall, 1984.
17. Disk Operating System Version 3.00.- IBM Personal Computer Software.- May, 1984.
18. Disk Operating System Technical Reference.- Microsoft Corp. 1984.
19. Gilder T.H. The Integrated Software Book.- Addison-Wesley, 1985.
20. IBM Personal Computer XT Technical Reference.- IBM PC Hardware Reference Library. May, 1984.
21. Making MS-DOS & PC-DOS Work for You//The Human Connection.- TAB Books, 1984.
22. Markowsky G. A Comprehensive Guide to the IBM PC.- Prentice-Hall, 1984.
23. Norton P. Inside the IBM PC. Access to advanced features and programming.- Brady Communications Co., Prentice-Hall, 1983.
24. Norton P. Programmer's Guide to the IBM PC.- Microsoft Press, 1985.
25. Park C. Interactive Microcomputer Graphics.- Addison-Wesley, 1985.
26. PC Magazine.- Ziff-Davis Publishing, 1985-1986.- Vol.3-4.
27. PC World.- CW Communications Inc., 1985-1986.- Vol.3-4.
28. Plemmens P. Essential applications for the IBM PC and XT.- Simon & Schuster, 1984.
29. TurboPascal Version 3.0 Reference Manual.- Borland International, 1985.
30. Volkstorf J.E. Graphics Programming on the IBM Personal Computer.- A Spectrum Book, Prentice-Hall, 1983.
31. Персональные компьютеры. Информатика для всех.- М.: Наука, 1987.
1. Борковский А.Б. Многооконное текстовое взаимодействие с персональной ЭВМ//Микропроцессорные средства и системы.- 1984.- #4.- С.47-50.
2. Брябрин В.М. Профессиональные персональные ЭВМ//Прикладная информатика.- М.: Финансы и статистика.- 1984.- Вып.2(7).- С.143-162.
3. Брябрин В.М. Интеллектуальный интерфейс на основе персональной ЭВМ//Микропроцессорные средства и системы.- 1984,- #3.- С.38-44.
4. Брябрин В.М. Профессиональная персональная ЭВМ - рабочее место будущего//Кибернетика. Становление информатики.- М.: Наука, 1986.- Сер. Кибернетика.
5. Гнездилова Г.Г. К созданию интегрированной операционной среды персонального компьютера.- Препринт/ВЦ АН СССР.- М., 1985.
6. Громов Г.Р. Национальные информационные ресурсы.- М.: Наука, 1985.
7. Громов Г.Р. Персональные вычисления - новый этап информационной технологии//Микропроцессорные средства и системы.- 1984.- #1.
8. Ершов А.П. Автоматизация работы служащих//Персональные ЭВМ в задачах информатики.- Препрннт/ВЦ СО АН СССР.- Новосибирск, 1984.- С.6-39.
9. Кочетков Г.Б. Автоматизация конторской работы.- М.; Наука, 1985.
10. Лавров С.С. Кому и для чего нужна персональная машина// Микропроцессорные средства и системы.- 1984.- #1.
11. Программное обеспечение персональных ЭВМ/Под ред. В.М.Брябрина - Препринт/ВЦ АН СССР.- М., 1985.
12. ТИИЭР. Тематический выпуск "Персональные ЭВМ".- М.: Мир, 1984.- Т.72, #3.
13. Alperson B., Fluegelman A., Magid L. The Fully Powered PC//PC World Books.- Simon & Schuster, 1985.
14. BYTE. The Small Systems Journal.- McGraw-Hill, 1983-1986.- Vol.8-11.
15. Barstow D.R., Shrobe H.E., Sandewall E. Interactive Programming Environments.- McGraw-Hill, 1984.
16. Comer D. Operating System Design. The XINU Approach.- Prentice-Hall, 1984.
17. Disk Operating System Version 3.00.- IBM Personal Computer Software.- May, 1984.
18. Disk Operating System Technical Reference.- Microsoft Corp. 1984.
19. Gilder T.H. The Integrated Software Book.- Addison-Wesley, 1985.
20. IBM Personal Computer XT Technical Reference.- IBM PC Hardware Reference Library. May, 1984.
21. Making MS-DOS & PC-DOS Work for You//The Human Connection.- TAB Books, 1984.
22. Markowsky G. A Comprehensive Guide to the IBM PC.- Prentice-Hall, 1984.
23. Norton P. Inside the IBM PC. Access to advanced features and programming.- Brady Communications Co., Prentice-Hall, 1983.
24. Norton P. Programmer's Guide to the IBM PC.- Microsoft Press, 1985.
25. Park C. Interactive Microcomputer Graphics.- Addison-Wesley, 1985.
26. PC Magazine.- Ziff-Davis Publishing, 1985-1986.- Vol.3-4.
27. PC World.- CW Communications Inc., 1985-1986.- Vol.3-4.
28. Plemmens P. Essential applications for the IBM PC and XT.- Simon & Schuster, 1984.
29. TurboPascal Version 3.0 Reference Manual.- Borland International, 1985.
30. Volkstorf J.E. Graphics Programming on the IBM Personal Computer.- A Spectrum Book, Prentice-Hall, 1983.
31. Персональные компьютеры. Информатика для всех.- М.: Наука, 1987.
Gudleifr- Admin
- Сообщения : 3403
Дата регистрации : 2017-03-29
Re: Брябрин. Программное обеспечение персональных ЭВМ. 1990
ДОПОЛНЕНИЕ К ГЛАВЕ 4
К сожалению, глава 4 слишком эклектична и совершенно непоследовательна. (Хотя там и нет чего-то принципиально нового по сравнению с книгой Бека). Какой-то сборник рецептов, половина из которых была в те времена неприменима для пользователя из-за того, что его конфигурация ДОС совершенно не соответствовала тому, что описано в книге.
Самое главное: никакого обилия языков программирования на обычном ПК не наблюдалось. Никаких паскалей, си и даже ассемблеров. В стандартную поставку ДОС входил только бейсик, link и lib (на случай, если пользователь сам напишет свой(!) компилятор) и... debug.
Debug - это си для бедных. Т.е. если в ОС UNIX очень много можно было сделать при помощи командных файлов, вставляя в них простенькие заплатки на си, то в ДОС можно было ладить подобные заплатки в debug. Например, Брябрин упоминает очень полезную, но несуществующую программу ASK-CODE. Где ее взять? Оказывается, можно было написать самому.
***
В МИРЕ ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ 2/88
ВВЕДЕНИЕ В ЯЗЫК АССЕМБЛЕРА
ХАРДИН БРОДЕРЗ
Не нужно быть профессионалом, чтобы писать программы на языке ассемблера. Программа Debug позволит вам освоить ассемблер в рекордно короткий срок.
Первым языком программирования был язык ассемблера. Нули и единицы "естественного" машинного языка на языке ассемблера заменяют символами, похожими на английские слова. Когда вы пишете программу на языке ассемблера, то обращаетесь непосредственно к центральному процессору (ЦП), системе ввода-вывода BIOS и операционной системе (ОС) MS-DOS, минуя прикладные программы. Пользуясь языком ассемблера, вы начинаете понимать, что же на самом деле происходит внутри ЭВМ.
У языка ассемблера есть и другие преимущества, которые хорошо известны профессиональным программистам: это быстрый язык - он примерно в 100 раз быстрее Бейсика; ассемблер использует память эффективнее, чем языки высокого уровня, и обычно является наилучшим языком для управления устройствами ввода-вывода, в особенности экраном дисплея. Основной недостаток языка ассемблера - высокая, иногда недопустимо высокая трудоемкость программирования компенсируется при его сочетании с языком высокого уровня. Так, лучшее программное обеспечение совмещает программы, написанные на языке высокого уровня, с подпрограммами, написанными на языке ассемблера.
Как правило, для серьезного программирования на языке ассемблера необходимо приобрести транслятор, обеспечивающий перевод команд в двоичный код, воспринимаемый ЭВМ. К счастью, программа Debug.COM, поставляемая в составе ОС MS-DOS, дает возможность получать доступ к программированию на машинном языке и языке ассемблера, не покупая транслятора. Ниже вы узнаете, как вызвать программу Debug, и познакомитесь с тем, как ЭВМ хранит данные в числовом виде. После этого мы рассмотрим несколько коротких программ, демонстрирующих некоторые концепции, которые применимы и при работе с настоящими трансляторами языка ассемблера.
ЗНАКОМСТВО С ПРОГРАММОЙ DEBUG
Сначала установите на дисковод A диск с ОС MS-DOS и наберите команду DEBUG. Через одну-две секунды на следующей строке появится дефис. Этот дефис является приглашением к вводу программы Debug и указывает на то, что Debug ожидает от вас команды. Команды можно вводить как в нижнем, так и в верхнем регистрах, после набора каждой команды следует нажать клавишу возврата каретки.
Наберите букву R и нажмите клавишу возврата каретки. На экране появятся три строки. Содержание появившегося изображения объясняется на схеме начального вывода программы Debug. Вид этого изображения одинаков для всех компьютеров, хотя некоторые буквы и числа могут варьироваться. (При повторении действий, выполняемых в программах, приведенных в этой статье, вам надо набирать только те символы, которые расположены за приглашением к вводу и адресами ячеек памяти [например, 16BA:0138]. Все остальное - это комментарии или отображение того, что вы должны увидеть на экране).
Введя R, вы предложили программе Debug показать текущее содержимое регистров ЦП. Регистры - это ячейки памяти, находящиеся в ЦП (в отличие от ячеек ОЗУ). Некоторые регистры можно использовать почти для любых целей, другие - имеют специальное назначение.
Центральный процессор тех ЭВМ, которые работают под управлением ОС MS-DOS, имеет 14 встроенных регистров. Каждый регистр содержит 16 бит, или одно слово. Первые четыре регистра (AX, BX, CX и DX) называются регистрами общего значения, и мы достаточно свободны в способе их использования. Кроме того, каждый из этих регистров может быть использован в качестве двух 8-битовых (или байтовых, что одно и то же) регистров. Старший байт регистра AX именуется AH, младший - AL. От вас зависит, в каких случаях использовать эти части памяти в качестве 16-битовых регистров, а в каких - в качестве 8-битовых.
Начальный вывод программы Debug показывает, что содержимое всех регистров общего назначения равно 0000. Такое же значение содержится и в трех регистрах указателей: BP, SI и DI. Регистр указателя базы BP используется в основном в качестве метки, помогающей обрабатывать сложные структура данных, называемые кадрами стека.
Регистры индекса источника SI и индекса приемника DI используются в основном для пересылки содержимого больших блоков памяти, именуемых на языке ассемблера строками, независимо от того, содержат они текстовые данные или нет.
Последний регистр в первом ряду вывода программы Debug - это указатель стека SP. Стек представит собой структуру данных в памяти, имеющую множество назначений. При каждом вызове подпрограммы в стек заносится адрес возврата. Программисты могут использовать стек для временного сохранения содержимого регистров, а иногда и для передачи значений из одной подпрограммы в другую.
Первые четыре регистра второго ряда - это регистры сегментов. Память ЭВМ, работающих под управлением ОС MS-DOS, устроена так, что для адресации ячеек памяти необходимы регистры двух видов: регистры сегментов указывают на болышие блоки памяти, а в одном из других регистров содержится адрес внутри этого блока.
Пятый регистр во втором ряду это указатель команд IP. Этот регистр всегда содержит адрес следующей команды, подлежащей исполнению, подобно тому как в Бейсике всегда хранится номер следующей строки, подлежащей интерпретации и выполнению.
Содержимое всех 13 числовых регистров приведено в шестнадцатеричном виде. При программировании на языке ассемблера редко пользуются десятичными числами, в основном числа записывают в двоичном (по основанию 2) или в шестнадцатеричном (по основанию 16) виде.
В конце второй строки начального вывода программы Debug показаны восемь двухбуквенных кодов, отображающих состояние значащих битов регистра флагов состояния (см. таблицу флагов состояния). Для фиксации состояний этих флагов в ЦП имеется специальный 16-битовый регистр. Состояния флагов изменяются в результате выполнения многих команд языка ассемблера и могут быть проверены для того, чтобы установить, следует ли передать управление новой группе команд.
Все проверки выполнения условий на языке ассемблера производятся на основании состояний соответствующих флагов. Например, флаг нуль может поменять значение с NZ на ZR; это показывает, что результат выполнения арифметической операции равен нулю. Не все биты регистра являются значащими.
РЕЖИМ ВЫВОДА НА ЭКРАН
Пока что вы только наблюдали, но не программировали. Перед тем как написать простую программу, вам необходимо познакомиться еще с одной командой программы Debug. Если вы наберете на клавиатуре букву R, то программа Debug покажет вам начальное состояние регистров. Если же вы наберете букву R и укажете за ней имя регистра, то программа Debug покажет содержимое этого регистра и позволит вам занести в него новое значение.
Например, если вы наберете
rax
то программа Debug выведет на экран AX 0000 в первой строке и двоеточие во второй. Если вы введете 1111, то программа Debug заменит значение регистра AX на 1111H (в данной статье мы используем суффикс H для обозначения шестнадцатеричной записи числа). Помните, что для ввода и вывода чисел программа Debug использует шестнадцатеричную систему счисления.
Для набора команды на языке ассемблера введите букву A. В ответ на это программа Debug выведет на экран четырехзначное число, двоеточие и 0100. Появится курсор без приглашения к вводу, после чего можно вводить операторы вашей программы.
Выведенные числа показывают сегмент и смещение адреса текущей ячейки памяти. Адреса сегментов, которые вы увидите на экране, скорее всего будут отличаться от приведенных на рисунках, так как они зависят от используемой версии ОС MS-DOS, наличия резидентных программ, виртуальных дисков или программ буферизации печати. Число, стоящее за двоеточием, называется смещением и должно быть равно 0100. Все программы типа .COM начинаются с относительного адреса 100H, а программа Debug может создавать только программы типа .COM. Если смещение не равно 0100, то нажмите клавишу возврата каретки и наберите
a 100
Теперь размещение команд языка ассемблера начнется с адреса 0100H. Наша первая программа будет чрезвычайно простой. Наберите три строки операторов, показанные на рис.1. Чтобы поля операторов располагались в столбик, используйте клавишу табуляции; после набора каждой строки следует нажимать на клавишу возврата каретки. Нажмите клавишу возврата каретки еще раз: вы должны снова получить на экране дефис - приглашение к вводу программы Debug. Для проверки выполненной вами работы введите команду
u 100 l 7
По этой команде Debug "ретранслирует" содержимое семи байтов с начальным адресом 100H (буква l - это сокращение слова Length - длина). На экране должно появиться изображение, показанное в нижней части рис. 1. Введите r для вывода содержимого регистров. Появившееся на экране изображение содержимого регистров должно совпадать с изображением, полученным вначале, за тем исключением, что в последней строке будет стоять первая команда вашей программы.
Рис.1. Введите три строки команд программы, которые расположены на рисунке ближе к центру. Эта простая программа показывает, как использовать общеупотребительные команды MOV и ADD языка ассемблера
ОСНОВНЫЕ ПОНЯТИЯ
Каждая строка программы на языке ассемблера, написанной с помощью программы Debug, состоит из двух частей. Первая часть строки всегда содержит имя команды, состоящее из двух, трех или четырех букв. Эти имена называют мнемокодами, так как они соответствуют в точности одной команде ЦП и их проще запомнить, чем последовательность двоичных чисел. Иногда их называют кодами операций, так как они представляют операции центрального процессора.
За кодом операции следуют один или два (или не следует ни одного) операнда. Число операндов зависит от конкретных команды и типа используемых ею данных. В конце строки можно поставить точку с запятой и написать комментарий.
Первым в программе идет код операции MOV, получивший свое имя от слова move (переслать). Это один из наиболее часто употребляемых мнемокодов, встречающихся в программах на языке ассемблера. Он используется для пересылки данных в регистры, в память, из регистра в регистр, из регистра в память, и наоборот. Строго говоря, название команды некорректно, так как она только КОПИРУЕТ данные из одного места в другое и подобно оператору Бейсика LET не изменяет значения операнда-источника.
За кодом операции MOV всегда следуют два операнда: источник и приемник. Первая строка на рис.1 сообщает ЦП: "Переслать в регистр AX значение, равное 1". Аналогичным образом вторая строка загружает значение 2 в регистр BX. Эти две строки подобны операторам Бейсика
AX=1: BX=2
Наверное, нетрудно понять, что третья строка содержит команду сложения (add означает "сложить"). Ответ на вопросы, откуда берутся операнды и куда записывается результат, не столь очевиден. Не поддавайтесь соблазну прочитать эту строку как "сложить значения AX и BX". Правильно читать эту строку как "увеличить значение регистра AX на значение регистра BX". Такое чтение команды поможет вам запомнить ее результат: значение в регистре BX складывается со значением в регистре AX, и результат остается в регистре AX. Эта строка аналогична оператору Бейсика
AX=AX+BX
Одно из достоинств программы Debug заключается в том, что она позволяет шаг за шагом проследить за выполнением составленной программы. Введите три раза букву t (первую букву имени команды трассировки Trace) и проследите за содержимым регистров AX и BX. Команда Trace указывает программе Debug, что следует выполнить команду вашей программы и снова выдать содержимое регистров. Это позволит вам наблюдать загрузку значений в регистры и занесение конечного результата в регистр AX. На вашем экране должно появиться изображение, похожее на то, что показано на рис.2.
Рис.2. Введя команду Trace программы Debug, вы увидите, как каждая строка программы, приведенной на рис.1, изменяет содержимое регистра центрального процессора
ЗАПИСЬ НА ДИСК И ИСПОЛНЕНИЕ ПРОГРАММЫ
Хотя наша первая программа и не дает интересных результатов, она позволяет понять элементы изображения содержимого регистров с помощью программы Debug, трансляции и ретрансляции программы на языке ассемблера, трассировки программы, демонстрирующей ход ее исполнения. Чтобы с помощью программы Debug создать свою программу, вам нужно научиться записывать ее на диск так, чтобы можно было инициировать ее выполнение после выхода на приглашение к вводу ОС MS-DOS.
С помощью простой программы, приведенной на рис.3, мы познакомим вас с некоторыми новыми понятиями. Сначала вам надо удалить свою программу из памяти программы Debug. Для этого введите букву q, чтобы завершить работу с программой Debug; затем в ответ на приглашение к вводу ОС MS-DOS введите DEBUG.
Рис.3. Эта программа демонстрирует сохранение программы на языке ассемблера на диске и вызов ОС MS-DOS
Очень важно уметь перемещать данные в регистрах, но эти действия не дают наглядных результатов. Напротив, программа на рис.3 выдает на экран сообщение: "Приветствую!". Работа с этой программой научит вас двум приемам: записи программ на диск и общению с ОС MS-DOS.
Центральный процессор ничего не знает о подключенных экранах дисплеев, клавиатурах и принтерах. Для выполнения функций ввода-вывода программа должна либо управлять аппаратными средствами компьютера непосредственно, что является сложной и трудоемкой задачей, либо запросить помощь у ОС MS-DOS или системы BIOS.
Для составления собственных программ вам потребуются список процедур ОС MS-DOS и описание способа их использования. Эту информацию можно найти в любом справочном руководстве по ЭВМ, работающей под управлением ОС MS-DOS. Процедуры ОС MS-DOS не зависят от модели используемой вами ЭВМ, а процедуры системы BIOS почти одинаковы для всех ЭВМ, совместимых с IBM PC/XT/AT.
Первая строка программы помещает в регистр AH (старший байт регистра AX) значение, равное 09H. В дальнейшем для вывода строки на экран программа обращается к ОС MS-DOS. Во всех случаях обращения к служебным функциям ОС MS-DOS в регистр AH заносится ее номер, в остальные регистры заносится необходимая системе информация, посте чего вызывается функция ОС MS-DOS. В нашем случае мы используем служебную функцию 9 ОС MS-DOS (изображение строки).
Команда второй строки загружает в регистр DX число 120H. Для вывода строки ОС MS-DOS должна знать ее местонахождение в памяти, поэтому при вызове служебной функции 9 вы должны поместить адрес начала строки в регистры DS и DX. Так как в регистре DS уже находится необходимая информация об используемом программой участке памяти, то вам остается установить значение регистра DX. Значение 120H превышает адрес последней команды программы, следовательно, строку с сообщением удобно поместить по адресу 120H.
Команда третьей строки вызывает ОС MS-DOS и передает ей ваш запрос. Мнемокод INT - это сокращение от английского слова Interrupt - прервать; этот термин отражает способность ЦП прервать работу, реагируя на внешние события. Каждый раз, когда вы нажимаете на клавишу, аппаратные средства клавиатуры прерывают работу ЦП, который приостанавливает такую работу, принимает код нажатой вами клавиши и сохраняет его в буфере клавиатуры. Кроме того, примерно 18 раз за 1с работа ЦП прерывается таймером для изменения счетчика времени ОС MS-DOS.
Прерывания возникают настолько часто, что ЦП необходимо иметь эффективный способ их обработки. Так, каждый представитель семейства микропроцессоров 8088 содержит в ОЗУ таблицу адресов программ обработки прерываний. В ЭВМ, совместимых с IBM PC и XT, предусмотрена обработка девяти типов аппаратных прерываний, и ЦП несложно приостановить выполняемую работу, сохранить значения требуемых регистров, найти адрес соответствующей процедуры обработки прерываний и перейти к ее исполнению. После того как обработка прерывания закончена, дается команда, возвращающая управление прерванной программе, которой обычно нет способа узнать имело ли место прерывание.
Хотя этот процесс и выглядит сложным, на самом деле он выполняется быстро и эффективно. Важно уяснить, что аппаратные средства, вызывающие прерывание, не знают адреса своей обрабатывающей процедуры. Они только должны сообщить ЦП номер своего прерывания. Это позволяет разработчикам ОС MS-DOS и системы ввода-вывода BIOS помещать служебные процедуры в любой участок памяти, требуется только указать в таблице прерываний адреса этих процедур.
В таблице прерываний достаточно места для 256 прерываний с номерами от 0 до 0FFH. Из них жестко закреплены только 16: девять для прерываний от аппаратных средств, семь для прерываний, задающих режим работы самого ЦП. Некоторые из остальных номеров зарезервированы для нужд ОС MS-DOS. Например, большинство служебных функций ОС MS-DOS вызывается командой INT 21. Так как для вызова служебной процедуры ОС MS-DOS вместо указания ее адреса используется прерывание, то у вас нет необходимости запоминать адреса точек входа процедур ОС MS-DOS. Таким образом, создатели ОС MS-DOS могут в разных версиях по-разному размещать в памяти эти процедуры, и при этом у программистов не возникает необходимости переписывать все свои программы.
В последней строке на рис.3 оператор INT 20 используется для завершения программы и передачи управления ОС MS-DOS. Это наилучший способ завершения программ типа .COM, но если вы пишете на языке ассемблера программу типа .EXE, то лучше вместо этого использовать служебную функцию 4CH ОС MS-DOS.
После трансляции первых четырех строк программа готова к исполнению, но строка с сообщением еще не помещена в память. Команда ввода данных Enter программы Debug (вызываемая набором буквы e) позволяет вам занести строку байтов непосредственно в память. Команда
e 120 ...
сообщает Debug, что необходимо поместить следующую информацию в память, начиная с адреса 120H. Последним в тексте строки должен стоять символ доллара, который указывает процедуре изображения строк ОС MS-DOS конец строки. В следующей строке нашей программы записана команда дампа, вызываемая вводом буквы d. По этой команде на экране дисплея изображается содержимое блока памяти. Команда
d 120 l 20
сообщает Debug, что вы хотите посмотреть содержимое 32 (20H) байт ламяти. Программа Debug изображает как шестнадцатеричные значения этих байтов, так и соответствующие им символы в системе ASCII. Команда дампа позволяет проверить правильность заполнения строки и ее адрес.
Для записи вашей программы на диск программа Debug должна знать ее имя и длину. Напомним, что все программы типа .COM начинаются с адреса 100H. Последний байт нашей программы имеет адрес 12CH. Следовательно, программа имеет длину 2DH байт. Для определения длины программы при записи ее на диск Debug использует значение, находящееся в регистре CX, так что в регистр CX следует занести 2DH.
Следующая строка содержит команду объявления имени программы, вызываемую вводом буквы n (от английского слова Name), в нашем случае имени PROGRAM2.COM. Наконец, команда записи, вызываемая вводом буквы w (от слова Write), сообщает программе Debug, что данную программу следует записать на диск. В ответ программа Debug должна сообщить количество записанных байтов. После этого надо закончить работу с программой Debug и возвратиться в ОС MS-DOS. Чтобы убедиться, что длина программы в действительности равна 45 байт (2DH в шестнадцатеричном представлении), наберите команду DIR. Для вызова вашей программы введите PROGRAM2 в ответ на приглашение к вводу, полученное от ОС MS-DOS.
На рис.4 показано, как загрузить вашу программу обратно в программу Debug, чтобы выполнить ее по шагам. Сначала вы должны объявить имя программы с помощью команды Name, а затем загрузить ее командой Load (вызываемой вводом буквы l). Обратите внимание на то, что регистр CX содержит значение 2DH - длину программы.
Рис.4. Проведите трассировку для того, чтобы увидеть, как каждая строка программы, приведенной на рис.3, изменяет содержимое регистров центрального процессора
Выполнение первых двух команд можно проследить с помощью команды Trace, но не пытайтесь проделать трассировку двух вызовов прерываний, это приведет к тому, что вам придется наблюдать выполнение служебной процедуры ОС MS-DOS, что может занять полчаса, а то и больше. Изучение работы служебных процедур ОС MS-DOS требует часов и даже дней кропотливого анализа.
Для исполнения прерываний ОС MS-DOS используйте команду Go (вызываемую вводом буквы g). Первая команда Go содержит адрес следующей команды нашей программы. Используя такой формат команды Go, вы сообщаете программе Debug, что, достигнув этого адреса, следует остановиться и снова вывести содержимое регистров (вторая команда Go не содержит адреса). После этого программа Debug выдает сообщение, что программа завершилась успешно.
Может быть, вам захочется поупражняться в написании программ, выводящих на экран сообщения. Добавив в конец строки байты 0DН и 0AH (проследите за тем, чтобы они стояли вне кавычек), вы добьетесь перехода на начало следующей строки. При работе с Бейсиком вы, вероятно, экспериментировали с оператором PRINT, точно так же при знакомстве с программой Debug вы можете поупражняться в выводе строк с помощью ОС MS-DOS.
...
К сожалению, глава 4 слишком эклектична и совершенно непоследовательна. (Хотя там и нет чего-то принципиально нового по сравнению с книгой Бека). Какой-то сборник рецептов, половина из которых была в те времена неприменима для пользователя из-за того, что его конфигурация ДОС совершенно не соответствовала тому, что описано в книге.
Самое главное: никакого обилия языков программирования на обычном ПК не наблюдалось. Никаких паскалей, си и даже ассемблеров. В стандартную поставку ДОС входил только бейсик, link и lib (на случай, если пользователь сам напишет свой(!) компилятор) и... debug.
Debug - это си для бедных. Т.е. если в ОС UNIX очень много можно было сделать при помощи командных файлов, вставляя в них простенькие заплатки на си, то в ДОС можно было ладить подобные заплатки в debug. Например, Брябрин упоминает очень полезную, но несуществующую программу ASK-CODE. Где ее взять? Оказывается, можно было написать самому.
***
В МИРЕ ПЕРСОНАЛЬНЫХ КОМПЬЮТЕРОВ 2/88
ВВЕДЕНИЕ В ЯЗЫК АССЕМБЛЕРА
ХАРДИН БРОДЕРЗ
Не нужно быть профессионалом, чтобы писать программы на языке ассемблера. Программа Debug позволит вам освоить ассемблер в рекордно короткий срок.
Первым языком программирования был язык ассемблера. Нули и единицы "естественного" машинного языка на языке ассемблера заменяют символами, похожими на английские слова. Когда вы пишете программу на языке ассемблера, то обращаетесь непосредственно к центральному процессору (ЦП), системе ввода-вывода BIOS и операционной системе (ОС) MS-DOS, минуя прикладные программы. Пользуясь языком ассемблера, вы начинаете понимать, что же на самом деле происходит внутри ЭВМ.
У языка ассемблера есть и другие преимущества, которые хорошо известны профессиональным программистам: это быстрый язык - он примерно в 100 раз быстрее Бейсика; ассемблер использует память эффективнее, чем языки высокого уровня, и обычно является наилучшим языком для управления устройствами ввода-вывода, в особенности экраном дисплея. Основной недостаток языка ассемблера - высокая, иногда недопустимо высокая трудоемкость программирования компенсируется при его сочетании с языком высокого уровня. Так, лучшее программное обеспечение совмещает программы, написанные на языке высокого уровня, с подпрограммами, написанными на языке ассемблера.
Как правило, для серьезного программирования на языке ассемблера необходимо приобрести транслятор, обеспечивающий перевод команд в двоичный код, воспринимаемый ЭВМ. К счастью, программа Debug.COM, поставляемая в составе ОС MS-DOS, дает возможность получать доступ к программированию на машинном языке и языке ассемблера, не покупая транслятора. Ниже вы узнаете, как вызвать программу Debug, и познакомитесь с тем, как ЭВМ хранит данные в числовом виде. После этого мы рассмотрим несколько коротких программ, демонстрирующих некоторые концепции, которые применимы и при работе с настоящими трансляторами языка ассемблера.
ЗНАКОМСТВО С ПРОГРАММОЙ DEBUG
Сначала установите на дисковод A диск с ОС MS-DOS и наберите команду DEBUG. Через одну-две секунды на следующей строке появится дефис. Этот дефис является приглашением к вводу программы Debug и указывает на то, что Debug ожидает от вас команды. Команды можно вводить как в нижнем, так и в верхнем регистрах, после набора каждой команды следует нажать клавишу возврата каретки.
Наберите букву R и нажмите клавишу возврата каретки. На экране появятся три строки. Содержание появившегося изображения объясняется на схеме начального вывода программы Debug. Вид этого изображения одинаков для всех компьютеров, хотя некоторые буквы и числа могут варьироваться. (При повторении действий, выполняемых в программах, приведенных в этой статье, вам надо набирать только те символы, которые расположены за приглашением к вводу и адресами ячеек памяти [например, 16BA:0138]. Все остальное - это комментарии или отображение того, что вы должны увидеть на экране).
Введя R, вы предложили программе Debug показать текущее содержимое регистров ЦП. Регистры - это ячейки памяти, находящиеся в ЦП (в отличие от ячеек ОЗУ). Некоторые регистры можно использовать почти для любых целей, другие - имеют специальное назначение.
Центральный процессор тех ЭВМ, которые работают под управлением ОС MS-DOS, имеет 14 встроенных регистров. Каждый регистр содержит 16 бит, или одно слово. Первые четыре регистра (AX, BX, CX и DX) называются регистрами общего значения, и мы достаточно свободны в способе их использования. Кроме того, каждый из этих регистров может быть использован в качестве двух 8-битовых (или байтовых, что одно и то же) регистров. Старший байт регистра AX именуется AH, младший - AL. От вас зависит, в каких случаях использовать эти части памяти в качестве 16-битовых регистров, а в каких - в качестве 8-битовых.
Начальный вывод программы Debug показывает, что содержимое всех регистров общего назначения равно 0000. Такое же значение содержится и в трех регистрах указателей: BP, SI и DI. Регистр указателя базы BP используется в основном в качестве метки, помогающей обрабатывать сложные структура данных, называемые кадрами стека.
Регистры индекса источника SI и индекса приемника DI используются в основном для пересылки содержимого больших блоков памяти, именуемых на языке ассемблера строками, независимо от того, содержат они текстовые данные или нет.
Последний регистр в первом ряду вывода программы Debug - это указатель стека SP. Стек представит собой структуру данных в памяти, имеющую множество назначений. При каждом вызове подпрограммы в стек заносится адрес возврата. Программисты могут использовать стек для временного сохранения содержимого регистров, а иногда и для передачи значений из одной подпрограммы в другую.
Первые четыре регистра второго ряда - это регистры сегментов. Память ЭВМ, работающих под управлением ОС MS-DOS, устроена так, что для адресации ячеек памяти необходимы регистры двух видов: регистры сегментов указывают на болышие блоки памяти, а в одном из других регистров содержится адрес внутри этого блока.
Пятый регистр во втором ряду это указатель команд IP. Этот регистр всегда содержит адрес следующей команды, подлежащей исполнению, подобно тому как в Бейсике всегда хранится номер следующей строки, подлежащей интерпретации и выполнению.
Содержимое всех 13 числовых регистров приведено в шестнадцатеричном виде. При программировании на языке ассемблера редко пользуются десятичными числами, в основном числа записывают в двоичном (по основанию 2) или в шестнадцатеричном (по основанию 16) виде.
В конце второй строки начального вывода программы Debug показаны восемь двухбуквенных кодов, отображающих состояние значащих битов регистра флагов состояния (см. таблицу флагов состояния). Для фиксации состояний этих флагов в ЦП имеется специальный 16-битовый регистр. Состояния флагов изменяются в результате выполнения многих команд языка ассемблера и могут быть проверены для того, чтобы установить, следует ли передать управление новой группе команд.
Все проверки выполнения условий на языке ассемблера производятся на основании состояний соответствующих флагов. Например, флаг нуль может поменять значение с NZ на ZR; это показывает, что результат выполнения арифметической операции равен нулю. Не все биты регистра являются значащими.
РЕЖИМ ВЫВОДА НА ЭКРАН
Пока что вы только наблюдали, но не программировали. Перед тем как написать простую программу, вам необходимо познакомиться еще с одной командой программы Debug. Если вы наберете на клавиатуре букву R, то программа Debug покажет вам начальное состояние регистров. Если же вы наберете букву R и укажете за ней имя регистра, то программа Debug покажет содержимое этого регистра и позволит вам занести в него новое значение.
Например, если вы наберете
rax
то программа Debug выведет на экран AX 0000 в первой строке и двоеточие во второй. Если вы введете 1111, то программа Debug заменит значение регистра AX на 1111H (в данной статье мы используем суффикс H для обозначения шестнадцатеричной записи числа). Помните, что для ввода и вывода чисел программа Debug использует шестнадцатеричную систему счисления.
Для набора команды на языке ассемблера введите букву A. В ответ на это программа Debug выведет на экран четырехзначное число, двоеточие и 0100. Появится курсор без приглашения к вводу, после чего можно вводить операторы вашей программы.
Выведенные числа показывают сегмент и смещение адреса текущей ячейки памяти. Адреса сегментов, которые вы увидите на экране, скорее всего будут отличаться от приведенных на рисунках, так как они зависят от используемой версии ОС MS-DOS, наличия резидентных программ, виртуальных дисков или программ буферизации печати. Число, стоящее за двоеточием, называется смещением и должно быть равно 0100. Все программы типа .COM начинаются с относительного адреса 100H, а программа Debug может создавать только программы типа .COM. Если смещение не равно 0100, то нажмите клавишу возврата каретки и наберите
a 100
Теперь размещение команд языка ассемблера начнется с адреса 0100H. Наша первая программа будет чрезвычайно простой. Наберите три строки операторов, показанные на рис.1. Чтобы поля операторов располагались в столбик, используйте клавишу табуляции; после набора каждой строки следует нажимать на клавишу возврата каретки. Нажмите клавишу возврата каретки еще раз: вы должны снова получить на экране дефис - приглашение к вводу программы Debug. Для проверки выполненной вами работы введите команду
u 100 l 7
По этой команде Debug "ретранслирует" содержимое семи байтов с начальным адресом 100H (буква l - это сокращение слова Length - длина). На экране должно появиться изображение, показанное в нижней части рис. 1. Введите r для вывода содержимого регистров. Появившееся на экране изображение содержимого регистров должно совпадать с изображением, полученным вначале, за тем исключением, что в последней строке будет стоять первая команда вашей программы.
Рис.1. Введите три строки команд программы, которые расположены на рисунке ближе к центру. Эта простая программа показывает, как использовать общеупотребительные команды MOV и ADD языка ассемблера
ОСНОВНЫЕ ПОНЯТИЯ
Каждая строка программы на языке ассемблера, написанной с помощью программы Debug, состоит из двух частей. Первая часть строки всегда содержит имя команды, состоящее из двух, трех или четырех букв. Эти имена называют мнемокодами, так как они соответствуют в точности одной команде ЦП и их проще запомнить, чем последовательность двоичных чисел. Иногда их называют кодами операций, так как они представляют операции центрального процессора.
За кодом операции следуют один или два (или не следует ни одного) операнда. Число операндов зависит от конкретных команды и типа используемых ею данных. В конце строки можно поставить точку с запятой и написать комментарий.
Первым в программе идет код операции MOV, получивший свое имя от слова move (переслать). Это один из наиболее часто употребляемых мнемокодов, встречающихся в программах на языке ассемблера. Он используется для пересылки данных в регистры, в память, из регистра в регистр, из регистра в память, и наоборот. Строго говоря, название команды некорректно, так как она только КОПИРУЕТ данные из одного места в другое и подобно оператору Бейсика LET не изменяет значения операнда-источника.
За кодом операции MOV всегда следуют два операнда: источник и приемник. Первая строка на рис.1 сообщает ЦП: "Переслать в регистр AX значение, равное 1". Аналогичным образом вторая строка загружает значение 2 в регистр BX. Эти две строки подобны операторам Бейсика
AX=1: BX=2
Наверное, нетрудно понять, что третья строка содержит команду сложения (add означает "сложить"). Ответ на вопросы, откуда берутся операнды и куда записывается результат, не столь очевиден. Не поддавайтесь соблазну прочитать эту строку как "сложить значения AX и BX". Правильно читать эту строку как "увеличить значение регистра AX на значение регистра BX". Такое чтение команды поможет вам запомнить ее результат: значение в регистре BX складывается со значением в регистре AX, и результат остается в регистре AX. Эта строка аналогична оператору Бейсика
AX=AX+BX
Одно из достоинств программы Debug заключается в том, что она позволяет шаг за шагом проследить за выполнением составленной программы. Введите три раза букву t (первую букву имени команды трассировки Trace) и проследите за содержимым регистров AX и BX. Команда Trace указывает программе Debug, что следует выполнить команду вашей программы и снова выдать содержимое регистров. Это позволит вам наблюдать загрузку значений в регистры и занесение конечного результата в регистр AX. На вашем экране должно появиться изображение, похожее на то, что показано на рис.2.
Рис.2. Введя команду Trace программы Debug, вы увидите, как каждая строка программы, приведенной на рис.1, изменяет содержимое регистра центрального процессора
ЗАПИСЬ НА ДИСК И ИСПОЛНЕНИЕ ПРОГРАММЫ
Хотя наша первая программа и не дает интересных результатов, она позволяет понять элементы изображения содержимого регистров с помощью программы Debug, трансляции и ретрансляции программы на языке ассемблера, трассировки программы, демонстрирующей ход ее исполнения. Чтобы с помощью программы Debug создать свою программу, вам нужно научиться записывать ее на диск так, чтобы можно было инициировать ее выполнение после выхода на приглашение к вводу ОС MS-DOS.
С помощью простой программы, приведенной на рис.3, мы познакомим вас с некоторыми новыми понятиями. Сначала вам надо удалить свою программу из памяти программы Debug. Для этого введите букву q, чтобы завершить работу с программой Debug; затем в ответ на приглашение к вводу ОС MS-DOS введите DEBUG.
Рис.3. Эта программа демонстрирует сохранение программы на языке ассемблера на диске и вызов ОС MS-DOS
Очень важно уметь перемещать данные в регистрах, но эти действия не дают наглядных результатов. Напротив, программа на рис.3 выдает на экран сообщение: "Приветствую!". Работа с этой программой научит вас двум приемам: записи программ на диск и общению с ОС MS-DOS.
Центральный процессор ничего не знает о подключенных экранах дисплеев, клавиатурах и принтерах. Для выполнения функций ввода-вывода программа должна либо управлять аппаратными средствами компьютера непосредственно, что является сложной и трудоемкой задачей, либо запросить помощь у ОС MS-DOS или системы BIOS.
Для составления собственных программ вам потребуются список процедур ОС MS-DOS и описание способа их использования. Эту информацию можно найти в любом справочном руководстве по ЭВМ, работающей под управлением ОС MS-DOS. Процедуры ОС MS-DOS не зависят от модели используемой вами ЭВМ, а процедуры системы BIOS почти одинаковы для всех ЭВМ, совместимых с IBM PC/XT/AT.
Первая строка программы помещает в регистр AH (старший байт регистра AX) значение, равное 09H. В дальнейшем для вывода строки на экран программа обращается к ОС MS-DOS. Во всех случаях обращения к служебным функциям ОС MS-DOS в регистр AH заносится ее номер, в остальные регистры заносится необходимая системе информация, посте чего вызывается функция ОС MS-DOS. В нашем случае мы используем служебную функцию 9 ОС MS-DOS (изображение строки).
Команда второй строки загружает в регистр DX число 120H. Для вывода строки ОС MS-DOS должна знать ее местонахождение в памяти, поэтому при вызове служебной функции 9 вы должны поместить адрес начала строки в регистры DS и DX. Так как в регистре DS уже находится необходимая информация об используемом программой участке памяти, то вам остается установить значение регистра DX. Значение 120H превышает адрес последней команды программы, следовательно, строку с сообщением удобно поместить по адресу 120H.
Команда третьей строки вызывает ОС MS-DOS и передает ей ваш запрос. Мнемокод INT - это сокращение от английского слова Interrupt - прервать; этот термин отражает способность ЦП прервать работу, реагируя на внешние события. Каждый раз, когда вы нажимаете на клавишу, аппаратные средства клавиатуры прерывают работу ЦП, который приостанавливает такую работу, принимает код нажатой вами клавиши и сохраняет его в буфере клавиатуры. Кроме того, примерно 18 раз за 1с работа ЦП прерывается таймером для изменения счетчика времени ОС MS-DOS.
Прерывания возникают настолько часто, что ЦП необходимо иметь эффективный способ их обработки. Так, каждый представитель семейства микропроцессоров 8088 содержит в ОЗУ таблицу адресов программ обработки прерываний. В ЭВМ, совместимых с IBM PC и XT, предусмотрена обработка девяти типов аппаратных прерываний, и ЦП несложно приостановить выполняемую работу, сохранить значения требуемых регистров, найти адрес соответствующей процедуры обработки прерываний и перейти к ее исполнению. После того как обработка прерывания закончена, дается команда, возвращающая управление прерванной программе, которой обычно нет способа узнать имело ли место прерывание.
Хотя этот процесс и выглядит сложным, на самом деле он выполняется быстро и эффективно. Важно уяснить, что аппаратные средства, вызывающие прерывание, не знают адреса своей обрабатывающей процедуры. Они только должны сообщить ЦП номер своего прерывания. Это позволяет разработчикам ОС MS-DOS и системы ввода-вывода BIOS помещать служебные процедуры в любой участок памяти, требуется только указать в таблице прерываний адреса этих процедур.
В таблице прерываний достаточно места для 256 прерываний с номерами от 0 до 0FFH. Из них жестко закреплены только 16: девять для прерываний от аппаратных средств, семь для прерываний, задающих режим работы самого ЦП. Некоторые из остальных номеров зарезервированы для нужд ОС MS-DOS. Например, большинство служебных функций ОС MS-DOS вызывается командой INT 21. Так как для вызова служебной процедуры ОС MS-DOS вместо указания ее адреса используется прерывание, то у вас нет необходимости запоминать адреса точек входа процедур ОС MS-DOS. Таким образом, создатели ОС MS-DOS могут в разных версиях по-разному размещать в памяти эти процедуры, и при этом у программистов не возникает необходимости переписывать все свои программы.
В последней строке на рис.3 оператор INT 20 используется для завершения программы и передачи управления ОС MS-DOS. Это наилучший способ завершения программ типа .COM, но если вы пишете на языке ассемблера программу типа .EXE, то лучше вместо этого использовать служебную функцию 4CH ОС MS-DOS.
После трансляции первых четырех строк программа готова к исполнению, но строка с сообщением еще не помещена в память. Команда ввода данных Enter программы Debug (вызываемая набором буквы e) позволяет вам занести строку байтов непосредственно в память. Команда
e 120 ...
сообщает Debug, что необходимо поместить следующую информацию в память, начиная с адреса 120H. Последним в тексте строки должен стоять символ доллара, который указывает процедуре изображения строк ОС MS-DOS конец строки. В следующей строке нашей программы записана команда дампа, вызываемая вводом буквы d. По этой команде на экране дисплея изображается содержимое блока памяти. Команда
d 120 l 20
сообщает Debug, что вы хотите посмотреть содержимое 32 (20H) байт ламяти. Программа Debug изображает как шестнадцатеричные значения этих байтов, так и соответствующие им символы в системе ASCII. Команда дампа позволяет проверить правильность заполнения строки и ее адрес.
Для записи вашей программы на диск программа Debug должна знать ее имя и длину. Напомним, что все программы типа .COM начинаются с адреса 100H. Последний байт нашей программы имеет адрес 12CH. Следовательно, программа имеет длину 2DH байт. Для определения длины программы при записи ее на диск Debug использует значение, находящееся в регистре CX, так что в регистр CX следует занести 2DH.
Следующая строка содержит команду объявления имени программы, вызываемую вводом буквы n (от английского слова Name), в нашем случае имени PROGRAM2.COM. Наконец, команда записи, вызываемая вводом буквы w (от слова Write), сообщает программе Debug, что данную программу следует записать на диск. В ответ программа Debug должна сообщить количество записанных байтов. После этого надо закончить работу с программой Debug и возвратиться в ОС MS-DOS. Чтобы убедиться, что длина программы в действительности равна 45 байт (2DH в шестнадцатеричном представлении), наберите команду DIR. Для вызова вашей программы введите PROGRAM2 в ответ на приглашение к вводу, полученное от ОС MS-DOS.
На рис.4 показано, как загрузить вашу программу обратно в программу Debug, чтобы выполнить ее по шагам. Сначала вы должны объявить имя программы с помощью команды Name, а затем загрузить ее командой Load (вызываемой вводом буквы l). Обратите внимание на то, что регистр CX содержит значение 2DH - длину программы.
Рис.4. Проведите трассировку для того, чтобы увидеть, как каждая строка программы, приведенной на рис.3, изменяет содержимое регистров центрального процессора
Выполнение первых двух команд можно проследить с помощью команды Trace, но не пытайтесь проделать трассировку двух вызовов прерываний, это приведет к тому, что вам придется наблюдать выполнение служебной процедуры ОС MS-DOS, что может занять полчаса, а то и больше. Изучение работы служебных процедур ОС MS-DOS требует часов и даже дней кропотливого анализа.
Для исполнения прерываний ОС MS-DOS используйте команду Go (вызываемую вводом буквы g). Первая команда Go содержит адрес следующей команды нашей программы. Используя такой формат команды Go, вы сообщаете программе Debug, что, достигнув этого адреса, следует остановиться и снова вывести содержимое регистров (вторая команда Go не содержит адреса). После этого программа Debug выдает сообщение, что программа завершилась успешно.
Может быть, вам захочется поупражняться в написании программ, выводящих на экран сообщения. Добавив в конец строки байты 0DН и 0AH (проследите за тем, чтобы они стояли вне кавычек), вы добьетесь перехода на начало следующей строки. При работе с Бейсиком вы, вероятно, экспериментировали с оператором PRINT, точно так же при знакомстве с программой Debug вы можете поупражняться в выводе строк с помощью ОС MS-DOS.
...
Gudleifr- Admin
- Сообщения : 3403
Дата регистрации : 2017-03-29
Re: Брябрин. Программное обеспечение персональных ЭВМ. 1990
...
ОРГАНИЗАЦИЯ ЦИКЛА
В программировании почти каждая задача имеет более одного решения. На рис.5 приведены три способа организации цикла, в котором 20 раз выводится одна и та же строка.
Рис.5. Три приведенные на рисунке программы используют разные команды языка ассемблера для организации одного и того же цикла. Все три программы используют цикл для того, чтобы напечатать строку 20 раз
Программа начинается с команды перехода JMP по адресу 130H. Так как эта команда занимает два байта, то в начале программы остается достаточно места для строки длиной до 42 символов, а также символов возврата каретки, пропуска строки и признака конца. Вместо приведенной на рис.5 строки можно набрать любое сообщение, содержащее не более 42 символов.
За JMP идет команда ввода данных Enter, которая несколько отличается от примененной в предыдущей программе. Приведенные на рис.5 программы выводят сообщение на экран 20 раз, каждый раз с новой строки. Следует сообщить MS-DOS, что к строке следует присоединить символы возврата каретки и пропуска строки. В системе ASCII возврату каретки соответствует код 13 (0DH), а пропуску строки - код 10 (0AH). По команде Enter программа Debug вводит текст сообщения, байт 0DH, байт 0AH и символ доллара, которым согласно правилам ОС MS-DOS должна оканчиваться строка.
Начальные строки рис.5 используются во всех трех циклах программы. Команда
а 130
сообщает программе Debug, что трансляцию следует начать с адреса 130H. Напомним, что именно этот адрес указан в команде JMP в начале программы.
В первом цикле в регистр DX загружается адрес строки, в регистр AH загружается номер служебной функции ОС MS-DOS. Как и ранее, вызов функции вывода строки осуществляется командой прерывания INT 21. Следующая команда программы, LOOP 138, использует специальный механизм организации цикла, встроенный в ЦП, Команда LOOP сообщает ЦП, что следует уменьшить значение регистра CX на 1; если после этого значение CX не равно нулю, то перейти по адресу, указанному в команде; если оно равно нулю, то перейти к выполнению следующей команды. Другими словами, команда loop программы Debug аналогична оператору Бейсика Next.
Вторая версия программы использует иную технику организации цикла. На этот раз счетчик цикла загружается в регистр BX (с равным успехом можно использовать регистры CX, SI, DI или BP). В конце цикла команда
dec bx
указывает ЦП, что значение регистра BX следует уменьшить на 1. Цикл должен продолжаться до тех пор, пока значение регистра BX не станет равным 0. В этот момент программа устанавливает флаг нуля. Команда
jnz 138
указывает ЦП, что следует перейти по адресу 138H, если только не установлен флаг нуля. Так как флаг нуля будет установлен только тогда, когда значение регистра BX станет равным нулю, то цикл выполнится равно 20 раз. Эти две строки аналогичны операторам Бейсика
BX=BX-1: IF BX<>0 THEN GOTO 138
К достоинствам такой структуры цикла можно отнести то, что ее можно вложить в цикл, управляемый регистром CX.
В последней версии цикла используются команды другого типа. Счетчик цикла опять загружается в регистр CX, но на этот раз значение счетчика уменьшается в конце цикла. Команда
jcxz 13f
сообщает ЦП, что следует перейти по адресу 13FH, если регистр CX содержит 0; в противном случае выполнить следующую команду. Следующая строка содержит команду безусловного перехода на начало цикла.
Три строки, контролирующие окончание цикла в третьем примере, похожи на операторы Бейсика
CX=CX-1: IF CX=0 THEN GOTO 13F ELSE GOTO 138
Команда JCXZ (перейти, если значение регистра СХ равно нулю) часто используется при организации циклов сложной структуры для проверки условия завершения цикла внутри его тела.
После того как вы оттранслировали программы, убедитесь, что они дают правильные результаты: исполните их после выхода на приглашение к вводу ОС MS-DOS. Если вы обнаружите ошибки, то выполните трассировку программ (помните, что при трассировке для исполнения команды INT следует воспользоваться командой Go).
Возможно, вас разочарует скорость выполнения этих трех программ. Считается, что программы, написанные на языке ассемблера, должны выполняться быстро, а эти программы выполняются не быстрее команды Бейсика Print. Это происходит потому, что ОС MS-DOS выводит строки посимвольно, проверяя после ввода каждого символа состояние клавиатуры, выясняя, не нажали ли вы клавишу Ctrl-Break или Ctrl-C для остановки программы. Большинство коммерческих программ не использует для вывода функции дисплея ОС MS-DOS из-за их медленного выполнения.
ПОЛЕЗНО ЗНАТЬ...
Программа, приведенная на рис.6, значительно длиннее предыдущих программ, однако у вас не должно возникнуть особых затруднений при ее разборе. Она использует несколько новых служебных функций ОС MS-DOS и одну функцию системы BIOS.
Рис.6. С помощью программы Debug мы создаем программу на языке ассемблера, которая использует функции ОС MS-DOS и BIOS для установки новых атрибутов изображения
Эта программа запрашивает у вас две шестнадцатеричные цифры и интерпретирует их как атрибуты экрана. После этого она стирает содержимое экрана, устанавливает новый атрибут и возвращает управление ОС MS-DOS. Эти атрибуты действительны до тех пор, пока другая программа их не изменит.
Управлять экраном дисплея можно, изменяя значения битов байта, задающего режим изображения каждого символа. Он называется байтом атрибута изображения и расположен в памяти непосредственно перед байтом, содержащим код символа. Оба эти байта хранятся в особом участке ОЗУ, отведенном для операций с экраном.
Программа на рис.6 запрашивает ввод значения байта атрибута в шестнадцатеричном виде. Если вы используете цветной монитор, то в приведенной ниже таблице вы найдете трехбитовый код цветов символа и фона. Поместите коды цветов в соответствующие места в байте, содержимое которого показано на рисунке.
Для установки мигания или повышенной интенсивности свечения соответствующий бит должен быть равен 1, а для отмены этих режимов - 0. После установки значений битов значение байта следует перевести в шестнадцатеричную форму. Для адаптеров монохроматического графического дисплея значение 000 соответствует черному цвету, а 111 - белому. Большинство других значений соответствует серому цвету различной интенсивности. Если значение кода цвета для фона равно 100, то символы будут выводиться подчеркнутыми.
При работе с адаптерами цветных мониторов возможны следующие цвета:
Черный - 000
Синий - 001
Зеленый - 010
Голубой - 011
Красный - 100
Пурпурный - 101
Коричневый - 110
Светло-серый - 111
Установив бит интенсивности свечения, мы получим вместо черного цвета темно-серый, вместо коричневого - желтый, а вместо светло-серого - белый.
При написании подобных программ с помощью программы Debug сначала следует наметить структуру программы и адреса ее разделов. Поскольку необходимо знать адреса команд еще не написанной программы, то вы должны оценить длину каждого раздела. Хотя при этом и останутся неиспользованные участки памяти, программа установки атрибутов экрана займет на диске всего 193 байт, что меньше минимального количества 1024 байт, отводимого ОС MS-DOS для дисковых файлов. Таким образом, вам не следует беспокоиться об экономии байтов.
В верхней части рис.6 описана структура программы. Программа выводит на экран приглашение к вводу, ожидает ввода пользователем двух шестнадцатеричных цифр и символа возврата каретки, очищает экран, устанавливает требуемые атрибуты и на этом заканчивает свою работу. Программа разбита на блоки, а каждая ее строка снабжена комментарием, так что вы можете проследить шаг за шагом за выполняемыми программой действиями.
Первая команда программы расположена по адресу 100H. Эта команда вызывает служебную функцию 9 ОС MS-DOS для вывода на экран дисплея приглашения к вводу. Затем для ввода символа с клавиатуры и отображения его на экране программа вызывает служебную функцию 1 ОС MS-DOS (начальный адрес этой команды - 107H). Пользователь видит на экране вводимые символы, но не может воспользоваться клавишей возврата и редактировать их.
Служебная функция 1 помещает введенный с клавиатуры символ в регистр AL. Затем, используя команду Call с адресом 10BH, программа передает управление подпрограмме. Команда Call программы Debug во многом напоминает оператор Бейсика Gosub, при выполнении этой команды текущий адрес программы записывается в стек и управление передается подпрограмме. После того как подпрограмма заканчивает работу, она возвращает управление в основную программу с помощью команды RET, аналогичной оператору Бейсика Return.
Подпрограмма, которая будет описана чуть позже, либо переводит введенный с клавиатуры символ в шестнадцатеричное число, либо, если этот символ не лежит в установленном диапазоне, устанавливает в регистре флагов флаг переноса. Так как флаг переноса легко устанавливать и проверять, то программисты часто используют его для передачи между подпрограммами информации об успешном или ошибочном завершении выполнения. В строке, следующей за командой Call, стоит команда JC (передать управление, если установлен флаг переноса).
Как правило, значения флагов проверяются для того, чтобы в зависимости от состояния одного или нескольких битов регистра флагов передать управление определенным разделам программы. Эти условные переходы похожи на оператор Бейсика IF ... THEN GOTO. В языке ассемблера около 30 видов команд условного перехода. Многие из имен этих команд являются синонимами, поэтому не волнуйтесь, если при трассировке программы вам покажется, что программа Debug изменила команду перехода.
Если флаг переноса не установлен, то это означает, что подпрограмма перевода символов кода ASCII завершилась успешно и в регистр AL занесено шестнадцатеричное значение от 00H до 0FH, зависящее от нажатой клавиши. Так как это первая из двух шестнадцатеричных цифр, вводимых пользователем, то в действительности нам нужно значение от 00H до 0F0H, т.е. программа должна сдвинуть полученное значение из нижней половины байта в верхнюю.
Этот сдвиг можно выполнить двумя способами: либо умножить значение байта на 10H, либо сдвинуть каждый бит на четыре позиции влево. Второй метод быстрее и проще.
Команда с адресом 110H помещает число сдвигаемых битов (4) в регистр CL. В следующей строке команда
shl al,cl
сообщает ЦП, что необходимо сдвинуть влево значение регистра AL на число позиций, равное значению регистра CL. На каждом шаге этой процедуры текущее значение флага переноса заменяется на значение крайнего левого бита операнда (которым в нашем случае является регистр AL), остальные биты операнда сдвигаются на одну позицию влево, а в крайний правый бит операнда заносится нуль. Эта процедура не так сложна, как может показаться. Каждый сдвиг влево эквивалентен умножению на 2, а суммарный сдвиг на четыре позиции влево - это умножение на 2**4, т.е. на 16.
После сдвига значение регистра AL загружается в регистр BH. Причина, по которой выбран именно этот регистр, будет объяснена позже.
Ни одна из выполненных до сих пор команд не изменила начального значения регистра AH, равного 1. Это позволяет программе запросить ввод следующего символа с клавиатуры с помощью еще одного вызова INT 21. Для обработки символа программа снова вызывает подпрограмму преобразования символа и проверяет успешность ее завершения по флагу переноса.
Если подпрограмма преобразования символа не выдает сообщения об ошибке, то новое значение AL (от 00H до 0FH) складывается со значением, находящимся в BH. И наконец, третий символ клавиатуры, который должен быть символом возврата каретки, вводится командой вызова служебной функции 1 ОС MS-DOS. Эта команда имеет адрес 11FH. После этого программа использует команду СМР с адресом 121H для того, чтобы сравнить значение AL с кодом возврата каретки. В следующей строке еще одна команда условного перехода JNE (перейти, если не равно) передает управление в начало программы при условии, что пользователь не ввел символа возврата каретки.
Если программа дошла до адреса 125H, то это означает, что пользователь ввел две шестнадцатеричные цифры и символ возврата каретки, программа перевела эти цифры в двоичное представление и записала их в регистр BH. Теперь настал с время стереть содержимое экрана и установить новые атрибуты.
В ОС MS-DOS нет служебных функций, стирающих содержимое экрана, устанавливающих новые атрибуты или положение курсора. Если вы используете драйвер консоли ANSI.SYS ОС MS-DOS, то можно набрать специальные последовательности символов, инициирующих такие действия, но они как правило, выполняются медленно и не работают без установки файла ANSI.SYS. На всех ЭВМ, совместимых с IBM PC/XT/AT, команда INT 10 вызывает одну из процедур системы BIOS, хранящихся в ПЗУ и управляющих экраном, изменяющих режимы, положение курсора, выводящих на экран символы псевдографики и т.д.
Вызываемая по команде INT 10 служебная функция 6 прокручивает на заданное число строк любой активный участок экрана (точно так же служебная функция 7 прокручивает участок вниз). Для вызова этой функции следует поместить номер (6) в регистр AH, загрузить число строк, на которое требуется выполнить прокрутку, в регистр AL, занести в регистры CX и DX координаты левого верхнего и правого нижнего углов прокручиваемого окна и поместить в регистр BH устанавливаемые атрибуты. Так как наша программа уже занесла значения атрибутов в регистр ВН, то это действие мы опускаем.
По команде с адресом 125H программа помещает нуль в регистр AL, чтобы указать на то, что окне должно быть очищено целиком. Команда загрузки нуля в регистр CX (адрес 127H) эквивалентна команде загрузки нулей в регистры CH и CL, это указывает системе BIOS, что верхний левый угол окна находится в нулевом столбце нулевой строки (номера строк и столбцов экрана всегда начинаются с нуля, а не с единицы). Поместив в регистры DH и DL значения, равные 18H (24 в десятичном виде) и 4FH (79 в десятичном виде) соответственно, вы укажете, что нижний угол окна находится в 79-м столбце 24-й строки. Вместо двух команд, заносящих эти значения, в программе используется одна команда
mov dx,184F
Наконец, программа помещает в регистр АН номер служебной функции и вызывает прерывание командой INT 10.
Вызванная этой командой служебная функция системы BIOS стирает содержимое экрана, используя для этого символы пробелов и новый байт атрибута в регистре BH. Однако она не перемещает курсора в левый верхний угол экрана; вы еще не завершили ассемблерный эквивалент команды очистки экрана CLS языка Бейсик.
Положением курсора управляет служебная функция 2 системы BIOS. Для ее вызова программа должна поместить в регистры DH и DL значения, указывающие положение курсора, записать номер страницы экрана в регистр ВН и номер служебной функции (2) в регистр AH. Программа заносит в регистр DX нулевое значение, так как мы хотим, чтобы курсор находился в левом верхнем углу. Если только предыдущая программа не изменила состояния видеопамяти, то текущее значение номера страницы экрана равно нулю и это значение программа на рис.6 заносит в регистр BH. После этого она снова вызывает прерывание INT 10 для того, чтобы перевести курсор в начало экрана. Последним действием мы возвращаем управление ОС MS-DOS с помощью команды INT 20.
ПРЕОБРАЗОВАНИЕ ЧИСЛА
Оставшаяся часть программы в основном занята преобразованием набранного на клавиатуре символа а шестнадцатеричную цифру. Например, если пользователь нажимает клавишу 5, то в регистр AL будет занесено значение 35H, которое в системе ASCII соответствует символу 5. Для того чтобы перевести 35H в 05H, необходима подпрограмма, которая должна также проверять, что пользователь ввел допустимую шестнадцатеричную цифру.
Подпрограмма, выполняющая эти действия, начинается с адреса 150H. Она открывается серией проверок и условных переходов. Если содержимое регистра AL меньше 30H, то это означает, что оно не является допустимой шестнадцатеричной цифрой. Если же оно лежит в пределах от 30H до 39Н включительно, то соответствует десятичной цифре и в этом случае может быть переведено непосредственно в двоичную цифру. Команда JB (перейти, если меньше) с адресом 152H означает "передать управление, если при последней проверке левый операнд оказался меньше правого". Команда JBE, стоящая двумя строками ниже, означает "перейти, если значение оказалось меньшим или равным".
Если код набранного на клавиатуре символа не лежит между значениями 0 и 9, то он может соответствовать букве алфавита, которая могла быть набрана как на верхнем, так и на нижнем регистрах. Если вы посмотрите на таблицу символов системы ASCII, то увидите, что коды букв верхнего и нижнего регистров отличаются значением одного бита: пятый бит равен 1 в нижнем регистре и 0 - в верхнем. Команда с адресом 158H
and al,df
использует логическую операцию И для принудительного обнуления пятого бита. Аналогичный прием применяется в Бейсике, где для этого часто используют выражения типа
CH$=CHR$(ASC(CH$) AND &HDF)
После этого программа выполняет еще два теста для проверки того, что символ клавиатуры, код которого содержится в регистре AL, действительно лежит между символами A и F. Если это так, то, перед тем как передать управление по адресу 170H, программа увеличивает значение кода символа на 9. Смысл этого трюка заключается в следующем. В коде ASCII символам A-F соответствуют значения 41H-45H. Прибавляя к ним 9, мы переводим эти значения в диапазон 4АН-4FH и получаем правильное значение второй цифры.
Если символ является допустимым, то в регистре AL теперь находится значение, лежащее в диапазоне 30H-39H или 4AH-4FH. Нам необходимо получить значение в диапазоне 00H-0FH, для этого достаточно обнулить первую половину байта, что и выполняет команда And, расположенная по адресу 170H. После этого команда CLC обнуляет флаг переноса, а команда RET возвращает управление основной программе.
Если пользователь ввел недопустимый символ, то программа передаст управление по адресу 180H, где командой STC (установить флаг переноса) устанавливается флаг переноса, а затем управление возвращается основной программе. Все, что нам осталось сделать, это поместить в память нужное приглашение к вводу с помощью команды ввода данных программы Debug, вывести на экран содержимое блока памяти для того, чтобы выяснить длину программы, а затем сохранить программу на диске. (Так как приглашение к вводу начинается с символов возврата каретки и пропуска строки, то оно всегда выводится с новой строки, даже если пользователь допустит ошибку и программа начнет выполняться сначала).
После сохранения программы вам наверняка захочется вернуться в ОС MS-DOS и исполнить эту программу. Если в результате исполнения программы вы обнаружите ошибки, то снова вызовите программу Debug, загрузите свою программу и проведите ее трассировку (помните, что нельзя трассировать вызовы прерываний). Отладка и трассировка - необходимые элементы процесса написания программ на языке ассемблера, так как почти невозможно избежать ошибок в первом варианте текста программы.
ЧТО ДАЛЬШЕ?
Если вам понравилось это краткое введение в язык ассемблера, то вам, наверное, захочется попробовать свои силы в составлении более сложных программ и изучить полную систему команд ЦП. Для этого вам потребуется документация по служебным функциям ОС MS-DOS и прерываниям системы BIOS, а также полный список команд центрального процессора. Существует много хороших книг по языку ассемблера, где можно найти и то, и другое.
Скорее всего вас перестанут удовлетворять возможности программы DEBUG.COM, и вам захочется пользоваться более мощным транслятором и лучшими средствами трассировки. Стандартным транслятором который к тому же чаще всего используется в журнальных статьях, является макроассемблер MASM фирмы Microsoft. Последние версии макроассемблера MASM содержат программу SYMDEB, которая является большим шагом вперед по сравнению с программой DEBUG.COM.
Лучше всего учиться, упражняясь с короткими программами. Вы обнаружите, что программу на языке ассемблера, содержащую хорошие комментарии, читать не сложнее, чем программу той же длины на языке высокого уровня. Программируя на языке ассемблера вы будете лучше понимать устройство ЭВМ, что сделает вас более искусным программистом независимо от того, какой язык высокого уровня вы используете.
ОРГАНИЗАЦИЯ ЦИКЛА
В программировании почти каждая задача имеет более одного решения. На рис.5 приведены три способа организации цикла, в котором 20 раз выводится одна и та же строка.
Рис.5. Три приведенные на рисунке программы используют разные команды языка ассемблера для организации одного и того же цикла. Все три программы используют цикл для того, чтобы напечатать строку 20 раз
Программа начинается с команды перехода JMP по адресу 130H. Так как эта команда занимает два байта, то в начале программы остается достаточно места для строки длиной до 42 символов, а также символов возврата каретки, пропуска строки и признака конца. Вместо приведенной на рис.5 строки можно набрать любое сообщение, содержащее не более 42 символов.
За JMP идет команда ввода данных Enter, которая несколько отличается от примененной в предыдущей программе. Приведенные на рис.5 программы выводят сообщение на экран 20 раз, каждый раз с новой строки. Следует сообщить MS-DOS, что к строке следует присоединить символы возврата каретки и пропуска строки. В системе ASCII возврату каретки соответствует код 13 (0DH), а пропуску строки - код 10 (0AH). По команде Enter программа Debug вводит текст сообщения, байт 0DH, байт 0AH и символ доллара, которым согласно правилам ОС MS-DOS должна оканчиваться строка.
Начальные строки рис.5 используются во всех трех циклах программы. Команда
а 130
сообщает программе Debug, что трансляцию следует начать с адреса 130H. Напомним, что именно этот адрес указан в команде JMP в начале программы.
В первом цикле в регистр DX загружается адрес строки, в регистр AH загружается номер служебной функции ОС MS-DOS. Как и ранее, вызов функции вывода строки осуществляется командой прерывания INT 21. Следующая команда программы, LOOP 138, использует специальный механизм организации цикла, встроенный в ЦП, Команда LOOP сообщает ЦП, что следует уменьшить значение регистра CX на 1; если после этого значение CX не равно нулю, то перейти по адресу, указанному в команде; если оно равно нулю, то перейти к выполнению следующей команды. Другими словами, команда loop программы Debug аналогична оператору Бейсика Next.
Вторая версия программы использует иную технику организации цикла. На этот раз счетчик цикла загружается в регистр BX (с равным успехом можно использовать регистры CX, SI, DI или BP). В конце цикла команда
dec bx
указывает ЦП, что значение регистра BX следует уменьшить на 1. Цикл должен продолжаться до тех пор, пока значение регистра BX не станет равным 0. В этот момент программа устанавливает флаг нуля. Команда
jnz 138
указывает ЦП, что следует перейти по адресу 138H, если только не установлен флаг нуля. Так как флаг нуля будет установлен только тогда, когда значение регистра BX станет равным нулю, то цикл выполнится равно 20 раз. Эти две строки аналогичны операторам Бейсика
BX=BX-1: IF BX<>0 THEN GOTO 138
К достоинствам такой структуры цикла можно отнести то, что ее можно вложить в цикл, управляемый регистром CX.
В последней версии цикла используются команды другого типа. Счетчик цикла опять загружается в регистр CX, но на этот раз значение счетчика уменьшается в конце цикла. Команда
jcxz 13f
сообщает ЦП, что следует перейти по адресу 13FH, если регистр CX содержит 0; в противном случае выполнить следующую команду. Следующая строка содержит команду безусловного перехода на начало цикла.
Три строки, контролирующие окончание цикла в третьем примере, похожи на операторы Бейсика
CX=CX-1: IF CX=0 THEN GOTO 13F ELSE GOTO 138
Команда JCXZ (перейти, если значение регистра СХ равно нулю) часто используется при организации циклов сложной структуры для проверки условия завершения цикла внутри его тела.
После того как вы оттранслировали программы, убедитесь, что они дают правильные результаты: исполните их после выхода на приглашение к вводу ОС MS-DOS. Если вы обнаружите ошибки, то выполните трассировку программ (помните, что при трассировке для исполнения команды INT следует воспользоваться командой Go).
Возможно, вас разочарует скорость выполнения этих трех программ. Считается, что программы, написанные на языке ассемблера, должны выполняться быстро, а эти программы выполняются не быстрее команды Бейсика Print. Это происходит потому, что ОС MS-DOS выводит строки посимвольно, проверяя после ввода каждого символа состояние клавиатуры, выясняя, не нажали ли вы клавишу Ctrl-Break или Ctrl-C для остановки программы. Большинство коммерческих программ не использует для вывода функции дисплея ОС MS-DOS из-за их медленного выполнения.
ПОЛЕЗНО ЗНАТЬ...
Программа, приведенная на рис.6, значительно длиннее предыдущих программ, однако у вас не должно возникнуть особых затруднений при ее разборе. Она использует несколько новых служебных функций ОС MS-DOS и одну функцию системы BIOS.
Рис.6. С помощью программы Debug мы создаем программу на языке ассемблера, которая использует функции ОС MS-DOS и BIOS для установки новых атрибутов изображения
Эта программа запрашивает у вас две шестнадцатеричные цифры и интерпретирует их как атрибуты экрана. После этого она стирает содержимое экрана, устанавливает новый атрибут и возвращает управление ОС MS-DOS. Эти атрибуты действительны до тех пор, пока другая программа их не изменит.
Управлять экраном дисплея можно, изменяя значения битов байта, задающего режим изображения каждого символа. Он называется байтом атрибута изображения и расположен в памяти непосредственно перед байтом, содержащим код символа. Оба эти байта хранятся в особом участке ОЗУ, отведенном для операций с экраном.
Программа на рис.6 запрашивает ввод значения байта атрибута в шестнадцатеричном виде. Если вы используете цветной монитор, то в приведенной ниже таблице вы найдете трехбитовый код цветов символа и фона. Поместите коды цветов в соответствующие места в байте, содержимое которого показано на рисунке.
Для установки мигания или повышенной интенсивности свечения соответствующий бит должен быть равен 1, а для отмены этих режимов - 0. После установки значений битов значение байта следует перевести в шестнадцатеричную форму. Для адаптеров монохроматического графического дисплея значение 000 соответствует черному цвету, а 111 - белому. Большинство других значений соответствует серому цвету различной интенсивности. Если значение кода цвета для фона равно 100, то символы будут выводиться подчеркнутыми.
При работе с адаптерами цветных мониторов возможны следующие цвета:
Черный - 000
Синий - 001
Зеленый - 010
Голубой - 011
Красный - 100
Пурпурный - 101
Коричневый - 110
Светло-серый - 111
Установив бит интенсивности свечения, мы получим вместо черного цвета темно-серый, вместо коричневого - желтый, а вместо светло-серого - белый.
При написании подобных программ с помощью программы Debug сначала следует наметить структуру программы и адреса ее разделов. Поскольку необходимо знать адреса команд еще не написанной программы, то вы должны оценить длину каждого раздела. Хотя при этом и останутся неиспользованные участки памяти, программа установки атрибутов экрана займет на диске всего 193 байт, что меньше минимального количества 1024 байт, отводимого ОС MS-DOS для дисковых файлов. Таким образом, вам не следует беспокоиться об экономии байтов.
В верхней части рис.6 описана структура программы. Программа выводит на экран приглашение к вводу, ожидает ввода пользователем двух шестнадцатеричных цифр и символа возврата каретки, очищает экран, устанавливает требуемые атрибуты и на этом заканчивает свою работу. Программа разбита на блоки, а каждая ее строка снабжена комментарием, так что вы можете проследить шаг за шагом за выполняемыми программой действиями.
Первая команда программы расположена по адресу 100H. Эта команда вызывает служебную функцию 9 ОС MS-DOS для вывода на экран дисплея приглашения к вводу. Затем для ввода символа с клавиатуры и отображения его на экране программа вызывает служебную функцию 1 ОС MS-DOS (начальный адрес этой команды - 107H). Пользователь видит на экране вводимые символы, но не может воспользоваться клавишей возврата и редактировать их.
Служебная функция 1 помещает введенный с клавиатуры символ в регистр AL. Затем, используя команду Call с адресом 10BH, программа передает управление подпрограмме. Команда Call программы Debug во многом напоминает оператор Бейсика Gosub, при выполнении этой команды текущий адрес программы записывается в стек и управление передается подпрограмме. После того как подпрограмма заканчивает работу, она возвращает управление в основную программу с помощью команды RET, аналогичной оператору Бейсика Return.
Подпрограмма, которая будет описана чуть позже, либо переводит введенный с клавиатуры символ в шестнадцатеричное число, либо, если этот символ не лежит в установленном диапазоне, устанавливает в регистре флагов флаг переноса. Так как флаг переноса легко устанавливать и проверять, то программисты часто используют его для передачи между подпрограммами информации об успешном или ошибочном завершении выполнения. В строке, следующей за командой Call, стоит команда JC (передать управление, если установлен флаг переноса).
Как правило, значения флагов проверяются для того, чтобы в зависимости от состояния одного или нескольких битов регистра флагов передать управление определенным разделам программы. Эти условные переходы похожи на оператор Бейсика IF ... THEN GOTO. В языке ассемблера около 30 видов команд условного перехода. Многие из имен этих команд являются синонимами, поэтому не волнуйтесь, если при трассировке программы вам покажется, что программа Debug изменила команду перехода.
Если флаг переноса не установлен, то это означает, что подпрограмма перевода символов кода ASCII завершилась успешно и в регистр AL занесено шестнадцатеричное значение от 00H до 0FH, зависящее от нажатой клавиши. Так как это первая из двух шестнадцатеричных цифр, вводимых пользователем, то в действительности нам нужно значение от 00H до 0F0H, т.е. программа должна сдвинуть полученное значение из нижней половины байта в верхнюю.
Этот сдвиг можно выполнить двумя способами: либо умножить значение байта на 10H, либо сдвинуть каждый бит на четыре позиции влево. Второй метод быстрее и проще.
Команда с адресом 110H помещает число сдвигаемых битов (4) в регистр CL. В следующей строке команда
shl al,cl
сообщает ЦП, что необходимо сдвинуть влево значение регистра AL на число позиций, равное значению регистра CL. На каждом шаге этой процедуры текущее значение флага переноса заменяется на значение крайнего левого бита операнда (которым в нашем случае является регистр AL), остальные биты операнда сдвигаются на одну позицию влево, а в крайний правый бит операнда заносится нуль. Эта процедура не так сложна, как может показаться. Каждый сдвиг влево эквивалентен умножению на 2, а суммарный сдвиг на четыре позиции влево - это умножение на 2**4, т.е. на 16.
После сдвига значение регистра AL загружается в регистр BH. Причина, по которой выбран именно этот регистр, будет объяснена позже.
Ни одна из выполненных до сих пор команд не изменила начального значения регистра AH, равного 1. Это позволяет программе запросить ввод следующего символа с клавиатуры с помощью еще одного вызова INT 21. Для обработки символа программа снова вызывает подпрограмму преобразования символа и проверяет успешность ее завершения по флагу переноса.
Если подпрограмма преобразования символа не выдает сообщения об ошибке, то новое значение AL (от 00H до 0FH) складывается со значением, находящимся в BH. И наконец, третий символ клавиатуры, который должен быть символом возврата каретки, вводится командой вызова служебной функции 1 ОС MS-DOS. Эта команда имеет адрес 11FH. После этого программа использует команду СМР с адресом 121H для того, чтобы сравнить значение AL с кодом возврата каретки. В следующей строке еще одна команда условного перехода JNE (перейти, если не равно) передает управление в начало программы при условии, что пользователь не ввел символа возврата каретки.
Если программа дошла до адреса 125H, то это означает, что пользователь ввел две шестнадцатеричные цифры и символ возврата каретки, программа перевела эти цифры в двоичное представление и записала их в регистр BH. Теперь настал с время стереть содержимое экрана и установить новые атрибуты.
В ОС MS-DOS нет служебных функций, стирающих содержимое экрана, устанавливающих новые атрибуты или положение курсора. Если вы используете драйвер консоли ANSI.SYS ОС MS-DOS, то можно набрать специальные последовательности символов, инициирующих такие действия, но они как правило, выполняются медленно и не работают без установки файла ANSI.SYS. На всех ЭВМ, совместимых с IBM PC/XT/AT, команда INT 10 вызывает одну из процедур системы BIOS, хранящихся в ПЗУ и управляющих экраном, изменяющих режимы, положение курсора, выводящих на экран символы псевдографики и т.д.
Вызываемая по команде INT 10 служебная функция 6 прокручивает на заданное число строк любой активный участок экрана (точно так же служебная функция 7 прокручивает участок вниз). Для вызова этой функции следует поместить номер (6) в регистр AH, загрузить число строк, на которое требуется выполнить прокрутку, в регистр AL, занести в регистры CX и DX координаты левого верхнего и правого нижнего углов прокручиваемого окна и поместить в регистр BH устанавливаемые атрибуты. Так как наша программа уже занесла значения атрибутов в регистр ВН, то это действие мы опускаем.
По команде с адресом 125H программа помещает нуль в регистр AL, чтобы указать на то, что окне должно быть очищено целиком. Команда загрузки нуля в регистр CX (адрес 127H) эквивалентна команде загрузки нулей в регистры CH и CL, это указывает системе BIOS, что верхний левый угол окна находится в нулевом столбце нулевой строки (номера строк и столбцов экрана всегда начинаются с нуля, а не с единицы). Поместив в регистры DH и DL значения, равные 18H (24 в десятичном виде) и 4FH (79 в десятичном виде) соответственно, вы укажете, что нижний угол окна находится в 79-м столбце 24-й строки. Вместо двух команд, заносящих эти значения, в программе используется одна команда
mov dx,184F
Наконец, программа помещает в регистр АН номер служебной функции и вызывает прерывание командой INT 10.
Вызванная этой командой служебная функция системы BIOS стирает содержимое экрана, используя для этого символы пробелов и новый байт атрибута в регистре BH. Однако она не перемещает курсора в левый верхний угол экрана; вы еще не завершили ассемблерный эквивалент команды очистки экрана CLS языка Бейсик.
Положением курсора управляет служебная функция 2 системы BIOS. Для ее вызова программа должна поместить в регистры DH и DL значения, указывающие положение курсора, записать номер страницы экрана в регистр ВН и номер служебной функции (2) в регистр AH. Программа заносит в регистр DX нулевое значение, так как мы хотим, чтобы курсор находился в левом верхнем углу. Если только предыдущая программа не изменила состояния видеопамяти, то текущее значение номера страницы экрана равно нулю и это значение программа на рис.6 заносит в регистр BH. После этого она снова вызывает прерывание INT 10 для того, чтобы перевести курсор в начало экрана. Последним действием мы возвращаем управление ОС MS-DOS с помощью команды INT 20.
ПРЕОБРАЗОВАНИЕ ЧИСЛА
Оставшаяся часть программы в основном занята преобразованием набранного на клавиатуре символа а шестнадцатеричную цифру. Например, если пользователь нажимает клавишу 5, то в регистр AL будет занесено значение 35H, которое в системе ASCII соответствует символу 5. Для того чтобы перевести 35H в 05H, необходима подпрограмма, которая должна также проверять, что пользователь ввел допустимую шестнадцатеричную цифру.
Подпрограмма, выполняющая эти действия, начинается с адреса 150H. Она открывается серией проверок и условных переходов. Если содержимое регистра AL меньше 30H, то это означает, что оно не является допустимой шестнадцатеричной цифрой. Если же оно лежит в пределах от 30H до 39Н включительно, то соответствует десятичной цифре и в этом случае может быть переведено непосредственно в двоичную цифру. Команда JB (перейти, если меньше) с адресом 152H означает "передать управление, если при последней проверке левый операнд оказался меньше правого". Команда JBE, стоящая двумя строками ниже, означает "перейти, если значение оказалось меньшим или равным".
Если код набранного на клавиатуре символа не лежит между значениями 0 и 9, то он может соответствовать букве алфавита, которая могла быть набрана как на верхнем, так и на нижнем регистрах. Если вы посмотрите на таблицу символов системы ASCII, то увидите, что коды букв верхнего и нижнего регистров отличаются значением одного бита: пятый бит равен 1 в нижнем регистре и 0 - в верхнем. Команда с адресом 158H
and al,df
использует логическую операцию И для принудительного обнуления пятого бита. Аналогичный прием применяется в Бейсике, где для этого часто используют выражения типа
CH$=CHR$(ASC(CH$) AND &HDF)
После этого программа выполняет еще два теста для проверки того, что символ клавиатуры, код которого содержится в регистре AL, действительно лежит между символами A и F. Если это так, то, перед тем как передать управление по адресу 170H, программа увеличивает значение кода символа на 9. Смысл этого трюка заключается в следующем. В коде ASCII символам A-F соответствуют значения 41H-45H. Прибавляя к ним 9, мы переводим эти значения в диапазон 4АН-4FH и получаем правильное значение второй цифры.
Если символ является допустимым, то в регистре AL теперь находится значение, лежащее в диапазоне 30H-39H или 4AH-4FH. Нам необходимо получить значение в диапазоне 00H-0FH, для этого достаточно обнулить первую половину байта, что и выполняет команда And, расположенная по адресу 170H. После этого команда CLC обнуляет флаг переноса, а команда RET возвращает управление основной программе.
Если пользователь ввел недопустимый символ, то программа передаст управление по адресу 180H, где командой STC (установить флаг переноса) устанавливается флаг переноса, а затем управление возвращается основной программе. Все, что нам осталось сделать, это поместить в память нужное приглашение к вводу с помощью команды ввода данных программы Debug, вывести на экран содержимое блока памяти для того, чтобы выяснить длину программы, а затем сохранить программу на диске. (Так как приглашение к вводу начинается с символов возврата каретки и пропуска строки, то оно всегда выводится с новой строки, даже если пользователь допустит ошибку и программа начнет выполняться сначала).
После сохранения программы вам наверняка захочется вернуться в ОС MS-DOS и исполнить эту программу. Если в результате исполнения программы вы обнаружите ошибки, то снова вызовите программу Debug, загрузите свою программу и проведите ее трассировку (помните, что нельзя трассировать вызовы прерываний). Отладка и трассировка - необходимые элементы процесса написания программ на языке ассемблера, так как почти невозможно избежать ошибок в первом варианте текста программы.
ЧТО ДАЛЬШЕ?
Если вам понравилось это краткое введение в язык ассемблера, то вам, наверное, захочется попробовать свои силы в составлении более сложных программ и изучить полную систему команд ЦП. Для этого вам потребуется документация по служебным функциям ОС MS-DOS и прерываниям системы BIOS, а также полный список команд центрального процессора. Существует много хороших книг по языку ассемблера, где можно найти и то, и другое.
Скорее всего вас перестанут удовлетворять возможности программы DEBUG.COM, и вам захочется пользоваться более мощным транслятором и лучшими средствами трассировки. Стандартным транслятором который к тому же чаще всего используется в журнальных статьях, является макроассемблер MASM фирмы Microsoft. Последние версии макроассемблера MASM содержат программу SYMDEB, которая является большим шагом вперед по сравнению с программой DEBUG.COM.
Лучше всего учиться, упражняясь с короткими программами. Вы обнаружите, что программу на языке ассемблера, содержащую хорошие комментарии, читать не сложнее, чем программу той же длины на языке высокого уровня. Программируя на языке ассемблера вы будете лучше понимать устройство ЭВМ, что сделает вас более искусным программистом независимо от того, какой язык высокого уровня вы используете.
Gudleifr- Admin
- Сообщения : 3403
Дата регистрации : 2017-03-29
Re: Брябрин. Программное обеспечение персональных ЭВМ. 1990
И еще одна статья из того же номера журнала по вопросу, затронутому у Брябрина.
КОММУНИКАЦИЯ МЕЖДУ ПРОГРАММАМИ
ХАРДИН БРОДЕРЗ
Учитесь писать программы на языке ассемблера, умеющие обмениваться сообщениями.
Эта статья открывается проблемой, с которой мне пришлось столкнуться при написании прикладной программы. Данная программа должна была иметь доступ к описанию конфигурации системы, задаваемому пользователем и включающему, например, команды инициализации принтера, тип экрана, имена выбранного дисковода и области файлов и т.д. Мне хотелось хранить информацию в дисковом файле, но где?
Следовало учесть и другие факторы. Пользователю может понадобиться вызывать одну и ту же программу, находясь в различных областях файлов, и при этом в каждой из них сохранять различные наборы файлов данных. Мне бы не хотелось требовать от него создания множества копий инициализирующего файла. Кроме того, не хотелось задавать и конкретное имя файла в конкретной области файлов на конкретном дисководе.
Ответ пришел после решения нескольких других проблем программирования. Как сделать резидентную программу, которая сообщает свое местоположение другим программам? Как передать результаты исполнения одной программы следующей за ней? Или, в более общей постановке вопроса, как обеспечить коммуникацию между программами?
Говоря о КОММУНИКАЦИИ МЕЖДУ ПРОГРАММАМИ, мы имеем в виду как краткосрочную (в течение одного сеанса работы за ЭВМ), так и долгосрочную коммуникацию (когда результаты ожидают извлечения дни и недели). При этом мы получим программы на языке ассемблера, которые повторяют некоторые из функций, автоматически реализуемых в некоторых языках программирования высокого уровня, таких как Quick Basic и Си.
КАНАЛЫ КОММУНИКАЦИИ
Программы могут общаться друг с другом по меньшей мере шестью способами. Мы рассмотрим четыре из них, а остальные два заслуживают краткого упоминания.
В первом, пожалуй, наиболее распространенном способе коммуникации используется запись данных в файлы, которые могут быть прочитаны другими программами. Менее известный способ состоит в том, что программа оставляет в таблице прерываний ЭВМ указатели на область памяти, занимаемую данными. Этот прием широко используется процедурами системы BIOS при обслуживании различных периферийных устройств.
Чтобы понять способы коммуникации между программами, надо иметь представление о том, как операционная система MS-DOS загружает, исполняет и завершает программы. Начнем с процесса загрузки.
НАЧАЛЬНАЯ ЗАГРУЗКА ОПЕРАЦИОННОЙ СИСТЕМЫ
Выполняя процедуру начальной загрузки, ЭВМ считывает с диска операционную систему MS-DOS, затем файл CONFIG.SYS (если таковой имеется) и загружает программный интерфейс пользователя, называемый также оболочкой. Обычно такой оболочкой служит программа COMMAND.COM, но при желании можно указать в файле CONFIG.SYS имя другой оболочки.
Вся коммуникация пользователя с операционной системой MS-DOS, включая исполнение программ и командных файлов, чтение каталогов областей файлов и манипулирование файлами, в действительности исполняется командами, обрабатываемыми содержимым файла COMMAND.COM. Пользователь никогда не общается непосредственно с операционной системой. Программа COMMAND.COM генерирует знакомое приглашение к вводу A>, ожидает ввода команд пользователя, считывает и исполняет командные файлы и обращается к операционной системе MS-DOS для вызова и исполнения программных файлов.
Программа COMMAND.COM очень похожа на обычную программу типа .COM. За исключением необычного способа загрузки в память, она ведет себя подобно любой другой программе, и ее возможности доступны другим программам типа .EXE или .COM. Естественно считать программу COMMAND.COM частью операционной системы MS-DOS, но полезнее рассматривать ее как наиболее популярную из всех написанных прикладных программ. Руководство для пользователя по операционной системе MS-DOS в действительности является справочником по функциям программы COMMAND.COM и других служебных программ, а не по собственно операционной системе.
Если nporpaммa COMMAND.COM может загружать и исполнять программы, передавать им информацию и интерпретировать результаты их исполнения, то наши программы могут делать то же самое. В терминах руководств по MS-DOS любая программа, вызывающая другую, называется МАТЕРИНСКОЙ, а вызванная программа - ДОЧЕРНЕЙ. Большинство прикладных программ является дочерними для программы COMMAND.COM, которая является материнской для любой другой программы и единственной, не имеющей материнской программы.
Когда пользователь (или командный файл) предлагает программе COMMAND.COM вызвать программу, то COMMAND.COM интерпретирует этот запрос, находит файл и вызывает служебную процедуру операционной системы MS-DOS с номером 4BH (где суффикс H означает шестнадцатеричную запись) для загрузки и исполнения этой программы. В ответ MS-DOS обращается к своей системе управления памятью, которая создает заголовок программы, называемый ПРЕФИКСОМ СЕГМЕНТА ПРОГРАММЫ (ПСП, в оригинале PSP - program segment prefix), определяет, является ли программа файлом типа .EXE или .COM, загружает программу в память, обрабатывает ссылки на сегменты (только для файлов типа .EXE) и передает управление первой команде программы.
Операционная система MS-DOS всегда инициирует регистры DS и ES как указатели на сегментную часть адреса ПСП программы (ПСП содержит 256 байт информации, которая доступна как операционной системе MS-DOS, так и прикладной программе). Информация заносится в ПСП как операционной системой MS-DOS, так и вызывающей программой, которой обычно является COMMAND.COM. Просматривая свой ПСП, программа может получить информацию от своей материнской программы.
ХВОСТ КОМАНДЫ
После того как вы набрали команду в ответ на приглашение A>, программа COMMAND.COM разбивает ее на отдельные поля. Первое набранное слово рассматривается как имя файла, и COMMAND.COM ищет файл с тем же именем и расширением .EXE, .COM или .BAT, чтобы вызвать его для исполнения. Если вы включили в командную строку символы переадресации ввода-вывода (>, >>, < или |), то COMMAND.COM вначале выполняет переадресацию, а уж затем вызывает вашу программу. Вся остальная часть текста команды передается программе без изменения. Эта дополнительная информация называется хвостом команды и может содержать все, что требуется программе, например имя файла или дополнительные параметры. Если программа не рассчитывает получить эту информацию, то она будет проигнорирована.
Программа извлекает хвост команды из ПСП, начиная с относительного адреса 80H. Хвост закодирован в формате LSTRING, названном так потому, что первый байт указывает длину остальной части строки (Length + STRING). Если этот первый байт содержит нуль, то командный хвост пуст. Поскольку последний адрес ПСП равен 0FFH, то максимальная длина хвоста команды равна 7FH (127) байт. (Правда, программа COMMAND.COM не воспримет команду такой длины).
Показанная на рис.1 программа демонстрирует один из способов получения хвоста команды. Как и в остальных программах этой статьи, в ней использована сокращенная запись определения сегментов, используемая в макроассемблере MASM 5.0 фирмы Microsoft.
Рис.1. Демонстрация одного из способов чтения из программы на языке ассемблера командной строки операционной системы MS-DOS
Эта программа прежде всего проверяет байт длины хвоста, извлекаемый из ПСП. Если он нулевой, то программа сообщает, что у команды нет хвоста, и завершает свою работу. В противном случае она изображает на экране хвост команды и сообщает об успешном выполнении работы.
Основная цель данной программы - показать, какую именно часть командной строки программа COMMAND.COM передает вашей программе. После трансляции программы попробуйте исполнить ее, передавая различные варианты переацресации ввода-вывода и различные виды текста. Например, поочередно наберите следующие пять строк:
CMDLINE This is a test
CMDLINE This >is a test
CMDLINE This /is /a /test
CMDLINE This is <a test
CMDLINE This |is a test
После того как будет введена первая строка, вы должны получить на экране сообщение "This is a test". После ввода второй строки будет открыт файл с имеем IS и в него будет записана строка "This a test" (содержимое этого файла можно изобразить на экране с помощью команды type). После ввода третьей строки, как и первой, а экране будет изображен хвост команды. Ввод четвертой строки вообще не повлечет за собой исполнения программы, поскольку программа COMMAND.COM не сможет открыть файл с именем A в качестве входа для программы CMDLINE. За вводом пятой строки последует сообщение об ошибке, так как программа COMMAND.COM попытается переадресовать вывод программы CMDLINE несуществующей прогрaммe IS.
Хотя из программы на рис.1 этого не видно, но COMMAND.COM еще и выделяет первые два слова хвоста команды, разбирает их как если бы они означали имена файлов, затем помещает результаты в подготовленные для последующего открытия блоки управления файлами БУФ, в оригинале FCB - file control block), расположенные со смещениями 5CH и 6CH от начала ПСП. Кроме того, буквы, которыми написаны эти первые два слова хвоста команды, преобразуются из строчных в прописные, после чего данные слова помещаются в ПСП со смещениями 5DH и 6DH. Знание этого факта иногда позволяет упростить разбор хвоста команды.
ЧТЕНИЕ КЛЮЧЕЙ
Многие программы рассчитывают обнаружить в хвосте команды перечень ключей наподобие /P и /W, которые используются в команде листинга каталога файлов DIR. Программа на рис.2 показывает один из путей чтения и разбора таких ключей.
Рис.2. Демонстрация способа извлечения ключей из командной строки операционной системы MS-DOS (например, /Р)
Эта программа имитирует ситуацию, когда допускается задавать до 16 ключей с именами от /A до /P. (Вы можете инициировать переменную размером в слово так, чтобы по умолчанию определенные ключи были в положении "включен"). Например, если вы вызовете эту программу с помощью команды
SWITCH /A /B
то она сообщит, что ключи А и В "включены". Вначале программа запрашивает у операционной системы MS-DOS текущий символ-признак ключа. В некоторых версиях MS-DOS 2.x можно изменить этот символ (по умолчанию - косая черта /), указав соответствующую команду в файле CONFIG.SYS. Эта редко используемая возможность позволяет приблизить внешний облик MS-DOS к облику операционной системы UNIX, заменив признак ключа на дефис. К несчастью эта процедура документирована не во всех версиях MS-DOS, отсутствует в версиях 3.x и обрабатывается не всеми служебными программами. То же самое относится и к служебной процедуре с номером 37H, которая может запросить или переустановить символ-признак ключа. Она никогда не упоминалась в руководствах по PC-DOS, хотя и описана в некоторых технических руководствах по MS-DOS.
Следовательно, манипулирование символом-признаком ключа достаточно проблематично. Некоторые программы игнорируют его. Если вы хотите поэкспериментировать, измените этот символ, для чего надо загрузить его новое значение в регистр DL, поместить значение 3701H в регистр AX и вызвать прерывание 21H (командой INT 21H). Однако если вы готовите программу для распространения, то она должна оставлять этот символ неизменным, но на всякий случай считывать его значение перед разбором хвоста команды, который может содержать ключи.
Остальная часть программы на рис.2 достаточно бесхитростна. Программа находит каждое появление признака ключа в хвосте команды, считывает следующий символ и использует его для того, чтобы установить или сбросить соответствующий бит в переменной swtch. Затем она просматривает биты переменной swtch. Обнаружив, что бит равен 1, она сообщает, что соответствующий ему ключ "включен".
СРЕДА ПРОГРАММЫ
Программа COMMAND.COM производит манипуляции в области памяти, называемой СРЕДОЙ и содержащей информацию, которой может воспользоваться любая программа, включая COMMAND.COM. Каждый элемент среды представляет собой слово (текста), обычно записанное строчными буквами, за которым следуют знак равенства и дополнительный текст. Элементы записаны в формате ASCIIZ (текст в ASCII-кодах, заканчивающийся нулевым байтом), а признаком конца списка элементов служит еще один нулевой байт.
Среда содержит, по крайней мере, одну запись: COMSPEC=маршрут к копии программы COMMAND.COM или другой оболочки, вызываемой при начальной загрузке операционной системы. В операционной системе MS-DOS версии 2.x размер среды фиксирован и равен 127 байт; в версиях 3.x размер среды по умолчанию равен 160 байт, но его можно увеличить командой SHELL=, включенной в файл CONFIG.SYS, или запуском другой копии программы COMMAND.COM с ключом /Е:. Синтаксис этой команды изменяется от одной частной версии MS-DOS 3.x к другой. Имеются служебные программы, которые увеличивают размер среды в версиях MS-DOS 2.x; пожалуй, из них наиболее удобна программа SETENV, поставляемая с несколькими компиляторами языков высокого уровня фирмы Microsoft. Максимальный размер среды равен 32 Кбайт во всех версиях MS-DOS.
Кроме записи COMSPEC= программа COMMAND.COM заносит в среду альтернативные маршруты поиска программных файлов. Чтобы указать новые или изменить уже записанные маршруты, можно воспользоваться командой path. Вы можете создать в среде новые записи командой set. Например, если вы наберете команду
SET abc=xyz
а затем наберете команду set без параметров, чтобы посмотреть содержимое среды, то последней записью окажется "ABC=xyz". Команда set, исполняемая программой COMMAND.COM, всегда записывает прописными буквами то, что стоит слева от знака равенства, и оставляет правую часть без изменения.
Двухбайтовая запись со смещением 2CH от начала ПСП содержит значение сегмента для копии среды, созданной для вашей программы. Оригинал среды управляется только программой COMMAND.COM, и только эта программа должна вносить в нее изменения. Каждая дочерняя программа получает копию среды материнской программы или любой другой среды, которую может создать материнская программа. Ни одна дочерняя программа не может изменить среду своей материнской программы, а также свою копию среды, если среда материнской программы изменена.
Многие прикладные программы используют среду для установки своих собственных параметров. Например, программа LINK, поставляемая вместе с операционной системой MS-DOS, просматривает среду в поисках "переменной" LIB=, чтобы определить, в каких каталогах файлов находятся имена библиотечных файлов. Используемая мною программа обработки текстов при каждом вызове считывает 10 различных записей среды для установки различных режимов исполнения.
"Переменные" среды можно использовать в командных файлах, окаймляя имя "переменной" знаками %. Если в среду внесена "переменная" с помощью указанного выше примера команды set, то любое вхождение %ABC% в командном файле будет заменено на xyz. Командные файлы, используемые для установки макроассемблера MASM 5.0, могут служить хорошими примерами использования подобных возможностей.
Из рис.3 видно, каким образом программа может прочитать свою копию среды. Вначале она считывает из своего ПСП сегментную часть адреса среды, а затем изображает каждую запись среды, пока не обнаружит двух завершающих нулевых байтов. Как показывает эта программа, в операционной системе MS-DOS 3.x полное имя маршрута для исполняемой программы находится непосредственно за концом среды. Этим можно воспользоваться, чтобы выяснить, не переименовал ли пользователь программу, и чтобы определить, на каком дисководе и в какой области файлов находится программа.
Рис.3. Программа считывает содержимое среды, т.е. области памяти, которая создается программой COMMAND.COM для каждой вызываемой ею программы
ОБЩИЙ ПУЛ БАЙТОВ
Программа, приведенная на рис.4, показывает последнее место, из которого программа может черпать информацию: 16 байтов, начинающихся с адреса 0040:00F0 (или 0:4F0), зарезервированы как область межпрограммной коммуникации (ОМК, в оригинале IAC - inter-application communication). Любая программа может записать предназначенные для другой программы данные в эту область. Более того, если только первая программа непосредственно не вызвала вторую, ОМК нельзя защитить от изменения любой промежуточной программой.
Рис.4. Программа на языке ассемблера считывает содержимое области межпрограммной коммуникации размером 16 байт. Через эту область одна программа может передать данные другой программе
Показанная на рис.4 программа читает и изображает на экране содержимое ОМК. Каждый байт ОМК выводится в форме двузначного шестнадцатеричного числа.
То, что лишь немногие прикладные программы пользуются ОМК, отчасти связано с опасениями, что другие программы могут изменить помещенную в ОМК информацию. Однако ОМК может быть достаточно полезна для передачи адреса от одной программы к другой.
Например, у меня есть несколько процедур на машинном языке, которые мне хотелось бы вызывать при работе с интерпретирующим Бейсиком. По-моему, обычные методы доступа к ним: запоминание их в строковых переменных Бейсика или в начале незанятой памяти - не являются удовлетворительными. Вместо этого я помещаю эту процедуру в короткую программу, которая загружает указатель в ОМК. В таком случае любая программа на Бейсике может воспользоваться командой РЕЕК, чтобы найти эти процедуры и использовать их содержимое для определения внешнего сегмента Бейсика. Затем можно выполнять вызовы процедур, задавая соответствующее смещение в данном сегменте.
Для исполнения приведенных в тексте программ требуются операционная система MS-DOS 2.0 или более поздней версии и макроассемблер MASM фирмы Microsoft.
КОММУНИКАЦИЯ МЕЖДУ ПРОГРАММАМИ
ХАРДИН БРОДЕРЗ
Учитесь писать программы на языке ассемблера, умеющие обмениваться сообщениями.
Эта статья открывается проблемой, с которой мне пришлось столкнуться при написании прикладной программы. Данная программа должна была иметь доступ к описанию конфигурации системы, задаваемому пользователем и включающему, например, команды инициализации принтера, тип экрана, имена выбранного дисковода и области файлов и т.д. Мне хотелось хранить информацию в дисковом файле, но где?
Следовало учесть и другие факторы. Пользователю может понадобиться вызывать одну и ту же программу, находясь в различных областях файлов, и при этом в каждой из них сохранять различные наборы файлов данных. Мне бы не хотелось требовать от него создания множества копий инициализирующего файла. Кроме того, не хотелось задавать и конкретное имя файла в конкретной области файлов на конкретном дисководе.
Ответ пришел после решения нескольких других проблем программирования. Как сделать резидентную программу, которая сообщает свое местоположение другим программам? Как передать результаты исполнения одной программы следующей за ней? Или, в более общей постановке вопроса, как обеспечить коммуникацию между программами?
Говоря о КОММУНИКАЦИИ МЕЖДУ ПРОГРАММАМИ, мы имеем в виду как краткосрочную (в течение одного сеанса работы за ЭВМ), так и долгосрочную коммуникацию (когда результаты ожидают извлечения дни и недели). При этом мы получим программы на языке ассемблера, которые повторяют некоторые из функций, автоматически реализуемых в некоторых языках программирования высокого уровня, таких как Quick Basic и Си.
КАНАЛЫ КОММУНИКАЦИИ
Программы могут общаться друг с другом по меньшей мере шестью способами. Мы рассмотрим четыре из них, а остальные два заслуживают краткого упоминания.
В первом, пожалуй, наиболее распространенном способе коммуникации используется запись данных в файлы, которые могут быть прочитаны другими программами. Менее известный способ состоит в том, что программа оставляет в таблице прерываний ЭВМ указатели на область памяти, занимаемую данными. Этот прием широко используется процедурами системы BIOS при обслуживании различных периферийных устройств.
Чтобы понять способы коммуникации между программами, надо иметь представление о том, как операционная система MS-DOS загружает, исполняет и завершает программы. Начнем с процесса загрузки.
НАЧАЛЬНАЯ ЗАГРУЗКА ОПЕРАЦИОННОЙ СИСТЕМЫ
Выполняя процедуру начальной загрузки, ЭВМ считывает с диска операционную систему MS-DOS, затем файл CONFIG.SYS (если таковой имеется) и загружает программный интерфейс пользователя, называемый также оболочкой. Обычно такой оболочкой служит программа COMMAND.COM, но при желании можно указать в файле CONFIG.SYS имя другой оболочки.
Вся коммуникация пользователя с операционной системой MS-DOS, включая исполнение программ и командных файлов, чтение каталогов областей файлов и манипулирование файлами, в действительности исполняется командами, обрабатываемыми содержимым файла COMMAND.COM. Пользователь никогда не общается непосредственно с операционной системой. Программа COMMAND.COM генерирует знакомое приглашение к вводу A>, ожидает ввода команд пользователя, считывает и исполняет командные файлы и обращается к операционной системе MS-DOS для вызова и исполнения программных файлов.
Программа COMMAND.COM очень похожа на обычную программу типа .COM. За исключением необычного способа загрузки в память, она ведет себя подобно любой другой программе, и ее возможности доступны другим программам типа .EXE или .COM. Естественно считать программу COMMAND.COM частью операционной системы MS-DOS, но полезнее рассматривать ее как наиболее популярную из всех написанных прикладных программ. Руководство для пользователя по операционной системе MS-DOS в действительности является справочником по функциям программы COMMAND.COM и других служебных программ, а не по собственно операционной системе.
Если nporpaммa COMMAND.COM может загружать и исполнять программы, передавать им информацию и интерпретировать результаты их исполнения, то наши программы могут делать то же самое. В терминах руководств по MS-DOS любая программа, вызывающая другую, называется МАТЕРИНСКОЙ, а вызванная программа - ДОЧЕРНЕЙ. Большинство прикладных программ является дочерними для программы COMMAND.COM, которая является материнской для любой другой программы и единственной, не имеющей материнской программы.
Когда пользователь (или командный файл) предлагает программе COMMAND.COM вызвать программу, то COMMAND.COM интерпретирует этот запрос, находит файл и вызывает служебную процедуру операционной системы MS-DOS с номером 4BH (где суффикс H означает шестнадцатеричную запись) для загрузки и исполнения этой программы. В ответ MS-DOS обращается к своей системе управления памятью, которая создает заголовок программы, называемый ПРЕФИКСОМ СЕГМЕНТА ПРОГРАММЫ (ПСП, в оригинале PSP - program segment prefix), определяет, является ли программа файлом типа .EXE или .COM, загружает программу в память, обрабатывает ссылки на сегменты (только для файлов типа .EXE) и передает управление первой команде программы.
Операционная система MS-DOS всегда инициирует регистры DS и ES как указатели на сегментную часть адреса ПСП программы (ПСП содержит 256 байт информации, которая доступна как операционной системе MS-DOS, так и прикладной программе). Информация заносится в ПСП как операционной системой MS-DOS, так и вызывающей программой, которой обычно является COMMAND.COM. Просматривая свой ПСП, программа может получить информацию от своей материнской программы.
ХВОСТ КОМАНДЫ
После того как вы набрали команду в ответ на приглашение A>, программа COMMAND.COM разбивает ее на отдельные поля. Первое набранное слово рассматривается как имя файла, и COMMAND.COM ищет файл с тем же именем и расширением .EXE, .COM или .BAT, чтобы вызвать его для исполнения. Если вы включили в командную строку символы переадресации ввода-вывода (>, >>, < или |), то COMMAND.COM вначале выполняет переадресацию, а уж затем вызывает вашу программу. Вся остальная часть текста команды передается программе без изменения. Эта дополнительная информация называется хвостом команды и может содержать все, что требуется программе, например имя файла или дополнительные параметры. Если программа не рассчитывает получить эту информацию, то она будет проигнорирована.
Программа извлекает хвост команды из ПСП, начиная с относительного адреса 80H. Хвост закодирован в формате LSTRING, названном так потому, что первый байт указывает длину остальной части строки (Length + STRING). Если этот первый байт содержит нуль, то командный хвост пуст. Поскольку последний адрес ПСП равен 0FFH, то максимальная длина хвоста команды равна 7FH (127) байт. (Правда, программа COMMAND.COM не воспримет команду такой длины).
Показанная на рис.1 программа демонстрирует один из способов получения хвоста команды. Как и в остальных программах этой статьи, в ней использована сокращенная запись определения сегментов, используемая в макроассемблере MASM 5.0 фирмы Microsoft.
Рис.1. Демонстрация одного из способов чтения из программы на языке ассемблера командной строки операционной системы MS-DOS
Эта программа прежде всего проверяет байт длины хвоста, извлекаемый из ПСП. Если он нулевой, то программа сообщает, что у команды нет хвоста, и завершает свою работу. В противном случае она изображает на экране хвост команды и сообщает об успешном выполнении работы.
Основная цель данной программы - показать, какую именно часть командной строки программа COMMAND.COM передает вашей программе. После трансляции программы попробуйте исполнить ее, передавая различные варианты переацресации ввода-вывода и различные виды текста. Например, поочередно наберите следующие пять строк:
CMDLINE This is a test
CMDLINE This >is a test
CMDLINE This /is /a /test
CMDLINE This is <a test
CMDLINE This |is a test
После того как будет введена первая строка, вы должны получить на экране сообщение "This is a test". После ввода второй строки будет открыт файл с имеем IS и в него будет записана строка "This a test" (содержимое этого файла можно изобразить на экране с помощью команды type). После ввода третьей строки, как и первой, а экране будет изображен хвост команды. Ввод четвертой строки вообще не повлечет за собой исполнения программы, поскольку программа COMMAND.COM не сможет открыть файл с именем A в качестве входа для программы CMDLINE. За вводом пятой строки последует сообщение об ошибке, так как программа COMMAND.COM попытается переадресовать вывод программы CMDLINE несуществующей прогрaммe IS.
Хотя из программы на рис.1 этого не видно, но COMMAND.COM еще и выделяет первые два слова хвоста команды, разбирает их как если бы они означали имена файлов, затем помещает результаты в подготовленные для последующего открытия блоки управления файлами БУФ, в оригинале FCB - file control block), расположенные со смещениями 5CH и 6CH от начала ПСП. Кроме того, буквы, которыми написаны эти первые два слова хвоста команды, преобразуются из строчных в прописные, после чего данные слова помещаются в ПСП со смещениями 5DH и 6DH. Знание этого факта иногда позволяет упростить разбор хвоста команды.
ЧТЕНИЕ КЛЮЧЕЙ
Многие программы рассчитывают обнаружить в хвосте команды перечень ключей наподобие /P и /W, которые используются в команде листинга каталога файлов DIR. Программа на рис.2 показывает один из путей чтения и разбора таких ключей.
Рис.2. Демонстрация способа извлечения ключей из командной строки операционной системы MS-DOS (например, /Р)
Эта программа имитирует ситуацию, когда допускается задавать до 16 ключей с именами от /A до /P. (Вы можете инициировать переменную размером в слово так, чтобы по умолчанию определенные ключи были в положении "включен"). Например, если вы вызовете эту программу с помощью команды
SWITCH /A /B
то она сообщит, что ключи А и В "включены". Вначале программа запрашивает у операционной системы MS-DOS текущий символ-признак ключа. В некоторых версиях MS-DOS 2.x можно изменить этот символ (по умолчанию - косая черта /), указав соответствующую команду в файле CONFIG.SYS. Эта редко используемая возможность позволяет приблизить внешний облик MS-DOS к облику операционной системы UNIX, заменив признак ключа на дефис. К несчастью эта процедура документирована не во всех версиях MS-DOS, отсутствует в версиях 3.x и обрабатывается не всеми служебными программами. То же самое относится и к служебной процедуре с номером 37H, которая может запросить или переустановить символ-признак ключа. Она никогда не упоминалась в руководствах по PC-DOS, хотя и описана в некоторых технических руководствах по MS-DOS.
Следовательно, манипулирование символом-признаком ключа достаточно проблематично. Некоторые программы игнорируют его. Если вы хотите поэкспериментировать, измените этот символ, для чего надо загрузить его новое значение в регистр DL, поместить значение 3701H в регистр AX и вызвать прерывание 21H (командой INT 21H). Однако если вы готовите программу для распространения, то она должна оставлять этот символ неизменным, но на всякий случай считывать его значение перед разбором хвоста команды, который может содержать ключи.
Остальная часть программы на рис.2 достаточно бесхитростна. Программа находит каждое появление признака ключа в хвосте команды, считывает следующий символ и использует его для того, чтобы установить или сбросить соответствующий бит в переменной swtch. Затем она просматривает биты переменной swtch. Обнаружив, что бит равен 1, она сообщает, что соответствующий ему ключ "включен".
СРЕДА ПРОГРАММЫ
Программа COMMAND.COM производит манипуляции в области памяти, называемой СРЕДОЙ и содержащей информацию, которой может воспользоваться любая программа, включая COMMAND.COM. Каждый элемент среды представляет собой слово (текста), обычно записанное строчными буквами, за которым следуют знак равенства и дополнительный текст. Элементы записаны в формате ASCIIZ (текст в ASCII-кодах, заканчивающийся нулевым байтом), а признаком конца списка элементов служит еще один нулевой байт.
Среда содержит, по крайней мере, одну запись: COMSPEC=маршрут к копии программы COMMAND.COM или другой оболочки, вызываемой при начальной загрузке операционной системы. В операционной системе MS-DOS версии 2.x размер среды фиксирован и равен 127 байт; в версиях 3.x размер среды по умолчанию равен 160 байт, но его можно увеличить командой SHELL=, включенной в файл CONFIG.SYS, или запуском другой копии программы COMMAND.COM с ключом /Е:. Синтаксис этой команды изменяется от одной частной версии MS-DOS 3.x к другой. Имеются служебные программы, которые увеличивают размер среды в версиях MS-DOS 2.x; пожалуй, из них наиболее удобна программа SETENV, поставляемая с несколькими компиляторами языков высокого уровня фирмы Microsoft. Максимальный размер среды равен 32 Кбайт во всех версиях MS-DOS.
Кроме записи COMSPEC= программа COMMAND.COM заносит в среду альтернативные маршруты поиска программных файлов. Чтобы указать новые или изменить уже записанные маршруты, можно воспользоваться командой path. Вы можете создать в среде новые записи командой set. Например, если вы наберете команду
SET abc=xyz
а затем наберете команду set без параметров, чтобы посмотреть содержимое среды, то последней записью окажется "ABC=xyz". Команда set, исполняемая программой COMMAND.COM, всегда записывает прописными буквами то, что стоит слева от знака равенства, и оставляет правую часть без изменения.
Двухбайтовая запись со смещением 2CH от начала ПСП содержит значение сегмента для копии среды, созданной для вашей программы. Оригинал среды управляется только программой COMMAND.COM, и только эта программа должна вносить в нее изменения. Каждая дочерняя программа получает копию среды материнской программы или любой другой среды, которую может создать материнская программа. Ни одна дочерняя программа не может изменить среду своей материнской программы, а также свою копию среды, если среда материнской программы изменена.
Многие прикладные программы используют среду для установки своих собственных параметров. Например, программа LINK, поставляемая вместе с операционной системой MS-DOS, просматривает среду в поисках "переменной" LIB=, чтобы определить, в каких каталогах файлов находятся имена библиотечных файлов. Используемая мною программа обработки текстов при каждом вызове считывает 10 различных записей среды для установки различных режимов исполнения.
"Переменные" среды можно использовать в командных файлах, окаймляя имя "переменной" знаками %. Если в среду внесена "переменная" с помощью указанного выше примера команды set, то любое вхождение %ABC% в командном файле будет заменено на xyz. Командные файлы, используемые для установки макроассемблера MASM 5.0, могут служить хорошими примерами использования подобных возможностей.
Из рис.3 видно, каким образом программа может прочитать свою копию среды. Вначале она считывает из своего ПСП сегментную часть адреса среды, а затем изображает каждую запись среды, пока не обнаружит двух завершающих нулевых байтов. Как показывает эта программа, в операционной системе MS-DOS 3.x полное имя маршрута для исполняемой программы находится непосредственно за концом среды. Этим можно воспользоваться, чтобы выяснить, не переименовал ли пользователь программу, и чтобы определить, на каком дисководе и в какой области файлов находится программа.
Рис.3. Программа считывает содержимое среды, т.е. области памяти, которая создается программой COMMAND.COM для каждой вызываемой ею программы
ОБЩИЙ ПУЛ БАЙТОВ
Программа, приведенная на рис.4, показывает последнее место, из которого программа может черпать информацию: 16 байтов, начинающихся с адреса 0040:00F0 (или 0:4F0), зарезервированы как область межпрограммной коммуникации (ОМК, в оригинале IAC - inter-application communication). Любая программа может записать предназначенные для другой программы данные в эту область. Более того, если только первая программа непосредственно не вызвала вторую, ОМК нельзя защитить от изменения любой промежуточной программой.
Рис.4. Программа на языке ассемблера считывает содержимое области межпрограммной коммуникации размером 16 байт. Через эту область одна программа может передать данные другой программе
Показанная на рис.4 программа читает и изображает на экране содержимое ОМК. Каждый байт ОМК выводится в форме двузначного шестнадцатеричного числа.
То, что лишь немногие прикладные программы пользуются ОМК, отчасти связано с опасениями, что другие программы могут изменить помещенную в ОМК информацию. Однако ОМК может быть достаточно полезна для передачи адреса от одной программы к другой.
Например, у меня есть несколько процедур на машинном языке, которые мне хотелось бы вызывать при работе с интерпретирующим Бейсиком. По-моему, обычные методы доступа к ним: запоминание их в строковых переменных Бейсика или в начале незанятой памяти - не являются удовлетворительными. Вместо этого я помещаю эту процедуру в короткую программу, которая загружает указатель в ОМК. В таком случае любая программа на Бейсике может воспользоваться командой РЕЕК, чтобы найти эти процедуры и использовать их содержимое для определения внешнего сегмента Бейсика. Затем можно выполнять вызовы процедур, задавая соответствующее смещение в данном сегменте.
Для исполнения приведенных в тексте программ требуются операционная система MS-DOS 2.0 или более поздней версии и макроассемблер MASM фирмы Microsoft.
Gudleifr- Admin
- Сообщения : 3403
Дата регистрации : 2017-03-29
Re: Брябрин. Программное обеспечение персональных ЭВМ. 1990
Напоследок - о трюке, с которым мы уже сталкивались - ТЕМА #67, АБЗАЦ #736 и ТЕМА #41, АБЗАЦ #392 .
Из книги, которая долго ходила из рук в руки только в виде распечаток, поэтому и название и, даже, фамилия автора разночитаются:
Р.ЖУРДЕН/ДЖОРДЕЙН
СПРАВОЧНИК ПРОГРАММИСТА НА ПЕРСОНАЛЬНОМ КОМПЬЮТЕРЕ ФИРМЫ IBM/ТИПА IBM PC, XT И AT
ПРИЛОЖЕНИЕ Г. ВКЛЮЧЕНИЕ АССЕМБЛЕРНЫХ ПРОЦЕДУР В ПРОГРАММЫ НА БЕЙСИКЕ
Процедуры на языке ассемблера состоят из строк байтов машинного кода. При выполнении этой процедуры Бейсик передает управление из последовательности инструкций, составляющих программу на Бейсике, в то место, где хранятся инструкции, которые могут быть декодированы в последовательность инструкций языка ассемблера. При завершении ассемблерной процедуры управление возвращается в то место бейсиковской программы, откуда была вызвана процедура.
В этой книге ассемблерные процедуры, используемые в программах на Бейсике, приведены в двух видах. В обоих видах процедуры включены в программу, а не хранятся в виде отдельного дискового файла. При первом способе требуется, чтобы коды процедуры находились в отдельном месте в памяти, а при втором, менее принятом, этого не требуется.
В первом способе процедура помещается в операторы DATA и программа пересылается в неиспользуемую часть памяти, а затем вызывается оператором CALL. Hадо позаботиться о том, чтобы код процедуры не накладывался на какие-либо данные и наоборот. Обычное решение этой проблемы состоит в том, что процедура помещается в те адреса памяти, к которым Бейсик не может получить доступ. Поскольку интерпретатор Бейсика не может иметь доступ за пределы 64K, то для системы, скажем, с памятью 256K, нужно поместить процедуру в старшие 64K. Для систем с памятью 128K Вы должны вычислить сколько памяти требуется операционной системе, Бейсику и драйверам устройств. Допустимо, чтобы они занимали 25K плюс 64K, используемых Бейсиком. В системах с 64K используйте при старте команду CLEAR, которая ограничивает объем памяти доступный для Бейсика. CLEAR,n ограничивает Бейсик n байтами. Затем поместите процедуру в самые верхние адреса памяти.
Для указания начала области, куда будет помещена процедура, используйте оператор DEF SEG, а затем с помощью оператора READ считываются байты процедуры и помещаются в память до тех пор, пока вся процедура не будет помещена на место. Например:
100 DATA &Hxx, &Hxx, &Hxx, &Hxx, &Hxx '10-байтная процедура
110 DATA &Hxx, &Hxx, &Hxx, &Hxx, &Hxx
...
300 '''помещаем процедуру в память
310 DEF SEG = &H3000 'указываем на область памяти
320 FOR N = 0 TO 9 'для каждого из 10 байтов
330 READ Q 'читаем байт данных
340 POKE N,Q 'помещаем его в память
350 NEXT
После того как процедура загружена в память и Вы хотите ее использовать, необходимо чтобы последний оператор DEF SEG указывал на начало процедуры. Затем присвойте целой переменной значение 0 и напишите оператор CALL с именем этой переменной. Если процедуре передаются параметры, то они должны быть указаны в скобках в конце оператора CALL. Например:
500 DEF SEG = &H3000 'указываем на начало процедуры
510 DOGS = 12 'у нее 3 параметра
520 CATS = 44 '
530 POSSUMS = 1 '
540 CASUALTIES = 0 'начинаем выполнение с 1-го байта
550 CALL CASUALTIES(DOGS,CATS,POSSUMS) 'выполняем процедуру
Имеется намного более простой и экономичный способ создания ассемблерных процедур, который избегает проблемы распределения памяти. Надо просто создать процедуру в виде строковой переменной внутри программы. Каждый байт может быть закодирован с помощью CHR$. Затем используйте функцию VARPTR для определения положения этой строки в памяти. Смещение по которому находится эта переменная хранится в двух байтах, которые идут за тем, на который укажет VARPTR (в первом байте содержится длина строки). Затем этот адрес используется для вызова процедуры. Отметим способ, которым используется оператор DEF SEG, для указания на сегмент данных Бейсика, с тем чтобы полученное смещение указывало на адрес строки для оператора CALL. Например:
100 DEF SEG 'устанавливаем сегмент на данные Бейсика
110 X$ = "CHR$(B4)+..." 'код процедуры
120 Y = VARPTR(X$) 'получаем дескриптор строки
130 Z = PEEK(Y+1)+PEEK(Y+2)*256 'вычисляем ее адрес
140 CALL Z
Многие значения, выражаемые через CHR$() могут быть представлены и в виде символов ASCII. Вы можете писать ROUT = CHR$(12) + "AB" вместо ROUT = CHR$(12) + CHR$(65) + CHR$(66). Hа самом деле большинство символов ASCII могут вводиться путем нажатия клавиши Alt, наборе номера кода на дополнительной клавиатуре, а затем отпускания клавиши Alt. Однако коды от 0 до 31 не могут быть введены таким образом для наших целей.
Из книги, которая долго ходила из рук в руки только в виде распечаток, поэтому и название и, даже, фамилия автора разночитаются:
Р.ЖУРДЕН/ДЖОРДЕЙН
СПРАВОЧНИК ПРОГРАММИСТА НА ПЕРСОНАЛЬНОМ КОМПЬЮТЕРЕ ФИРМЫ IBM/ТИПА IBM PC, XT И AT
ПРИЛОЖЕНИЕ Г. ВКЛЮЧЕНИЕ АССЕМБЛЕРНЫХ ПРОЦЕДУР В ПРОГРАММЫ НА БЕЙСИКЕ
Процедуры на языке ассемблера состоят из строк байтов машинного кода. При выполнении этой процедуры Бейсик передает управление из последовательности инструкций, составляющих программу на Бейсике, в то место, где хранятся инструкции, которые могут быть декодированы в последовательность инструкций языка ассемблера. При завершении ассемблерной процедуры управление возвращается в то место бейсиковской программы, откуда была вызвана процедура.
В этой книге ассемблерные процедуры, используемые в программах на Бейсике, приведены в двух видах. В обоих видах процедуры включены в программу, а не хранятся в виде отдельного дискового файла. При первом способе требуется, чтобы коды процедуры находились в отдельном месте в памяти, а при втором, менее принятом, этого не требуется.
В первом способе процедура помещается в операторы DATA и программа пересылается в неиспользуемую часть памяти, а затем вызывается оператором CALL. Hадо позаботиться о том, чтобы код процедуры не накладывался на какие-либо данные и наоборот. Обычное решение этой проблемы состоит в том, что процедура помещается в те адреса памяти, к которым Бейсик не может получить доступ. Поскольку интерпретатор Бейсика не может иметь доступ за пределы 64K, то для системы, скажем, с памятью 256K, нужно поместить процедуру в старшие 64K. Для систем с памятью 128K Вы должны вычислить сколько памяти требуется операционной системе, Бейсику и драйверам устройств. Допустимо, чтобы они занимали 25K плюс 64K, используемых Бейсиком. В системах с 64K используйте при старте команду CLEAR, которая ограничивает объем памяти доступный для Бейсика. CLEAR,n ограничивает Бейсик n байтами. Затем поместите процедуру в самые верхние адреса памяти.
Для указания начала области, куда будет помещена процедура, используйте оператор DEF SEG, а затем с помощью оператора READ считываются байты процедуры и помещаются в память до тех пор, пока вся процедура не будет помещена на место. Например:
100 DATA &Hxx, &Hxx, &Hxx, &Hxx, &Hxx '10-байтная процедура
110 DATA &Hxx, &Hxx, &Hxx, &Hxx, &Hxx
...
300 '''помещаем процедуру в память
310 DEF SEG = &H3000 'указываем на область памяти
320 FOR N = 0 TO 9 'для каждого из 10 байтов
330 READ Q 'читаем байт данных
340 POKE N,Q 'помещаем его в память
350 NEXT
После того как процедура загружена в память и Вы хотите ее использовать, необходимо чтобы последний оператор DEF SEG указывал на начало процедуры. Затем присвойте целой переменной значение 0 и напишите оператор CALL с именем этой переменной. Если процедуре передаются параметры, то они должны быть указаны в скобках в конце оператора CALL. Например:
500 DEF SEG = &H3000 'указываем на начало процедуры
510 DOGS = 12 'у нее 3 параметра
520 CATS = 44 '
530 POSSUMS = 1 '
540 CASUALTIES = 0 'начинаем выполнение с 1-го байта
550 CALL CASUALTIES(DOGS,CATS,POSSUMS) 'выполняем процедуру
Имеется намного более простой и экономичный способ создания ассемблерных процедур, который избегает проблемы распределения памяти. Надо просто создать процедуру в виде строковой переменной внутри программы. Каждый байт может быть закодирован с помощью CHR$. Затем используйте функцию VARPTR для определения положения этой строки в памяти. Смещение по которому находится эта переменная хранится в двух байтах, которые идут за тем, на который укажет VARPTR (в первом байте содержится длина строки). Затем этот адрес используется для вызова процедуры. Отметим способ, которым используется оператор DEF SEG, для указания на сегмент данных Бейсика, с тем чтобы полученное смещение указывало на адрес строки для оператора CALL. Например:
100 DEF SEG 'устанавливаем сегмент на данные Бейсика
110 X$ = "CHR$(B4)+..." 'код процедуры
120 Y = VARPTR(X$) 'получаем дескриптор строки
130 Z = PEEK(Y+1)+PEEK(Y+2)*256 'вычисляем ее адрес
140 CALL Z
Многие значения, выражаемые через CHR$() могут быть представлены и в виде символов ASCII. Вы можете писать ROUT = CHR$(12) + "AB" вместо ROUT = CHR$(12) + CHR$(65) + CHR$(66). Hа самом деле большинство символов ASCII могут вводиться путем нажатия клавиши Alt, наборе номера кода на дополнительной клавиатуре, а затем отпускания клавиши Alt. Однако коды от 0 до 31 не могут быть введены таким образом для наших целей.
Gudleifr- Admin
- Сообщения : 3403
Дата регистрации : 2017-03-29
Страница 2 из 2 • 1, 2
Похожие темы
» Растригин. С компьютером наедине. 1990
» Броуди. Начальный курс программирования на языке ФОРТ. 1990
» Приложение. В мире науки. Занимательный компьютер. 1983-1990
» Броуди. Начальный курс программирования на языке ФОРТ. 1990
» Приложение. В мире науки. Занимательный компьютер. 1983-1990
Страница 2 из 2
Права доступа к этому форуму:
Вы не можете отвечать на сообщения