ЭВМ и вычислительные системы (В.В. Одиноков, 2002 г. 133 с.)ЛАБОРАТОРНЫЕ РАБОТЫВ процессе выполнения данных лабораторных работ студенты должны получить навык по программированию драйверов для управления ПУ. При этом в качестве ПУ рассматриваются наиболее доступные и распространенные устройства – экран и клавиатура. При выполнении лабораторных работ требуется доступ к MS-DOS, запускаемой в среде операционной системы Windows 95 или 98. А также требуется наличие системных программ: 1) Tasm – транслятор ассемблера; 2) Tlink – редактор связей; 3) Debug – отладчик. Результаты лабораторных работ оформляются в виде файлов, пересылаемых в ТМЦДО на дискете. Все исходные программы (файлы с расширением asm) должны быть снабжены программными комментариями. При этом особое внимание следует уделить вводным комментариям, поясняющим назначение и интерфейсы программных модулей. Лабораторная работа №1. ПРОГРАММИРОВАНИЕ ДРАЙВЕРА ЭКРАНА Требуется реализовать программно нерезидентный драйвер экрана с видеоадаптером CGA, логическая схема которого приведена на рис.40. Кроме того, требуется разработать прикладную программу, выполняющую вывод на экран ваших фамилии и имени, и, возможно, другой информации (по вашему усмотрению), используя для вывода на экран ваш драйвер. Цвет символов, выводимых на экран, а также цвет фона должны быть выбраны из таблицы 3 в зависимости от номера вашего варианта. 1 черный зеленый 2 синий коричневый 3 зеленый красный 4 голубой черный 5 красный сиреневый 6 сиреневый зеленый 7 коричневый голубой 8 белый черный 9 серый ярко-красный 10 ярко-синий ярко-зеленый 11 ярко-зеленый ярко-белый 12 ярко-голубой ярко-красный 13 ярко-красный желтый 14 ярко-сиреневый ярко-синий 15 желтый ярко-голубой 16 ярко-белый желтый 17 серый ярко-красный 18 ярко-синий серый 19 ярко-зеленый ярко-синий 20 ярко-голубой желтый Результат выполнения работы оформляется в виде двух файлов c расширением asm (исходные тексты прикладной программы и драйвера) и одного файла с расширением com (загрузочный модуль прикладной программы и драйвера). Все файлы должны быть помещены в каталог LAB1. Рекомендуемый план отладки Рекомендуется выполнять отладку драйвера экрана не целиком, а постепенно наращивая его функции в соответствии со следующим планом. Шаг 1. Прикладная программа выполняет вызов процедуры инициализации, за которым следуют ожидание нажатия клавиши и возврат в MSDOS. Процедура инициализации выполняет только очистку экрана заданным цветом фона. Шаг 2. Отличается от шага 1 только тем, что процедура инициализации выполняет не только очистку экрана, но и первоначальную установку курсора. Шаг 3. Прикладная программа выполняет вызов процедуры инициализации, за которым следуют ожидание нажатия клавиши. Далее она в цикле вызывает процедуру вывода символа, передавая ей каждый раз на вход код следующего символа из символьной строки, заданной в прикладной программе. Данная строка завершается каким-то особым байтом, например, 24h. После завершения вывода прикладная программа ожидает нажатия клавиши и выполняет возврат в MS-DOS. Шаг 4. Отличается от шага 3 тем, что выводимая на экран символьная строка содержит кроме других символов «возврат каретки» и «перевод строки». Примечание 1. При выполнении отладки обычно требуется уметь остановить выполнение программы в заданной точке. В данной работе при выполнении прикладной программы подобная остановка используется дважды. Во-первых, после завершения процедуры инициализации, так как требуется время на перемещение курсора. Во-вторых, программа приостанавливается перед возвратом в MS-DOS. В противном случае сразу же после возвращения управления из прикладной программы в MS-DOS, последняя заменит на экране выходные данные программы своими данными. Для выполнения остановки программы можно воспользоваться системным вызовом BIOS «ожидание ввода с клавиатуры» – INT 16h (функция 0), поместив в программу строки: MOV AH, 0 ; Номер функции INT 16h ; Вызов подпрограммы BIOS Примечание 2. Обе программы не должны содержать системных вызовов MS-DOS и BIOS, выполняющих вывод на экран. Примечание 3. При отладке подпрограммы, выполняющей работу с курсором, надо помнить, что подпрограммы MS-DOS и BIOS, выполняющие вывод на экран, будут игнорировать вашу установку курсора и вернут его в то положение, которое он занимал до начала выполнения вашей программы (соответствующее 2-х байтовое значение хранится в области данных BIOS). Например, если вы пользуетесь отладчиком, то во время работы курсор перестает “слушаться” вашу программу и не двигается с места. Примечание 4. Так как драйвер экрана и прикладная программа находятся в разных исходных файлах, то имена программных процедур, выполняющих реализацию логических процедур «Инициализация экрана» и «Вывод символа» должны быть перечислены в операторах PUBLIC и EXTRN, причем оператор EXTRN с атрибутом NEAR. Примечание 5. Если программная процедура выполняет запись в регистр DS, то в начале этой процедуры обязательно требуется сохранить, а в конце ее восстановить прежнее содержимое этого регистра. Иначе в вызывающей программе будет нарушена адресация данных. Лабораторная работа №2. ПРОГРАММИРОВАНИЕ ДРАЙВЕРА КЛАВИАТУРЫ Требуется разработать программу нерезидентного драйвера клавиатуры, выполняющего запросы прикладных программ по вводу символов с клавиатуры. Драйвер должен обрабатывать управляющую клавишу Для проверки работоспособности драйвера клавиатуры используется прикладная программа, которая, используя драйвер клавиатуры, выполняет ввод символьной строки с клавиатуры в свой внутренний (прикладной) буфер. Получив код символа $ (24h), прикладная программа выводит содержимое своего буфера на экран, используя для этого драйвер экрана, полученный в результате первой лабораторной работы. При правильной работе программы введенная с клавиатуры строка должна отобразиться на экране дважды: один раз при наборе на клавиатуре (эхо символов), а второй раз – как результат вывода на экран содержимого прикладного буфера. Результат выполнения работы оформляется в виде двух файлов с расширением asm (исходные тексты прикладной программы и драйвера клавиатуры) и одного файла с расширением com (загрузочный модуль, включающий прикладную программу, а также драйверы экрана и клавиатуры). Все файлы должны быть помещены в каталог LAB2. Алгоритм программной реализации логической процедуры «Инициализация» состоит из следующих шагов: Шаг 1. Если u=1 переход на шаг 4 . Шаг 2. Сохранение в ОП прежнего содержимого вектора прерываний с номером 09h. Шаг 3. Запись стартового адреса обработчика прерываний клавиатуры в вектор прерываний с номером 09h. Переход на шаг 5. Шаг 4. Восстановление прежнего содержимого вектора прерываний с номером 09h. Шаг 5. Возврат из процедуры. Алгоритм обработчика прерываний клавиатуры включает шаги: Шаг 1. Разрешение маскируемых прерываний. Шаг 2. Сохранение в программном стеке содержимого регистров. Шаг 3. Запись в сегментный регистр DS значения, которое соответствует адресу-сегменту данных обработчика прерываний. Шаг 4. Чтение из порта 60h значения SCAN-кода. Шаг 5. Установка бита 7 порта 61h. Шаг 6. Сброс бита 7 порта 61h. Шаг 7. Если была отпущена клавиша Шаг 8. Если было отпускание клавиши, то переход на шаг 14. Шаг 9. Если буфер полон, то переход на шаг 14. Шаг 10. Перекодировка SCAN-кода в символ ASCII. Шаг 11. Запись символа ASCII в буфер драйвера. Шаг 12. Вывод «эха» полученного символа на экран. Шаг 13. Если полученный символ является символом «возврат каретки» (этот символ есть результат нажатия Шаг 14. Выдача в программируемый контроллер прерываний команды для разрешения менее приоритетных прерываний. Шаг 15. Восстановление содержимого регистров из стека. Шаг 16. Возврат из прерывания в прерванную программу. Дополнение к шагам 5 и 6. Порт 61h используется не только клавиатурой (она использует только бит 7), но и другими устройствами. Поэтому к моменту завершения шага 6 содержимое этого порта должно быть тем же, что было до начала шага 5. Дополнение к шагам 7 и 10. Большинству клавиш соответствует не один, а два символа. Например, одна и та же клавиша соответствует символам «1» и «!». Каждой большой (прописной) букве соответствует малая (строчная). Для того чтобы обработчик прерываний выполнял правильное преобразование SCAN-кода в код ASCII, необходимо ввести понятие “состояние клавиатуры”. В одном состоянии в буфер драйвера записывается код ASCII большой буквы, а во втором – малой. Часто состояния клавиатуры называют «нижним регистром» и «верхним регистром». Для отслеживания состояния клавиатуры обработчик прерываний должен иметь двоичную переменную «флаг статуса клавиатуры». Для управления этим флагом рекомендуется использовать управляющую клавишу При программировании шага 10 удобно свести значения SCANкодов и соответствующих кодов ASCII в единую таблицу. Первая строка этой таблицы может иметь вид: Tabl DB 02h, ‘1’, ‘!’ Строка таблицы, соответствующая пробелу: DB 39h, ‘ ‘, ‘ ‘ В данной таблице отсутствует строка, соответствующая управляющему символу CapsLock. В качестве последнего байта таблицы рекомендуется взять нулевой байт. Шаг11 рекомендуется реализовать в виде программной процедуры. Алгоритм подпрограммы «Ввод символа» состоит из следующих шагов: Шаг 1. Сохранение в программном стеке содержимого регистров. Шаг 2. Если буфер пуст, то возврат в программу с соответствующим значением признака результата. Шаг 3. Переписка символа из буфера в регистр, используемый для передачи символа из подпрограммы в вызывающую программу. Шаг 4. Увеличение указателя «взять» и уменьшение счетчика символов. Шаг 5. Если указатель «взять» вышел за границу буфера, то установка его на начало буфера. Шаг 6. Восстановление регистров из стека. Шаг 7. Возврат из подпрограммы с соответствующим значением признака результата. Рекомендуемый план отладки Отладку программы драйвера клавиатуры рекомендуется выполнить в два этапа. Этап 1. Обеспечение вывода на экран содержимого прикладного буфера, а также обеспечение вывода на экран «эха» символов, вводимых с клавиатуры. В прикладной буфер с помощью псевдооператора DB записывается какая-то символьная строка, заканчивающаяся каким то особым символом, например, с кодом 24h. Прикладная программа сначала вызывает процедуру инициализации экрана, а затем процедуру инициализации клавиатуры с параметром u=0. Затем она выводит посимвольно содержимое прикладного буфера на экран с помощью соответствующей процедуры драйвера экрана. При достижении конечного символа (с кодом 24h) прикладная программа в цикле вызывает процедуру драйвера клавиатуры «Ввод символа» до тех пор, пока от нее не будет получен символ с определенным кодом, в качестве которого опять можно использовать 24h. После этого прикладная программа вызывает процедуру инициализации клавиатуры с параметром u=1 и делает возврат в MS-DOS. Обработчик прерываний клавиатуры должен правильно реагировать на нажатие каждой клавиши, помещая (если нужно) ее код в буфер драйвера клавиатуры и выводя эхо символа на экран (с помощью процедуры драйвера экрана). Этап 2. Окончательная отладка драйвера клавиатуры. Для этого изменяется прикладная программа, использовавшаяся на шаге 1: после завершения инициализации экрана и клавиатуры прикладная программа выполняет ввод с клавиатуры (с помощью процедуры «Ввод символа») строки символов в свой прикладной буфер. Ввод в прикладной буфер производится до тех пор, пока прикладная программа не получит символ с кодом 24h. Далее повторяются действия этапа 1: прикладная программа выводит содержимое своего прикладного буфера на экран, а затем в цикле вызывает процедуру «Ввод символа». При получении кода 24h восстанавливается системный обработчик прерываний клавиатуры и делается возврат в MSDOS. Примечание. Разработанные программы не должны содержать системных вызовов MS-DOS и BIOS, выполняющих информационный обмен с клавиатурой и экраном. КОНТРОЛЬНАЯ РАБОТА № 2. РАЗРАБОТКА ПРОГРАММЫ НА АССЕМБЛЕРЕ Целью выполнения данной работы является проверка навыков программирования на ассемблере задач, описание которых приведено в настоящем пособии. Результаты контрольной работы представляются в виде файлов на дискете: 1) файл (файлы) с расширением asm – исходный модуль (модули) разработанной программы (программ); 2) файл (файлы) с расширением com – загрузочный модуль (модули) разработанной программы (программ). Общие требования к программам: ? обязательное наличие комментариев в исходных модулях - заголовков к программным модулям и построчных комментариев; ? текст каждого исходного модуля должен быть представлен в коде ASCII. (Такой текст может быть получен, например, с помощью текстового редактора, встроенного в Norton commander); ? запрещается применение команд для процессоров, отличных от i8086; ? обязательное наличие выходных сообщений программы, предваряющих ввод пользователя с клавиатуры; ? обязательное наличие выходных сообщений в случае ошибок при выполнении системных вызовов. Разработка некоторых программ предполагает использование для ввода и вывода не системных вызовов MS-DOS и BIOS, а собственных драйверов экрана и клавиатуры, полученных ранее при выполнении лабораторных работ. Наличие такого требования обязательно отмечается в соответствующем задании на программирование. В этом случае результаты контрольной работы должны включать, кроме перечисленных выше файлов, загрузочные модули используемых драйверов (копии файлов, представленных в результатах лабораторных работ). Кроме того, некоторые программы должны быть резидентными. Это требование также обязательно отмечается в задании. Вариант 1. Резидентная программа инициируется нажатием клавиши Примечание. Для вывода на экран следует использовать свой драйвер экрана. Вариант 2. Резидентная программа инициируется нажатием клавиши Примечание. Для вывода на экран следует использовать свой драйвер экрана. Вариант 3. Разработать простейший отладчик программ, который получает имя загрузочного модуля прикладной программы в качестве своего параметра, и выполняет эту программу покомандно, выдавая после завершения каждой ее команды на экран содержимое регистров AX и BX в шестнадцатеричной системе счисления. (Некоторый аналог команды T Debug.) Примечание 1. Работа программы основана на запуске трассируемой программы и обработке исключения «Трассировка» (см. замечание в конце п.2.6.2). Примечание 2. Для вывода на экран шестнадцатеричного содержимого регистров можно использовать программную процедуру, алгоритм которой рассматривается в [2]. Вариант 4. Разработать простейший отладчик программ, который вводит с клавиатуры имя загрузочного модуля прикладной программы, и выполняет эту программу покомандно, выдавая после завершения каждой ее команды на экран содержимое регистров CX и DX в двоичной системе счисления. (Некоторый аналог команды T Debug.) Примечание 1. Работа программы основана на запуске трассируемой программы и обработке исключения «Трассировка» (см. замечание в конце п.2.6.2). Примечание 2. Для вывода на экран двоичного содержимого регистров можно использовать программную процедуру, алгоритм которой рассматривается в [2]. Вариант 5. Разработать простейший интерпретатор команд, выполняющий обработку командных файлов (bat-файлов). Имя командного файла вводится с клавиатуры. Имя запускаемой программы (строка bat-файла) не имеет параметров. После завершения запуска очередной программы на экран выводится сообщение об успешности запуска. Вариант 6. Разработать простейший интерпретатор команд, выполняющий обработку командных файлов (bat-файлов). Имя командного файла интерпретатор команд получает при своем запуске (в качестве параметра команды). Имя запускаемой программы (строка bat-файла) не имеет параметров. После завершения запуска очередной программы на экран выводится сообщение об успешности запуска. Вариант 7. Прикладная программа выполняет запуск другой (дочерней) прикладной программы, получив предварительно ее имя с клавиатуры. При своем запуске дочерняя программа получает на входе (в PSP) строку символов, которую она выводит на экран. Примечание. Для вывода на экран дочерняя программа должна использовать ваш драйвер экрана. Вариант 8. Прикладная программа выполняет запуск другой (дочерней) прикладной программы, получив ее имя в качестве своего параметра (хвоста команды). При своем запуске дочерняя программа получает на входе (в PSP) строку символов, которую она выводит на экран. Примечание. Для вывода на экран дочерняя программа должна использовать ваш драйвер экрана. Вариант 9. Прикладная программа выводит на экран содержимое своего блока окружения. Примечание. Для вывода на экран программа должна использовать ваш драйвер экрана. Вариант 10. Прикладная программа выполняет уничтожение файла. Имя уничтожаемого файла вводится с клавиатуры. Примечание. Для ввода с клавиатуры и для вывода на экран следует использовать ваши драйверы. Вариант 11. Прикладная программа вводит с клавиатуры имя нового текстового файла, записывает в него содержимое своего блока окружения, а также «хвоста», а затем выводит содержимое этого файла на экран. Вариант 12. Прикладная программа вводит с клавиатуры имя существующего текстового файла, «дописывает» в него содержимое своего блока окружения, а также «хвоста», а затем выводит содержимое этого файла на экран. Вариант 13. Резидентная программа инициируется из прикладной программы, выполняя вывод на экран блока окружения и «хвоста» прикладной программы. Примечание. Для того чтобы обрабатывать данные вызывающей программы, содержимое регистров сегментов данных должно соответствовать прикладной, а не резидентной программе. Вариант 14. Прикладная программа вводит с клавиатуры имена двух существующих текстовых файлов, а затем инициирует резидентную программу (передав ей на вход через PSP имена файлов), которая «расширяет» первый файл, добавив в него содержимое второго файла. Вариант 15. Прикладная программа вводит с клавиатуры имя существующего текстового файла, а затем выводит его содержимое на экран. Примечание. Для вывода на экран следует использовать свой драйвер экрана. Вариант 16. Прикладная программа получает в качестве параметра команды имя существующего текстового файла, а затем выводит его содержимое на экран. Примечание. Для вывода на экран следует использовать свой драйвер экрана. Вариант 17. Прикладная программа вводит с клавиатуры имя текстового файла, содержащего имена других текстовых файлов. А затем выводит на экран содержимое этих текстовых файлов. Вариант 18. Прикладная программа получает в качестве параметра команды имя текстового файла, содержащего имена других текстовых файлов. А затем выводит на экран содержимое этих текстовых файлов. Вариант 19. Прикладная программа выполняет копирование файла. Имена исходного файла и файла-копии вводятся с клавиатуры. Примечание. Для вывода на экран следует использовать свой драйвер экрана. Вариант 20. Прикладная программа выполняет копирование файла. Имя исходного файла вводится с клавиатуры, а имя файла-копии программа получает в качестве параметра команды. Примечание. Для вывода на экран следует использовать свой драйвер экрана.
ОТПРАВИТЬ ЗАЯВКУ |
---|