Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Математики и Естествознания



Ф. 4-71

Министерство образования и науки Республики Казахстан

 

Павлодарский государственный педагогический институт

  

Кафедра информатики

 

 

Программа обучения

Дисциплина Системное программное обеспечение

                                                                            

для специальностей 5В011100 «Информатика»

 

 

Павлодар   

 

 

Ф.4-72

УТВЕРЖДАЮ

Декан Факультета

Математики и Естествознания

___________ М.Алинова

«___» _____________ 201_г.

 

Составитель: _______ ст. преп. Б.Исабекова, К.Кусманов, Ж.Копеев

 

Кафедра информатики

 

Программа обучения

По дисциплине Системное программное обеспечение

 

Для студентов специальностей «Информатика»

 

 

Программа разработана на основании рабочей учебной программы, утвержденной «____» ___________ 201_г.

 

Рекомендовано на заседании кафедры

«___» _____________ 201_г., протокол № ___

 

 

Заведующий кафедрой ____________ А.Асамбаев

 

Одобрено УМС факультета метематики и естествознания

«___» _____________ 201_г., протокол № ___

 

Председатель УМС _____________ А.Анафина

 

 



Содержание программы обучения по дисциплине

«Системное программное обеспечение»

Наименование документа Автор Примечание
Рабочая программа дисциплины для студента (силлабус) Исабекова Б., Кусманов К., Копеев Ж.  
Карта обеспеченности учебной и учебно-методической литературой дисциплины Исабекова Б., Кусманов К., Копеев Ж.  
Лекционный комплекс Исабекова Б., Кусманов К., Копеев Ж.  
План практических (семинарских) занятий и методические указания к ним Исабекова Б., Кусманов К., Копеев Ж.  
Перечень заданий, график выполнения и сдачи заданий по дисциплине, материалы для СРО Исабекова Б., Кусманов К., Копеев Ж.  
Материалы по контролю и оценке учебных достижений обучающихся Исабекова Б., Кусманов К., Копеев Ж.  

 


Рабочая программа дисциплины для студента

 


Данные о преподавателях

Исабекова Бибигуль Бейсенбаевна(e-mail:[email protected]), Кусманов Куат Ризахметович ([email protected]) (лекции, практические занятия, СРСП). Приемные часы на кафедре - по расписанию консультаций для группы.

Цель преподавания дисциплины

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

Целью курса является изучение теоретических основ построения и практического использования системного программного обеспечения как эффективного средства обработки данных в ЭВМ применительно к конкретным условиям работы компьютерных систем обработки информации и управления.

Задачи изучения дисциплины

- обучение студентов систематизированным представлениям о принципах, методах и средствах реализации системного программирования ЭВМ, вычислительных систем и сетей;

- приобретение практических навыков работы с системным программированием ПЭВМ, необходимых при проектировании систем.

В результате изучения дисциплины студенты должны знать:

- процессы функционирования систем и способы их описания;

- особенности использования ресурсов программно - технического комплекса;

- принципы организации мультипрограммых режимов в условиях реального масштаба времени и разделения времени;

- способы обеспечения диалогового взаимодействия с ЭВМ и ВК;

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

В результате изучения дисциплины студенты должны уметь:

- ставить и решать конкретные задачи по применению средств системного программирования ЭВМ и сетей для организации процессов обработки информации в компьютере;

- обеспечивать заданные требования к режимам функционирования ресурсов;

- оценивать эффективность работы различных операционных систем.

Компетенции:

- способность решения проблем,

- осуществлять конфигурирование операционных систем,

- использования ресурсов программно-технического комплекса,

- способность работать самостоятельно,

- способность к организации и планированию,

- способность применять знания на практике.

Пререквезиты. Для глубокого усвоения дисциплины студент должен усвоить теоретические и лабораторно-практические занятия по дисциплине программирование, объектно-ориентированное программирование, информатика, теоретические основы информатики.

Постреквизиты. В свою очередь дисциплина «программирование II», «Исследование операций», «Основы искусственного интеллекта».

Ф. 4-70

Тематический план дисциплины

«Системное программное обеспечение»

Очная форма обучения, на базе ОСО

Тематический план дисциплины

п/п

Наименование тем

Количество часов

Лек Прак Лаб СРС+СРСП
1 Определение и структура системного программного обеспечения        
2 Операционные системы        
3 Управление процессами в операционных системах        
4 Управление памятью в операционных системах        
5 Управление вводом - выводом        
6 Механизмы синхронизации        
ИТОГО 30 15 90

Очная форма обучения, на базе СПО

Тематический план дисциплины

 

п/п

Наименование тем

Количество часов

 
Лек Прак Лаб

СРС+СРСП

1 Определение и структура системного программного обеспечения      

 

2 Операционные системы      

 

3 Управление процессами в операционных системах      

 

4 Управление памятью в операционных системах      

 

5 Управление вводом - выводом      

 

6 Механизмы синхронизации      

 

ИТОГО 30 15

90

             

Заочная форма обучения, на базе ОСО

Тематический план дисциплины

п/п

Наименование тем

Количество часов

Лек Прак Лаб СРС+СРСП
1 Определение и структура системного программного обеспечения        
2 Операционные системы        
3 Управление процессами в операционных системах        
4 Управление памятью в операционных системах        
5 Управление вводом - выводом        
6 Механизмы синхронизации        
ИТОГО 4 2 84

КОМПОНЕНТЫ курса

Тема 2 Операционные системы

Задачи операционной системы. Основные принципы построения операционных систем. Классификация операционных систем. Понятие операционной среды. Понятие ресурса. Файловые системы.

Содержание практических занятий

Тема 2 Операционные системы

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

Итого

90

 

Содержание самостоятельной работы студентов заочного отделения

Вид СРС Форма отчетности Вид контроля Объем в часах
1 Подготовка к лекционным занятиям. Конспект Проверка конспекта 20
2 Подготовка к лабораторным, практическим занятиям, выполнение домашних заданий Файлы с выполнен. заданием ДЗ (выполнение домашних практических заданий) 20
4 Изучение материала, не вошедшего в содержание аудиторных занятий Конспект, реферат Защита реферата 20
6 Выполнение индивидуальных заданий Файлы с заданием Проверка задач 20
7 Подготовка к контрольным мероприятиям - РК1, РК2 (тестирование) 4

Итого

84

 

Темы, предлагаемые студентам для самостоятельного изучения

1. Программы и программное обеспечение

2. Системное программирование

3. Этапы подготовки программы

4. Назначение и основные функции операционной системы.

5. Файловая система.

6. Основные свойства файловых систем

7. Управление использованием времени центрального процессора.

8. Управление подкачкой и буфером ввода.

9. Управление разделяемыми ресурсами.

10. Управление оперативной памятью

11. Планирование

12. Внешние устройства

13. Аппарат прерываний

14. Аппаратная поддержка мультипрограммирования

15. Семафоры

16. Мониторы

17. Сообщения

Литература

Основная

1.  Климова Л.М. Си++. Практическое программирование. Решение типовых задач: Учебное пособие. – М.: КУДИЦ-ОБРАЗ, 2005

2. Самоучитель программирования на языке С++ в системе Borland C++ Builder 4.0. – М.: Инфраком-Пресс, 2006

3. Порогов В.Ю. Ассемблер: Учебный курс. – 2-е изд. – СПб.: БВХ-Петербург, 2007

 

Дополнительная

4. Юров В.И. Ассемблер: Учебн пособие для студентов ВУЗов. – 2-е изд. – СПб: Питер, 2003

5. ГордеевА.В., Молчанов А.Ю. Системное программное обеспечение. – СПб.: Питер, 2001

 

 


Карта обеспеченности учебниками и учебными пособиями студентов по дисциплине «Системное программное обеспечение»


В библиотеке ПГПИ

Перечень основной и дополнительной литературы

(название, автор, издательство, год издания)

 

Формат издания

Количество книг

Библиотека Кафедра

Основная литература

  Учебное пособие 5 -
  Учебное пособие 1 -
  Учебное пособие 2 -

Дополнительная литература

  Учебное пособие 4 -
  Учебное пособие 5  
  Учебное пособие 2  
  учебник 10  
  Учебное пособие 1  

 

 



Лекционный комплекс

Тема 2 Операционные системы

План

1. Назначение и основные функции операционной системы.

2. Файловая система.

3. Основные свойства файловых систем

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

Любая операционная система (ОС) оперирует некоторыми сущностями, которые вместе со способами управления ими во многом характеризуют ее свойства. К таким сущностям могут относиться понятия файла, процесса, объекта, и т.д. Каждая ОС имеет свой набор таких сущностей. К примеру, в ОС Windows NT к таким сущностям можно отнести понятие объекта, и уже через управление этой сущностью предоставляются все возможные функции.

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

Основные свойства файлов

1. Файл - это некий объект, имеющий имя, и позволяющий оперировать с содержимым файла через ссылку на это имя. Обычно имя - это последовательность некоторых символов, длина которой зависит от конкретной операционной системы.

2. Независимость файла от расположения. Для работы с конкретным файлом не требуется иметь информацию о местоположении этого файла на внешнем устройстве.

3. Набор функций ввода/вывода. Практически каждая операционная система однозначно определяет набор функций, обеспечивающий обмен с файлом.

Обычно, этот набор функций состоит из следующих запросов:

1. Открыть файл для работы. Открыть можно либо уже существующий, либо новый файл. Может возникнуть вопрос - зачем открывать файл? Почему нельзя сразу читать и писать в этот файл? На самом деле, это есть средство, для того чтобы централизованно объявить операционной системе, что файл будет работать с конкретным процессом. А она уже из этих сведений может принять какие-то решения (например, блокирование доступа в этот файл для других процессов).

2. Чтение/запись. Обычно обмен с файлами может организовываться некоторыми блоками данных. Блок данных, с которым происходит обмен, несет двоякую сущность. С одной стороны, для любой вычислительной системы известны размеры блоков данных, которые наиболее эффективны для обмена, то есть это программно-аппаратные размеры. С другой стороны, эти блоки данных при реальном обмене могут варьироваться достаточно произвольно программистом. В функциях чтения/записи обычно фигурирует размер блока данных для обмена и количество блоков данных, которые необходимо прочесть или записать. От выбранного размера блока данных может зависеть эффективность реальных обменов, потому что, предположим для некоторой машины размером эффективного блока данных является 256Кб, а вы хотите обмены проводить по 128Кб, и вы выполняете два обращения для прочтения ваших логических блоков по 128Кб. Очень вероятно, что вместо того, чтобы за один обмен прочесть блок в 256Кб, вы обращаетесь два раза к одному блоку и читаете сначала одну половину, а затем другую. Здесь есть элементы неэффективности, хотя они могут сглаживаться «умной» операционной системой, а если она не сглаживает, то это уже ваша вина.

3. Управление файловым указателем. Практически с каждым открытым файлом связывается понятие файлового указателя. Этот указатель, по аналогии с регистром счетчика команд, в каждый момент времени показывает на следующий относительный адрес по файлу, с которым можно произвести обмен. После обмена с данным блоком указатель переносится на позицию через блок. Для организации работы с файлом требуется уметь управлять этим указателем. Имеется функция управления файловым указателем, которая позволяет произвольно (в пределах доступного) перемещать указатель по файлу. Указатель есть некоторая переменная, доступная программе, которая связана с функцией открытия файла (создающей эту переменную).

4. Закрытие файла. Эта операция может осуществляться двумя функциями: закрыть и сохранить текущее содержимое файла; уничтожить файл.

После закрытия файла все связи с ним прекращаются, и он приходит в некоторое каноническое состояние.

Защита данных. Многие стратегические решения повторяются как на аппаратном уровне, так и на уровне операционной системы. Если мы вспомним мультипрограммный режим, то одним из необходимых условий его существования является обеспечение защиты (памяти и данных). Файловая система так же, как и операционная система, может быть однопользовательской. В этом случае проблемы защиты данных не существует, потому что человек, который работает с этой операционной системой, является хозяином всех файлов. Примеры однопользовательских систем - MS-DOS или Windows 95. Можно загрузить машину и уничтожить все файлы других пользователей, которые размещены на диске, потому что в этих системах защиты нет никакой. Многопользовательская система обеспечивает корректную работу многих пользователей. MS-DOS также может работать в режиме мультипрограммирования, но он не достаточно корректен, потому что ошибка в одном процессе может привести к затиранию операционной системы и соседнего процесса. Также и в операционной системе Windows 95 может работать много пользователей, но эта работа некорректна, потому что эта операционная система не обеспечивает все права защиты. Итак, многопользовательская система должна обеспечивать защиту информации от несанкционированного доступа. На самом деле, проблема защиты связана не только с файловой системой. Реально операционная система обеспечивает защиту данных во всех областях: это и файлы, и процессы, и ресурсы, принадлежащие процессам, запущенным от имени одного пользователя. Здесь я обращаю ваше внимание на этот факт, потому что для файлов это наиболее критичная точка.

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

Давайте рассмотрим некоторое пространства ВЗУ, и рассмотрим, как мы можем организовать размещение файлов в пределах этого пространства.

1. Одноуровневая организация файлов непрерывными сегментами. Термин «одноуровневая» означает, что система обеспечивает работу с файлами уникально именованными. В пределах пространства ВЗУ выделяется некоторая область для хранения данных, которая называется каталог. Каталог имеет следующую структуру:

имя начальный блок конечный блок
     

Рисунок 3 – Структура каталога

«Начальный блок» ссылается на некоторый относительный адрес пространства ВЗУ, с которого начинается файл с заданным именем. «Конечный блок» определяет последний блок данного файла. Функция открытия файла сводится к нахождению в каталоге имени файла и определении его начала и конца (реально данные могут занимать несколько меньше места, об этом будет сказано позже). Это действие очень простое, к тому же каталог можно хранить в памяти операционной системы, и тем самым уменьшить количество обменов. Если создается новый файл, то он записывается на свободное место. Аналогично каталогу имен может иметься таблица свободных пространств (фрагментов).

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

Что будет, когда нужно записать в такой файл дополнительную информацию, а свободного пространства за этим файлом нет? В этом случае система может поступить двояко. Первое, она скажет, что нет места и вы должны сделать что-то сами, например, запустить некий процесс, который перенесет этот файл в другое место и добавит нужную информацию. Этот перенос - функция достаточно дорогостоящая. Вторая возможность - в обмене будет отказано. Это означает, что при открытии файла нужно было заранее зарезервировать дополнительное место; при этом файловая система проверяет размер свободного буфера, и если его мало, то ищет свободное место там, где этот файл разместится.

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

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

2. Файловая система с блочной организацией файлов. Пространство ВЗУ разделено на блоки (те самые блоки, которые эффективны для обмена). В файловой системе такого типа распределение информации происходит аналогично распределению информации процесса в оперативной памяти со страничной организацией. В общем случае, с каждым именем файла связан набор номеров блоков устройства, в которых размещены данные этого файла. Причем, номера этих блоков имеют произвольный порядок, то есть блоки могут быть разбросаны по всему устройству в произвольном порядке. При такой организации нет фрагментации, хотя могут быть потери кратные блоку (если файл занял хотя бы один байт в блоке, то весь блок считается занятым). Следовательно, нет проблем компрессии, и эта система может использоваться при многопользовательской организации.

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

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

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

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

3. Иерархическая файловая система. Все файлы файловой системы построены в структуру, которая называется деревом. В корне дерева находится, так называемый, корень файловой системы. Если узел дерева является листом, то это файл, который может содержать данные пользователя, либо являться файлом-каталогом. Узлы дерева отличные от листа являются файлами-каталогами.

Именование в такой иерархической файловой системе может происходить разными способами. Первый тип - именование файла относительно ближайшего каталога, т. е. если мы посмотрим файлы, которые являются ближайшими для каталога F0, - это файл F1, который является также каталогом, и файл F2. Для успешного именования в такой системе на одном уровне не могут повторяться имена. С другой стороны, так как все файлы связаны с помощью дерева, мы можем говорить о, так называемом, полном имени файла, которое составляется из всех имен файлов, которые составляют путь от корня файловой системы к конкретному файлу. Полное имя файла F3 будет обозначаться так: /F0/F1/F3. Такая организация хороша тем, что она позволяет работать как с коротким именем файла (если системно подразумевается, что мы работаем в данном каталоге), так и с полным именем файла. Полные имена файлов есть пути, а в любом дереве от его корня до любого узла существует единственный путь, следовательно, этим решается проблема унификации имен. Первый раз такой подход был использован в операционной системе Multix, которая разрабатывалась в университете Беркли в конце 60-х годов. Это красивое решение стало появляться впоследствии во многих операционных системах. Согласно этой иерархии, каждому из файлов можно привязывать какие-то атрибуты, связанные с правами доступа. Правами доступа могут обладать как пользовательские файлы, так и каталоги. Структура этой системы хороша для организации многопользовательской работы, за счет отсутствия проблемы именования, и такая система может очень хорошо наращиваться.

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

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

Если мы с вами посмотрим на любимую нами операционную систему MS-DOS, то там не было понятия пользователя со всеми вытекающими последствиями - она однопользовательская.

Второй уровень операционных систем - это операционные системы, которые позволяют регистрировать пользователей, но все пользователи представляются в виде единого набора некоторых субъектов и не связаны друг с другом никак. Примером таких операционных систем могут служить некоторые операционные системы фирмы IBM для mainframe-компьютеров. Например, лектор не знает, кто из его слушателей к какой группе относится, но все, сидящие перед ним, пользователи его курса. Это и хорошо, и плохо. С точки зрения прослушивания курса лекций - это хорошо, но для проведения этим лектором какого-то опроса это плохо, потому что за один день он не успеет опросить всех. Ему надо будет всех слушателей как-то поделить, а как - не известно.

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

Соответственно, аналогично файловой системе, появляется иерархическая организация пользователей. То есть у нас имеется понятие «все пользователи» и понятие «группа пользователей». В группе есть реальные пользователи. Такая иерархическая организация персонификации влечет за собой следующие моменты. При регистрации какого-то пользователя необходимо сначала привязать его к какой-то группе - это может быть лаборатория, кафедра или учебная группа. Так как пользователи объединены в группы, то появляется возможность разделения прав доступа к ресурсам пользователей. То есть пользователь может, например, заявить, что все его ресурсы доступны для всех пользователей группы. Такая схема может быть многоуровневой (группы делятся на подгруппы и т.д.) с соответственным распределением прав и возможностей. Сейчас появляются операционные системы, в которых права доступа могут определяться не только такой иерархической структурой, но и могут быть более сложными, т. е. права доступа можно добавлять, нарушая эту иерархию.

 

 

План практических (семинарских) занятий и методические указания к ним

 

 

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

- для компьютера на своем рабочем месте определить:

- тип компьютера;

- конфигypацию оборудования;

- объем оперативной памяти;

- наличие и объем расширенной памяти;

- наличие дополнительных ПЗУ;

- версию операционной системы.

Пример решения задачи

Структура данных программы

Программа использует, так называемый, список оборудования - 2-байтное слово в области данных BIOS по адресу 0040:0010. Назначение разрядов списка оборудования такое:

- 0 установлен в 1, если есть НГМД

- 1 установлен в 1, если есть сопроцессор

- 2,3 число 16-Кбайтных блоков ОЗУ на системной плате

- 4,5 код видеоадаптера: 11 - МDА, 10 - CGA, 80 колонок, 01 - CGA, 40 колонок, 00 - другой

- 6,7 число НГМД -1 (если в разряде 0 единица)

- 8 9, если есть канал ПДП

- 9,10,11 число последовательных портов RS-232

- 12 1, если есть джойстик

- 13 1, если есть последовательный принтер

- 14,15 число параллельных пpинтеров

Структура программы

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

Описание переменных

Переменные, применяемые в программе:

- t уре_РС - байт типа компьютера, записанный в ПЗУ BIOS по адресу FF00:0FFE;

- а, b - переменные для определения объема extended-памяти ПЭВМ, а - младший байт, b - старший байт;

- konf_b - 2-байтное слово из области данных BIOS, которое содержит список оборудования;

- type - массив символьных строк, представляющих типы компьютера;

- typlA - массив байт, содержащий коды типов дисплеев;

- types1A[] - массив строк, содержащий названия типов дисплеев;

- j - вспомогательная переменная, которая используется для идентификации типа дисплея;

- seg - сегмент, в котором размещено дополнительное ПЗУ;

- mark - маркер ПЗУ;

- bufVGA[64] - буфер данных VGA, из которого (при наличии VGA) мы выбираем объем видеопамяти;

- rr и sr - переменные, которые используются для задания значения регистров общего назначения и сегментных регистров, соответственно, при вызове прерывания.

Текст программы

/ **************"Проверка состава оборудования"********** /

/* Подключение стандартных заголовков */

#include <dos.h>

#include <conio.h>

#include <stdio.h>

/*------------------------------------------------------------------- */

void main()

{

unsigned char type_PC, /* Тип компьютера */

а,b; /* Переменные для определения характеристик памяти ПЭВМ */

unsigned int konf_b; /* Байт конфигурации из BIOS */

char *type[]={"AT", "PCj r", "ХТ", "IBM РС", "unknown"};

unsigned char typ1A[]={0, 1,2,4,5,6,7,8, 10, 11, 12,Oxff};

char *types1A[]={"нет дисплея","МDА, MOHO","CGA, цв.",

"EGA, ЦВ.","ЕGА, MOHO","PGA, цв.",

"VGA, моно, анал.", "VGA, кол., анал.",

"MCGA, кол., цифр.", "MCGA, моно, анал."

"MCGA, кол., анал.", "неизвестный тип",

"непредусмотренный код"};

unsigned int j; /* Вспомогательная переменная */

unsigned int seg;    /* Сегмент ПЗУ */

unsigned int mark=0xAA55; /* Маркер ПЗУ */

unsigned char bufVGA[64]; /* Буфер данных VGA */

union REGS rr;

struct SREGS sr;

textbackground(0);

clrscr();

textattr(0x0a);

срrintf (" Лабораторная работа ");

cprintf( "\nПроверка состава оборудования");

/* Определения типа компьютера */

type_PC=peekb(0xF000,0xFFFE);

if( (type_PC-=0хFС)>4)

type_PC=4;

textattr(0x0b) ;

срrintf("\nТип компьютера: ");

textattr(0x0f);

cprintf("%s\n\r",type[type_PC]);

/* Конфигурация*/

konf_b=peek(0x40,0x10); /* Чтение байта оборудования из памяти BIOS */

textattr(0x0b);

cprintf( "Конфигурация :\n\r");

/* Количество дисководов */

textattr (0х0е ) ;

cprintf(" Дисководов ГМД:                       ");

textattr(0x0f);

if(konf_b&0x0001)

cprintf( "%d\n\r" , (( konf _b&0х000C0 )>>6 )+1);

else

cprintf( "нет\n\r");

textattr ( 0х0е);

cprintf(" Математич. сопроцессор: ");

textattr (0x0f) ;

if(konf_b&0x0002)

cprintf( "есть\n\r");

else

cprintf( "нет\n\r");

textattr (0х0е) ;

cprintf(" Тип дисплейного адаптера: ");

textattr(0x0f);

/* Определение активного адаптера */

/* Предположим наличие VGA */

rr.h.ah=0x1a;

rr.h.al=0;

int86(0x10,&rr,&rr);

if(rr.h.al= =0x1a) /* Поддерживается функция 1Ah прерывания 10h * /

for(j=0;j<12;j++)

if(rr.h.bl= =typ1A[j])

break;

cprintf( "%s", types1A[j]);

if(j>O && j<12)

{

rr.h.ah=0x1b;

гг.х.bх=0;

sr.es=FP_SEG(bufVGA);

rr.x.di=FP_OFF(bufVGA);

int86x(0x10,&rr,&rr,&sr);

cprintf(", %d Кбайт\n\r", ((int)bufVGA[49]+1)*64);

}

else

cprintf("\n\r");

}

else

{

/* Предположим наличие EGA */

rr.h.ah=0x12;

rr.h.bl=0x10;

int86(0x10,&rr,&rr);

if(rr.h.bl!=0x10) /* Поддерживается функция 12h прерывания 10h */

{

cprintf( "EGA");

if(rr.h.bh)

cprintf(" моно");

else

cprintf(" кол. ");

cprintfc(", %d Кбайт\n\r" , ((int)rr.h.bl+1)*64);

}

else

{

/* CGA или MDA */

switсh(kопf_b&0х0030)

{

case 0: cprintf( "EGA/VGA\n\r"); break;

case 0х10: cprintf("CGA, 40\n\r"); break;

case 0х20: cprintf("CGA, 80\n\r"); break;

case 0х30: cprintf( "MDA"); break;

}

}

}

/* Блоки ОЗУ на системной плате */

textattr(0x0e) ;

cprintf("\n\r Первичный блок памяти: ");

textattr(0x0f);

switch (konf_b&0x000C)

{

case 0 : cprintf("16 Кбайт\n\r"); break;

case 4:срrintf("З2 Кбайт\n\r");brеаk;

case 8:cprintf("48 Кбайт\n\r"); break;

case 12: cprintf( "64 Кбайт или больше\n\r"); break;

/* Количество последовательных портов RS-232 */

textattr (0х0е);

cprintf(" Портов RS2З2:      ");

textattr(0x0f);

cprintf( "%d\n\r", (konf _b&0х0Е00)>>9);

/* Наличие джойстика */

textattr(0x0e);

cprintf(" Джойстик: ") ;

 textattr (0x0f);

if(konf_b&0x1000 )

cprintf( "есть \n\r");

else

cprintf( "нет\n\r");

/* Количество параллельных принтеров */

textattr (0х0е);

cprintf(" Принтеров: ");

textattr(0x0f) ;

cprintf( "%d\n\n\r", (konf _b&0хС000)>>14);

/* Объем оперативной памяти */

textattr( 0х0е);

сргintf("Объем оперативной памяти: ");

textattr(0x0f) ;

cprintf("%d Кбайт\n\r", peek(0x40, 0х1З));

textattr (0х0е);

/* Наличие и объем ехtеndеd-памяти */

outportb(0x70,0x17);

a=inport(0x71) ;

outportb(0x70,0x18);

b=inport(0x71);

cprintf( "Объем ехtеndеd-памяти: ");

textattr(0x0f) ;

cprintf("%6d Кбайт\n\n\r", (b<<8) |a);

/* Наличие дополнительных ПЗУ */

for( seg=0xC000;seg<0xFFB0;seg+=0x40)

/* Просмотр памяти от C000:0 с шагом 2 К */

if(peek(seg,0)= =mark) /* Маркер найден */

{

textattr( 0х0а);

cprintf( "Адрес ПЗУ =");

textattr( 0x0f);

cprintf(" %04x",seg);

textattr(0x0a) ;

cprintf(" Длина модуля = ");

textattr(0x0f) ;

cprintf ("%d", 512*peekb(seg, 2));

textattr (0х0а) ;

cprintf(" байт\n\r",рееkb(sеg,2));

}

/* Определение версии операционной системы */

rr.h.ah=0x30;

intdos(&rr,&rr);

textatt r (0х0с) ;

cprintf ("\n\rВерсия MS-DOS ");

textatt r (0x0f);

cprintf("'%d. %d\n\r", rr. h. а1, rr. h. ah);

textatt r (0х0а ) ;

gоtоху(30, 24);

cprintf ("'Нажмите любую клавишу");

textattr(0x07) ;

getch();

c1rscr();

}

 

Результаты работы программы

В процессе работы программы на экран была выведена такая информация:

Лабораторная работа

Проверка состава оборудования

Тип компьютера: АТ

Конфигурация:

Дисководов ГМД:  2

Математич. сопроцессор: есть

Тип дисплейного адаптера: VGA, кол., анал., 256 Кбайт

Первичный блок памяти: 16 Кбайт

Портов RS2З2:       2

Джойстик: нет

Принтеров: 1

Объем оперативной памяти: 6З9 Кбайт

Объем ехtеndеd-памяти: З84 Кбайт

Адрес ПЗУ = C000. Длина модуля = 24576 байт

Версия MS-DOS 6.20


 


Тема 2 Операционные системы

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

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

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

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

- «теннисный мячик» - шарик, который летает по экрану и отражается от рамок и границ экраны;

- «сухой лист» - опадание букв с экрана;

- «жук-пожиратель» - фигурка, которая перемещается по экрану по случайной траектории и «съедает» буквы;

- «удав» - то же, что и «жук», но к тому же он увеличивается в размерах, по мере «поедания» букв.

Пример решения задачи

Индивидуальное задание:

- весь экран (80х25 символов) условно делится на прямоугольники размером (10x5 символов).

- текущий прямоугольник инвертирует экран под собой.

- управлять положением текущего прямоугольника на экране можно с помощью клавиш управления курсором.

- при нажатии клавиши «пробел» текущий прямоугольник обменивается содержимым с левым верхним прямоугольником.

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

- после этого, используя клавиатуру, можно восстановить начальный экран или выйти из программы (клавиша Esc).

Разработка алгоритм решения

Структура программы

Программа состоит из основной функции шаin() и семи вспомогательных функций.

byte GetSym(xl,yl) - функция читает символ с заданной позиции экрана дисплея.

byte GetAtr(xl,yl) - функция читает атрибут символа с заданной позиции экрана дисплея.

void PutSym(xl,yl,sym) - функция выводит на экран дисплея символ в заданную позицию (хl,уl).

void PutAtr(xl,yl,atr) - функция меняет на экране дисплея атрибут символа в заданной позиции (хl,уl).

void Invert(xl,yl) - функция инвертирует участок на экране размером (10х5), координаты (хl,уl) задают один из участков на экране.

void Change(x,y) - функция обменивает содержимое текущего участка с содержимым левогo верхнегo участка на экране. Координаты (х,у) задают положение текущего участка.

void RandText(void) - функция псевдослучайным образом перетасовывает все участки на экране.

Описание переменных

Переменные, глобальные для всей программы:

xk - координата Х текушеro участка;

yk - координата У текушего участка;

Координаты участка задаются в пределах: Х - [0..7], У - [0..4] .

Текст программы

/* --------------------------Лабораторная работа ---------------------*/

/* -----------------------Управление видеоадаптером------------------*/

#include <dos.h>

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <time.h>

/*----------------------Константы------------------------------------*/

#define VSEG 0хЬ800 /* Сегментный адрес видеопамяти */

#define byte unsigned char

#define word unsigned int

#define Esc 27

#define Spase 32

#define Enter 13

#define Up 0х48

#define Down 0х50

#define Left 0х4h

#define Right 0x4d

#define Ноmе 0х47

int xk, yk;

/*----------------------Чтение символа из видеопамяти --------------*/

byte GetSym(x1,y1)

int х1, у1;

{

return(peekb(VSEG,y1*160+x1*2));

}

/*-------------------Чтение атрибута из видеопамяти ----------------*/

byte GetAtr(x1,y1)

int х1, у1 ;

{

return(peekb(VSEG,y1*160+x1*2+1));

}

/*-------------------3апись символа в видеопамять ------------------*/

void PutSym(x1,y1,sym)

int х1, у1 ;

byte sym;

{

pokeb(VSEG,y1*160+x1*2,sym);

}

/*--------------------3апись атрибута в видеопамять ----------------*/

void PutAtr(x1,y1,atr)

int х1, у1 ;

byte atr;

{

pokeb(VSEG,y1*160+x1*2+1,atr);

}

/*---------------------Инверсия квадрата на экране ------------------*/

void Invert(x1,y1)

int х1, у1;

{

byte b;

int i,j;

for (j=0;j<5;j++)

for (i=0;i<10;i++)

{

b=GetAtr(x1*10+i,y1*5+j);

PutAtr(x1*10+i,y1*5+j, (b-0x7f));

}

}

/*--------------3амена текущего квадрата на левый верхний------*/

void Change(x,y)

byte х, у;

{

int i, j ;

byte bа, bs;

if ((x!=0)||(y!=0))

for (j=0;j<5;j++)

for (i=0;i<10;i++)

{

bs=GetSym(x*10+i,y*5+j);

ba=GetAtr(x*10+i,y*5+j);

PutSym(x*10+i,y*5+j,GetSym(i,j));

PutAtr(x*10+i,y*5+j,GetAtr(i,j));

PutSym(i, j , bs);

PutAtr(i,j,ba);

}

}

/*-------Перемешивание квадратов до нажатия клавиши----------*/

void RandText(void)

{

Invert(xk, yk);

xk=5;

yk=1 ;

while(! kbhit())

{

Change(xk, yk);

xk++; I

if (xk>7) xk=0;

yk++;

if (yk>4) yk=0;

}

Invert(xk, yk);

}

/*----------------------------Начало основной программы-------------*/

mаin(int argn,char *argc[])

{

int i;

 

xk=0;

yk=0;

if (argn>1){}

else         /* Если параметров нет, вывод инструкции */

{

textattr(10);

clrscr();

cprintf(“------------------------------“);

cprintf(“-------- Лабораторная работа------------------“);

cprintf(“------------------------------“);

cprintf(“------------------------------“);

cprintf(“ Управление видеоадаптером.”)

cprintf(“------------------------------“);

textattr( 15);

gotoxy(23, 4); срrintf(“Демонстрация работы с видеопамятью."); textattr(12);

gotoxy(30,6);cprintf(“« М О 3 А И К А »”);

textattr(14);

gotoxy(30, 8); cprintf (“Клавиши управления: “);

gotoxy(7, 10); cprintf(“< Left, Right, Up, Down> - “);

cprintf( “управление выделенным квадратом. “);

gotoxy(7, 11);cprintf(“<Spase Ваr> - Обмен содержимым “);

          cprintf( “между выделенным квадратом”);

gotoxy(7, 12);cprintf(“         и левым верхним”);

          cprintf(“ квадратом. “);

gotoxy(7, 13); cprintf(“<Enter> - перемешивание квадратов");

cprintf( “ до нажатия любой клавиши. “);

gotoxy(7,14);cprintf("<Esc> - выход.”);

textattr( 11);

gotoxy(28, 16);срrintf(“З А Д А Ч А    И Г Р Ы :”);

gotoxy(14, 17);срrintf(“Собрать при помощи клавиш “);

срrintf(“управления начальный экран. “);

textattr(12);

gotoxy(27, 19);срrintf(“Ж е л а е м у с п е х а ,”-);

textattr(7);

gоtоху(1,21);срrintf(“Примечание: При запуске с”);

          срrintf(“параметром <->”);

gotoxy( 1 3,22); cprintf( “начальным экраном для игры “);

          cprintf( “является текущий. “);

}

Invert(xk, yk);

for(i=0;i= =0; )

switch(getch() )

{ /* Обработка нажатых клавиш */

case Esc: i++; break;

case Enter:RandText();break;

case Spase:Invert(xk,yk);

 

Change(xk, yk);

Invert(xk, yk);

break;

case 0:

switch (getch()) {

case Left:Invert(xk,yk);

xk--;

if(xk<0) xk=7;

Invert(xk, yk);

break;

case Right:Invert(xk,yk);

xk++;

if (xk> 7) xk=0;

Invert(xk, yk);

break;

case Up:Invert(xk,yk);

yk--;

if(yk<0) yk=4;

Invert(xk, yk);

break;

case Down:Invert(xk,yk);

yk++;

if (yk>4) yk=0;

Invert(xk, yk);

break;

}

Invert(xk, yk);

}



Результаты работы программы

Результаты работы программы выводятся на экран терминала и меняются интерактивно.

 

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

Построить модель аналого-цифрового преобразователя (АЦП), которая работает в реальном времени. Процесс, который дискретизуется, моделируется программой (программным блоком), который выполняет циклическое вычисление функции y=F(x), где х - номер итерации. Преобразователь моделируется программой, которая выполняет с заданной частотой (в реальном времени) прерывание процесса, считывание и запоминание текущего значения функции. Запомнить не меньше 80 значений функции. Обеспечить наглядное представление результатов работы «АЦП».

Индивидуальные задания

Для получения более наглядного представления «процесса» допускается подбирать другие коэффициенты функции. Частоту дискретизации выдерживать с точностью до 1 ГЦ.

Пример решения задачи

Индивидуальное задание

функция - у=50*(Sin(x/10)+соs(х/8))+R+150;

R - в диапазоне 0 - 10;

частота - 36.4 Гц.

Текст программы


#inсludе <dos.h>

#inсludе <math.h>

#inсludе <stdlib.h>

#inсludе <graphics.h>

#inсludе <time.h>

#include <conio.h>

 

#define TIMEINT 8 /* Прерывание таймера */

#define NN 100 /* максимальное количество показаний */

 

void interrupt (*oldtime)(); /* Новый обработчик прерываний таймера */

void interrupt newtime(); /* Старый обработчик прерываний таймера */

static int y[NN]; /* Накопитель показаний */'

static int nу; /* Индекс в массиве у */

static int ус; /* Текущее значение        */,

static int kf; /* Счетчик вызовов oldtime */

union REGS rr; /* Запись нового вектора */

struct SREGS sr;

void *readvect(int in); /*Получение старого вектора */

void writevect(int in,void*h); /* Запись нового вектора */

/*------------------------------------------------------------------------------*/

void main()

{

unsigned oldtic=65535u; /* Старый коэффициент деления*/

unsigned newtic=32768u; /* Новый козфф. деления */

unt dd,      /* Графический драйвер */

 

m,            /* Графический режим */

errorcode;      /* Код ошибки       */

double х; /* Аргумент функций sin и cos */

 

textbackground(0);

clrscr();

textattr(0x0a);

cprintf(" Лабораторная работа “)

срrintf ("\n Управление таймером” )

textattr(0x8e); ,

gotoxy(35, 12);

cprintf("Please wait");

/* Программирование канала 0 */

оutроrtb(0х43,0хЗ6); /* Управляющий байт */ outportb(0x40,newtic&0x00ff); /* Младший байт счетчика */ outportb(0x40,newtic>>8); /* Старший байт счетчика */

nу= -1; /* Признак того, что АЦП еще не началось */

kf=15;

/* Подключение к вектору */

oldtime=readvect(TIMEINT);

writevect(TIMEINT,newtime);

/* Запуск "непрерывного процесса" */

randomize ( );

for (х=nу=О; ny<NN; х+=1)

yc=(int)(50*(sin(x/10)+cos(x/8))+random(11)+150);

/* Восстановление вектора */

writevect(TIMEINT,oldtime);

/* Восстановление канала 0 */

outportb(0x43,Ox36); /* Управляющий байт */ outportb(0x40,01dtic&0x00ff); /* Младший байт счетчика */ outportb(0x40,01dtic>>8); /* Старший байт счетчика */

 

/* Вывод запомненных результатов */

dd=З; /* EGA, 16 цветов */

m=1; /* Режим 640*З50 */

initgraph(&dd,&m, "");

/* проверка результата инициализации */

errorcode = graphresult();

if (errorcode != gr0k) /* ошибка графического режима */

{

printf ("Graphics error: %s\n", grapherrormsg( errorcode));

printf( "Press аny key to halt:");

getch() ;

exit (1) ; /* аварийное завершение */

}

setcolor( 10);

settextstyle(0, 0, 2);

outtextxy(15, 10, "Результати аналого-цифрового преобразования:");

 

setcolor(9) ;

rесtаnglе(15,40, 624,330);

setcolor(11);

for(ny=0; ny<NN; nу++)

{

сirсlе(22+nу*6,330-у[nу]*1,2);

linе(22+nу*6,330,22+nу*6,330-у[nу]*1);

}

setcolor( 12);

settextstyle(0,0,1);

оuttехtху(260,З40, "Нажмите любую клавишу ….”);

getch() ;

closegraph() ;

}

/* Новый обработчик прерываний таймера */

void intеrruрt nеwtimе()

{

if (--kf<0) {

/* Виклик oldtime - на 2-й раз */

(*oldtime)();

kf=1;

}

else /* иначе - сброс контроллера */

outportb(0x20,0x20);

if ((nу>=0) /* Если АЦП началось, */

&&(nу<NN)) /* и NN показаний еще не набрано, */

у[nу++]=ус; /* запоминание очередного показания */

}

 

/* Получение старого вектора */

void *rеаdvесt(int in)

{

rr.h.аh=0хЗ5; rr.h.al=in;

intdоsх(&rr,&rr,&sr);

rеturn(МК_FР(sr.еs, rr.x.bх));

}

/* Запись нового вектора */

void writеvесt(int in, void *h)

{

rr.h.ah=0x25;

rr.h.аl=in;

sr.ds=FP_SEG(h);

rr.x.dx=FP_OFF(h);

intdosx(&rr,&rr,&sr);

}




Результаты работы программы

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

 

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

По индивидуальному заданию создать функцию для обработки символьных строк. За образец брать библиотечные функции обработки строк языка С, но не применять их в своей функции. Предусмотреть обработку ошибок в задании параметров и особые случаи. Разработать два варианта заданной функции - используя традиционную обработку массивов и используя адресную арифметику.

Индивидуальные задания

1. Функция Compress(s,t) Назначение: замена в строке s множественных вхождений символа t на одно

2. Функция Words(s) Назначение: подсчет слов в строке s

3. Функция Concat(s1,s2) Назначение: конкатенация строк s1 и s2 (аналогичная библиотечная функция С - strcat)

4. Функция Parse(s,t) Назначение: разделение строки s на две части: до первого вхождения символа t и после него

5. Функция Center(s1,s2,k) Назначение: центрирование -размещение строки s1 в середине строки s2 длиной k

6. Функция Delete(s,n,k) Назначение: удаление из строки s подстроки, начиная с позиции n, длиной k (аналогичная библиотечная Функция есть в Pascal).

7. Функция Left(s,k) Назначение: выравнивание строки s по левому краю до длины k.

8. Функция Rlght(s,k) Назначение: выравнивание строки s по правому краю до длины k.

9. Функция Insert(s,s1,n) Назначение: вставка в строку s подстроки s1, начиная с позиции n (аналогичная библиотечная функция есть в Pascal).

10. Функция Reverse(s) Назначение: изменение порядка символов в строке s на противоположный.

11. Функция Pos(s,s1) Назначение: поиск первого вхождения подстроки s1 в строку s (аналогичная функция С - strstr).

12. Функция LastPos(s,s1) Назначение: поиск последнего вхождения подстроки s1 в строку s.

13. Функция Wordlndex(s,n) Назначение: определение позиции начала в строке s слова с номером n.

14. Функция WordLength(s,n) Назначение: определение длины слова с номером n в строке s.

15. Функция SubWord(s,n,kl). Назначение: выделение из строки s k слов, начиная со слова с номером n.

16. Функция WordCmp(s1,s2) Назначение: сравнение строк (с игнорированием множественных пробелов).

17. Функция StrSpn(s,s1) Назначение: определение длины той части строки s, которая содержит только символы из строки s1.

18. Функция StrCSpn(s,s1) Назначение: определение длины той части строки 8, которая не содержит символы из строки 81.

19. Функция Overlay(s,s1,n) Назначение: перекрытие части строки s, начиная с позиции n, строкой s1.

20. Функция Replace(s,s1,s2) Назначение: замена в строке s комбинации символов s1 на s2.

Пример решения задачи

Функция substr(s,n,l) Назначение: выделение из строки s подстроки, начиная с позиции n, длиной 1.

Описание метода решения

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

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

Определим состав параметров функции: int substr (src, dest, num, len);

где:      

src - строка, с которой выбираются символы;

dest - строка, в которую записываются символы;

num - номер первого символа в строке src, с которого начинается подстрока

(нумерация символов ведется с 0);

len - длина выходной строки.

Возможные возвращаемые значения функции установим: 1 (задание параметров правильное) и 0 (задание не правильное). эти значения при обращениях к функции можно будет интерпретировать как «истина»или «ложь».

Обозначим через Lsrc длину строки src. Тoгдa возможны такие варианты при задании параметров:

num+len <= Lsrc - полностью правильное задание;

num+len> Lsrc; num < Lsrc - правильное задание, но длина выходной строки будет меньше, чем len;

num >= Lsrc - неправильное задание, выходная строка будет пустой;

num < 0 или len <= 0 - правильное задание, выходная строка будет пустой.

Заметим, что интерпретация конфигурации параметров как правильная/неправильная и выбор реакции на неправильное задание - дело исполнителя. Но исполнитель должен строго выполнять пpинятыe правила. Возможен также случай, Кoгдa выходная строка выйдет большей длины, чем для нее отведено места в памяти. Однако, поскольку нашей функции неизвестен размер памяти, отведенный для строки, функция не может распознать и обработать этот случай - так же ведут себя и библиотечные функции языка С.

Данные для тестирования

Тестирование должно обеспечить проверку работоспособности функций для всех вариантов входных данных. Входные данные, на которых должно проводиться тестирование, сведены в таблицу:

 

Таблица 1 – Входные данные

Вариант src num len dest
1 012345 5 2 23
  012345 0 1 0
  012345 0 6 012345
2 012345 5 3 5
  012345 2 6 2345
  012345 0 7 012345
3 012345 8 2 пусто
4 012345 -1 2 пусто
  012345 5 0 пусто
  012345 5 -1 пусто

 

 



Текст программы

/*************************************************/

/******** Файл LAB1.C ****************************/

 #include <stdio.h>

#/define N 80

/*************************************************/

/* Функция выделения подстроки (массивы)*/

/*************************************************/

int substr_mas(char src[N],char dest[N],int num,int len){

int i, j;

/* проверка случая 4 */

if ( (num<0)II(len<=0) ) {

dest[0]=0; return 0;

           }

/* выход на num-ый символ */

for (i=0; i<=num; i++)

/* проверка случая 3 */

if ( src[i]=='\0') {

dest[0]=0; return 0;

}

/* перезапись символов */

for (i--, j=0; j<len; j++, i++) {

dest[j ]=src[i];

/* проверка случая 2 */

if ( dest[j]=='\0') return 1;

}

/* запись признака конца в выходную строку */

dest[j ]=' \0' ;

return 1;

}

/.****************.*****************************/

/* Функция выделение подстроки */

/* (адресная арифметика) */

int substr_ptr(char *src, char *dest, int пum, int len) {

/* проверка случая 4 */

if ( (num<0)||(len<=0) ) return dest[0]=0;

/* выход на num-ый символ или на конец строки */

while (num -- && *src++ );

/* проверка случая 3 */

if ( ! num) return dest[0]=0;

/* перезапись символов */

while ( len-- && *src ) *dest++=*src++;

/* запись признака конца в выходную строку */

*dest=0;

return 1;

}

/****************.*****************************/

main()

{

chaг ss[N), dd[N);

int n, 1;

clrscr() ;.

ргlntf("Вводите строку:\n");

gets(ss) ;

printf( "начало=");

scanf( "%d", &n);

printf( "длина=");

scanf("%d",&l);

рrintf("Массивы:\n") ;

if (substr _mаs(ss, dd, n, l» printf("»%s«\n»%s«\n", ss, dd);

еlsе рrintf("Ошибка! »%s«\n", dd);

dd[0]='\0' ;

printf( "Адресная арифметика: \n");

if (substr -ptr(ss, dd, n,l» printf("»%s«\n»%s«\n", ss, dd);

else рrintf("Ошибка! »%s«\n". dd);

getch();

}


 


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

Разработать программу обработки прерывания от клавиатуры, которая должна:

- распознавать нажатие «горячей» комбинации клавиш и реагировать на него звуковым сигналом;

- при первом нажатии «горячей» комбинации переходить в режим блокировки ввода заданной клавиши, при втором - отменять этот режим;

- системная обработка всех других клавиш нарушаться не должна.

Индивидуальные задания

1. комбинация клавиш LeftCtrI+RightSblft+F1; блокирование ввода клавиши 1.

2. комбинация клавиш RightCtrI+LeftSblft+F2; блокирование ввода клавиши 2.

3. комбинация клавиш RightCtrI+LeftSblft +F4; блокирование ввода клавиши 4.

4. комбинация клавиш LeftCtrI+RightSblft+F5; блокирование ввода клавиши 5.

5. комбинация клавиш LeftAlt+RightSblft+F6; блокирование ввода клавиши 6.

6. комбинация клавиш LeftCtrI+RightAlt+F7; блокирование ввода клавиши 7.

7. комбинация клавиш LeftCtrI+RightSblft+F8; блокирование ввода клавиши 9.

8. комбинация клавиш LeftCtrI+LeftSblft+F9; блокирование ввода клавиши 8.

9. комбинация клавиш RightCtrI+RightSblft+F3; блокирование ввода клавиши 4.

10. комбинация клавиш LeftCtrI+RightSblft+F9; блокирование ввода клавиши 1.

11. комбинация клавиш RightCtrI+LeftSblft+F8; блокирование ввода клавиши 2.

12. комбинация клавиш RightCtrI+LeftSblft +F7; блокирование ввода клавиши 4.

13. комбинация клавиш LeftCtrI+RightSblft+F6; блокирование ввода клавиши 5.

14. комбинация клавиш LeftAlt+RightSblft+F5; блокирование ввода клавиши 6.

15. комбинация клавиш LeftCtrI+RightAlt+F4; блокирование ввода клавиши 7.

16. комбинация клавиш LeftCtrI+RightSblft+F3; блокирование ввода клавиши 9.

17. комбинация клавиш LeftCtrI+LeftSblft+F2; блокирование ввода клавиши 8.

18. комбинация клавиш RightCtrI+RightSblft+F1; блокирование ввода клавиши 4.

19. комбинация клавиш LeftCtrI+RightAlt+F5; блокирование ввода клавиши 7.

20. комбинация клавиш LeftAlt+RightAlt+F3; блокирование ввода клавиши 3.

Пример решения задачи

Индивидуальное задание: комбинация клавиш LeftCtrI+RightSblft+F3; блокирование ввода клавиши 3.

Разработка алгоритма

Структура программы

Программа состоит из основной программы и трех функций.

- void *readvect(int in) - функция читает вектор прерывания с номером in и возвращает его значение.

- void writevect (int in, void * h ) - функция устанавливает новый вектор прерывания in на новый обработчик этого прерывания по адресу h.

- void i n tе rr uрt new9() - процедура нового обработчика прерывания 9h.

Описание переменных

Глобальные переменные программы: old9 - адрес старого обработчика прерывания 9h; FЗ_соdе - скан-код клавиши «F3», которая входит в комбинацию «горячих» клавиш; kеу3_соdе - скан-код клавиши«3», которая будет блокироваться/разблокироваться при каждом нажатии «горячей» комбинации клавиш; f - флаг, который при каждом нажатии «горячей» комбинации клавиш переключается из состояния 0 в 1 или из 1 в 0 (состояние 1 означает, что клавиша «3» заблокирована); rr и sr - переменные, которые используются для задания значений регистров общего назначения и сегментных регистров соответственно при вызове прерывания.

В главной программе использует символьный массив string для проверки работы программы.

Переменные процедуры обработки прерывания 9h:

- с - переменная, которая используется для подтверждения приема из клавиатуры, в случае, если была нажата клавиша «3», а флаг f показывал, что эта клавиша заблокирована;

- х, у - переменные, которые используются для сохранения координат курсора на экране в момент вызова процедуры обработки прерывания;

- byte17 - байт флага состояния клавиатуры в области данных BIOS по адресу 0040:0017;

- byte18 - байт флага состояния клавиатуры в области данных BIOS по адресу 0040:0018;

- mask - маска, которая используется для определения нажатия клавиши левый Shift (в этом случае бит 1 в byte17 установлен в 1);

- mask17 - маска, которая используется для определения нажатия клавиши Ctrl (в этом случае бит 2 в byte17 установлен в 1);

- mask18 - маска, которая используется для определения нажатия клавиши левый Ctrl (в этом случае бит 0 в byte18 установлен в 1);

 

Текст программы


/*----------- Лабораторная работа -----------------*/

/*------------ ---------------------------Управление клавиатурой-------------------*/

/* Подключение стандартных заголовков */

#include <dos.h>

 

void interrupt (*old9)(); /* Старый обработчик прерывания 9h */

void interrupt new9(); /* Новый обработчик прерывания 9h */

void *readvect (int in); /* Чтение вектора                   */

void writevect (int in,void *h); /* Запись вектора               */

 

unsigned char F3_code=61; /* scan-code “F3” */

unsigned char key3_code=4; /* scan-code “3”   */

char f=0; /* Флаг                                       */

union REGS rr;

struct SREGS sr;

 

/*------------------------------------------------------------------------------*/

void mein()

{

char string [80]; /* Буфер для ввода текста */

textbackground(0);

clrscr() ;

textattr (0х0а) ;

cprintf(“--- -------------------“);

cprintf(“ Лабораторная работа “)

cprintf(“--------------------“);

cprintf(“--------------------“);

cprintf(“ Управление клавиатурой “)

cprintf(“--------------------“);

 

old9=readvect(9);

writevect(9,new9);

textattr (0х0с) ;

cprintf(“\n\n\r\ “ горячая\” комбинация: “);

textattr(0x0a) ;

cprintf(“Left Shift, Right Ctrl, FЗ\n\r”);

textattr (0х0b) ;

cprintf( “Клавиша, которая блокируется: “);

textattr(0x0f) ;

cprintf( “3”);

textattr(0x07);

cprintf( "\r\n Вводите строку символов>’);

scanf(“%s”, string);

writevect(9,old9);

}

/*-------------------------------------------------------------------- */

/* Чтение вектора */

void *readvect(int in)

{

гг.h.аh=0хЗ5;

rr.h.al=in;

intdosx(&rr,&rr,&sr);

return(MK_FP(sr.es, rr.х.bx));

}

/*-------------------------------------------------------------------- -------------------------------*/

/* Запись вектора */

void writevect(int in,void *h)

{

rr.h.ah=0x25;

rr.h.al=in;

sr.ds=FP_SEG(h);

rr.x.dx=FP_OFF(h);

intdosx(&rr.&rr.&sr);

}

/*-------------------------------------------------------------------- -------------------------------*/

/* Новый обработчик 9-го прерывания */

void interrupt nеw9()

{

unsignеd char с,x,у;

unsignеd char byte17,byte18;

unsignеd char mask=0x02;

unsignеd char mask17=0x04;

unsignеd char mask18=0x01;

 

byte17=peekb(0x40,0x17);

byte18=peekb(0x40,0x18);

if((inроrtb(0х60)= =F3_соdе)&&(bуtе17&mаsk)&&

(byte17&mask17)&&(!(byte18&mask18)))

{

cputs( "\7");

x=wherex() ;

y=whe rеу () ;

gotoxy(55, 3); .

textattr(0x1e);

if( f= =O)

{

f=1 ;

срrintf( "Клавиша \"3\" заблокирована");

 }

else

{

f=O;

срrintf("Клавиша \"3\" разблокирована");

}

gotoxy(x, у);

textattr(0x07) ;

(*old9)() ;

}

if( (f= =1) && (inportb(0x60)= =key3_code) )

 {

с=inроrtb(0x61);

outportb(0x61, c|0x80);

outportb(0x61, c);

outportb(0x20,0x20);

}

else

(*old9)() ;

}




Результаты работы программы

Во время программы при первом нажатии комбинации клавиш LeftCtrl+ RightShift+ FЗ программа переходит в режим блокирования вводу клавиши 3, при втором - отменяет этот режим.

 

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

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

Индивидуальные задания

1. Все нулевые элементы размещены в левой части матрицы

2. Все нулевые элементы размещены в правой части матрицы

3. Все нулевые элементы размещены выше главной диагонали

4. Все нулевые элементы размещены в верхней части матрицы

5. Все нулевые элементы размещены в нижней части матрицы

6. Все элементы нечетных строк - нулевые

7. Все элементы четных строк - нулевые

8. Все элементы нечетных столбцов - нулевые

9. Все элементы четных столбцов - нулевые

10. Все нулевые элементы размещены в шахматном порядке, начиная с 1-ro элемента 1-й строки

11. Все нулевые элементы размещены в шахматном порядке, начиная со 2-ro элемента 1-й строки

12. Все нулевые элементы размещены на местах с четными индексами строк и столбцов

13. Все нулевые элементы размещены на местах с нечетными индексами строк и столбцов

14. Все нулевые элементы размещены выше главной диагонали на не­четных строках и ниже главной диагонали - на четных

15. Все нулевые элементы размещены ниже главной диагонали на нечетных строках и выше главной диагонали - на четных

16. Все нулевые элементы размещены на главной диагонали; в первых 3 строках выше диагонали и в последних 3 строках ниже диагонали

17. Все нулевые элементы размещены на главной диагонали и в верхней половине участка выше диагонали

18. Все нулевые элементы размещены на главной диагонали и в нижней половине участка ниже диагонали

19. Все нулевые элементы размещены в верхней и нижней четвертях матрицы (главная и побочная диагонали делят матрицу на четверти)

20. Все нулевые элементы размещены в левой и правой четвертях матрицы (главная и побочная диагонали делят матрицу на четверти)

Исполнителю самому надлежит выбрать, будут ли начинаться индексы в матрице с 0 или с 1.

Пример решения задачи

Индивидуальное задание: матрица содержит нули ниже главной диагонали; индексация начинается с 0.

Описание методов решения

Представление в памяти

Экономное использование памяти предусматривает, что для тех элементов матрицы, в которых наверняка содержатся нули, память выделяться не будет. Поскольку при этом нарушается двумерная структура матрицы, она может быть представлена в памяти как одномерный массив; но при обращении к элементам матрицы пользователь имеет возможность обращаться к элементу по двум индексам.

Общие переменные

В файле LАВ2.С описаны такие статические переменные:

- int NN - размерность матрицы;

- int SIZE - количество ненулевых элементов в матрице;

- int *m_addr - адрес сжатой матрицы в памяти, начальное значение этой переменной - NULL - признак того, что память не выделена;

- int L2_RESULT - общий флаг ошибки, если после выполнения любой функции он равен -1, то произошла ошибка.

Переменные SIZE и m_addr описаны вне функций с квалификатором static, это означает, что вони доступны для всех функций в этом модуле, но недоступны для внешних модулей. Переменная L2_RESULT также описана вне всех функций, не без явного квалификатора. эта переменная доступна не только для этого модуля, но и для всех внешних модулей, если она в них буде описана с квалификатором extern. Такоеописание имеется в файле LAВ2.H.

Функция crea t _matr

Функция creat_matr предназначена для выделения в динамической памяти места для размещения сжатой матрицы. Прототип функции:

                                          int creaCmat r ( int N );

где N - размерность матрицы.

Функция сохраняет значение параметра в собственной статической переменной и подсчитывает необходимый размер памяти для размещения ненулевых элементов матрицы. Для выделения памяти используется библиотечная функция С mallos. Функция возвращает -1, если при выделении произошла ошибка, или 0, если выделение прошло нормально. При этом переменной L2_RESULT также присваивается значение 0 или -1.

Функция close_matr

Функция close_matr предназначена для освобождения памяти при завершении работы с матрицей. Прототип функции:

int close _ mat г ( void );

Функция возвращает 0 при успешном освобождении, -1 - при попытке освободить невыделенную память.

Если адрес матрицы в памяти имеет значения NULL, это признак того, что память не выделялась, тогда функция возвращает -1, иначе - освобождает память при помощи библиотечной функции free и записы­вает адрес матрицы - NULL. Соответственно функция также устанавливает глобальный признак ошибки- L2_RE8ULT.

Функция read_matr

Функция read_matr предназначена для чтения элемента матрицы.        Прототип функции:

                                          int г ead _ mat г( int х, int y );

где х и у – координаты (строка и столбец). Функция возвращает значение соответствующего элемента матрицы. Если после выполнения функции значение переменной L2_RE8ULT -1, то это указывает на ошибку при обращении.

Проверка корректности задания координат выполняется обращением к функции ch_coord, если эта последняя возвращает ненулевое значение, выполнение read_matr на этом и заканчивается. Если же координаты заданы верно, то проверяется попадание заданногo элемента в нулевой или ненулевой участок. Элемент находится в нулевом участке, если для него номер строки больше, чем номер столбца. Если элемент в нулевом участке, функция просто возвращает 0, иначе - вызывает функцию линеаризации lin и использует значение, которое возвращает lin, как индекс в массиве m_addr, по которому и выбирает то значения, которое возвращается.

Функция write_matr

Функция write_matr предназначена для записи элемента в матрицу. Прототип функции:

                                          int w г ite _ mat г( int х, int y , int value );

где х и у - координаты (строка и столбец), value - то значение, которое нужно записать. Функция возвращает значение параметра va l ue, или 0 - если была попытка записи в нулевой участок. Если после выполнения функции значение переменной L2_RE8ULT -1, то это указывает на ошибку при обращении.

Выполнение функции подобно функции read_matr с тем отличием, что, если координаты указывают на ненулевой участок, то функция записывает value в массив m_addr.

Функция ch_coord

Функция ch_coord предназначена для проверки корректности задания координат. Эта функция описана как static и поэтому может вызываться только из этого же модуля. Прототип функции:

                                          static charch _ coord ( int х, int у);

где х и у - координаты (строка и столбец). Функция возвращает о, если координаты верные, -1 - если неверные. Соответственно, функция также устанавливает значение глобальной переменной L2_RESULT.

Выполнение функции собственно состоит из проверки трех условий:

- адрес матрицы не должен быть NULL, то есть, матрица должна уже находиться в памяти;

- ни одна из координат не может быть меньше 0;

- ни одна из координат не может быть больше NN.

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

Функция lin

Функция lin предназначена для преобразования двумерных координат в индекс в одномерном массиве. Эта функция описана как static и поэтому может вызываться только из этого же модуля. Прототип функции:

static int lin ( int х, int у);

где х и у - координаты (строка и столбец). Функция возвращает координату в массиве m_addr.

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

Координату элемента можно определить как:

n = SIZE - sizeX + offY ,

где SIZE - общее количество элементов в матрице,

SIZE = NN * ( NN - 1) / 2 + NN ;

sizeX - количество ненулевых элементов, которые содержатся в строке х и ниже,

sizeX = (NN - х) * (NN - х - 1) / 2 + (NN - х);

of f Y - смещение нужного элемента от начала строки х,

offY = у – х

Программа пользователя

Для проверки функционирования нашего модуля создается программный модуль, который имитирует программу пользователя. Этот модуль обращается к функции creat_matr для создания матрицы нужного размера, заполняет ненулевую ее часть последовательно увеличивающимися числами, используя для этого функцию write_matr, и выводит матрицу на экран, используя для выборки ее элементов функцию read_matr. Далее в диалоговом режиме программа вводит запрос на свои действия и читает/пишет элементы матрицы с заданными координатами, обращаясь к функциям read_matr/ write_matr. Если пользователь захотел закончить работу, программа вызывает функцию close_matr.

Тексты программных модулей


/************Файл LAB2.H *****************************/

/*Описание функций и внешних пepeменных файла LAB2.C      */

extern int L2_RESULT; /* Глобальна переменная - флаг ошибки */

/*********** Выделение памяти под матрицу */

int creat_matr ( int N );

/***** Чтение элемента матрицы по заданным координатам */

int read_matr ( int х, int у );

/****** Запись элемент в матрицу по заданным координатам */

int write_matr ( int х, int у, int value );

/****** Уничтожение матрицы */

int close_matr ( void );

/******** Конец файла LAB2.H ******************/

/************Файл LAB2.С ****************************/

/* В этом файле определены функции и переменные для обработки матрицы, заполненной нулями ниже главной диагонали */

#include <alloc.h>

static int NN; /*Размерность матрицы */

static int SIZE; /* Размер памяти */

static int m_addr= NULL; / Адрес сжатой матрицы */

static int lin (int, int); /* Описание функции линеаризации */

static char ch_coord (int, int); /* Описание функции проверки */

int L2_RESULT; /* Внешняя переменная, флаг ошибки */

/****************.*****************************/

/* Выделение памяти под сжатую матрицу */

int creat_matr (int N) {

           /* N –

NN=N;

SIZE=N*(N-1)/2+N;

if ((m_addr=(int *) malloc(SIZE*sizeof(int))) = = NULL )

return L2_RESULT=0;

/* Возвращает 0, если выделение произошло успешно, иначе -1 /

}

/****************.*****************************/

/* Уничтожение матрицы (освобождение памяти) */

int close_matr(void) {

if ( m_addr!=NULL ) {

free(m_addr);

m_addr=NULL;

геtuгп L2_RESULT=0;

}

else return L2_RESULT=-1;

/* Возвращает 0, если выделение прошло успешно, иначе -1 */

}

/* Чтение элемента матрицы по заданным координатам int геаd_mаtr(int х, int у) {

/* х, у -координаты (строка, столбец) */

if ( ch_coord(x,y) ) геtuгт 0;

/* Если координаты попадают в нулевой участок - возвращается 0, иначе - применяется функция линеаризации */

return (х > у) ? 0 : m_addr[lin(x,y)];

/* Проверка успешности чтения - по переменной L2_RESULT: 0 - без ошибок, -1 - была ошибка */

/****************.*****************************/

/* Запись элемента матрицы по заданным координатам */

int write_matr(int х, int у, int value) {

/* х, у -координаты, value - записываемое значение */

if ( chcoord(x,y) ) return;

/* Если координаты попадают в нулевой участок - записи нет, иначе - применяется функция линеаризации */

if ( х > у ) return 0;

else return m_addr[lin(x,y)]=value;

/* Проверка успешности записи - по L2_RESULT */

}

/****************.*****************************/

/* Преобразование 2-мерных координат в линейную */

/*      (вариант 3)                     */

static int lin(int х, int у) {

int n;

n=NN-х;

return SIZЕ-n*(n-1)/2-n+у-х;

/* Проверка корректности обращения */

static char ch_coord(int х, int у) {

           if ( ( m_addr= =NULL ) 11

( x>SIZE ) || ( y>SIZE ) || ( x<0 ) || ( у<0 ) )

/* Если матрица не размещена в памяти, или заданные координаты выходят за пределы матрицы */

                          return L2_RESULT=-1;

           return L2_RESULT=0;

}

/*******Конец файлаLАВ2. С *******************/

/************** Файл MAIN2.C ********************/

/* "Программа пользователя" */

#include "lab2.h"

main() {

int R; /* размерность */

int i, j; /* номера строки и столбца */

int m; /* значения элемента */

int ор; /* операция */

clrscr() ;

printf(' Введите размерность матрицы>'); scanf("%<d", R);

/* создание матрицы */

if ( creat_matr (R) ) {

ргiпtf("Ошибка создания матрицы\n");

exit(0);

}

/* заполнение матрицы */

for ( m=j=0; j<R; j++)

for ( i=0; i<R; i++)

     write_matr(i,j,++m);

while(1) {

/* вывод матрицы на экран */

clrscr();

for (j=0; j<R; j++) {

for (i=0; i<R; i++)

printf( "%3d", read_matr(i, j));

printf("\n") ;

}

printf("0 - выход\n1 - чтение\n2 - запись\n>")

sсапf( "%d" , &ор);

switch(op) {

case 0:

if (close_matr() ргintf("ошибка при уничтожении\n");

else ргintf("Матрица уничтожена\n");

ехit(0);

case 1: case 2:

printf( "Введите номер строки >");

scanf( "%d", &j):

рrintf ("Введите номер столбца>");

scanf("%d",&i);

if (ор= =2) {

printf( "Введите значение элемента >");

scanf ("%d" , &m) ;

write_matr(j,i,m);

if (L2_RESULT<0) рritnf("Ошибка записи\n");

}

else {

m=read_matr(j,i);

if (L2_RESULТ <0) pritnf( "Ошибка считывания\n");

else рrintf("Считано: "%d\n",m);

        }

printf( "Нажмите клавишу\n"); getch();

break;

}

}

}

/****Конец файла MAIN2.C **********/


Варианты

 

Вариант 1 требует:

- добавления к общим статическим переменным еще переменной:
static int *D; /* адрес дескриптора */

- добавления такого блока в функцию crea_matr:

{

int i, s;

D=(int *)malloc(N*sizeof(int));

for (D[0]=0,s=NN-1,i=1; i<NN; i++)

D[i]=D[i-1]+s--;

}

- изменения функции lin на:

static int lin(int х, int у) {

    return D[х]+у;

}

 

Вариант 2 требует:

изменения функции lin на:

static int lin(int х, int у) {

               int s;

for (s=j=0; j<x; j++)

s+=NN-j;

return s+y-x;


 





100

100

100

Посещение и подготовка к практическим занятиям

Вид СРС Дз№1 Дз№2 Дз№3 Дз№3

Дз№5

Дз№6

Дз№7

Форма контроля Пр№1-3 Пр№4-5 Пр№6 Пр№7

Пр№8-9

Пр№10-11

Пр№12-13

Мак.балл 100 100 100 100

100

100

100

100

Недели

8 9 10 11 12

13

14

15

Максимальный балл за неделю

9 13 9 9 13

9

13

25

Посещение и подготовка к лекциям

Вид СРС У У У У У

У

У

У Форма контроля ПК ПК ПК ПК ПК

ПК

ПК

ПК Мак. балл 100 100 100 100 100

100

100

100

Посещение и подготовка к практическим занятиям

Вид СРС Дз№8 Дз№9 Дз№10 Дз№11 Дз№12

Дз№13

Дз№14

  Форма контроля Пр№14 Пр№15 Пр№16-17 Пр№18-19 Пр№20

Пр№21

 

  Мак.балл 100  100 100 100 100

100

100

100

A) компилятор

B) имя

C) мнемоника

D) операнд

E) комментарий

2. Символическое обозначение команды – это …

A) компилятор

B) имя

C ) мнемоника

D) операнд

E) комментарий

3. Любой текст, который игнорируется ассемблером – это ...

A) компилятор

B) имя

C) мнемоника

D) операнд

E ) комментарий

4. Какие константы не применяются в Ассемблере?

A) десятичные

B) восьмеричные

C) двоичные

D) шестнадцатеричные

E ) правильного ответа нет

5. В шестнадцатеричном формате в листинга ассемблера указывается...

A) адреса

B) машинные коды команд

C) константы

D ) программные команды

E) правильного ответа нет

6. Для индексации шестнадцатеричного числа непосредственно после самого числа ставится символ...

A) W

B) B

C) S

D) C

E ) H

7. Область, которая начинается на границе параграфа, называется

A) адресом

B) стеком

C ) сегментом

D) регистром

E) памятью

8. Какой группы команд не существует в Ассемблере?

A) приема данных

B) передачи данных

C) смешанные

D) пропуска

E) арифметические

9. Какой адресации не используется в ассемблере?

A) Прямая

B) непосредственная

C ) побитная

D) регистровая

E) косвенная

10. Запоминание является командой ...

A) логической

B ) передачи данных

C) арифметической

D) перехода

E) пропуска

11. Получение информации из стека является ...

A) смешанной командой

B) командой передачи данных

C) арифметической командой

D) командой перехода

E) командой пропуска

12. Укажите директиву определения имени

A) MOV

B) END

C) BSS

D ) EQU

E) DD

13. Укажите директиву определения данных

A) MOV

B) END

C) BSS

D) EQU

E ) DD

14. Укажите директиву резервирования памяти

A) MOV

B) END

C) BSS

D) EQU

E) DD

15. Укажите директиву конца программного модуля

A) MOV

B) END

C) BSS

D) EQU

E) DD

16. Укажите директиву, которая определяет слово:

A) DQ

B) DD

C) DT

D) DB

E) DW

17. Укажите директиву, которая определяет байт:

A) DQ

B) DD

C) DT

D) DB

E) DW

18. Укажите директиву, которая определяет двойное слово:

A) DQ

B) DD

C) DT

D) DB

E) DW

19. Укажите директиву, которая определяет учетверенное слово:

A) DQ

B) DD

C) DT

D) DB

E) DW

20. Какого числового формата не существует в Ассемблере?

A) двоичное с плавающей точкой

B) шестнадцатеричное

C) Десятичное

D) восьмеричное

E) десятичное с плавающей точкой

21. Укажите результат действия следующего примера

           DB 5 DUP(5 DUP (5))

A) десять пятерок

B) пять раз число 25

C ) двадцать пять пятерок

D) пять пятерок

E) правильного ответа нет

22. Какая команда не является логической?

A) AND

B) OR

C) SHL

D) TEST

E) XOR

23. Укажите команду пересылки:

A) ADD

B) ADC

C) AND

D) SHL

E) MOV

24. Какая команда не является командой сдвига?

A) SUB

B) SBB

C) ADD

D) CMP

E) ADC

25. Укажите регистр общего назначения:

A) CS

B) AX

C) SP

D) IP

E) SI

26. Что не является сегментным регистром?

A) CX

B) CS

C) DS

D) SS

E) ES

27. Укажите регистровый указатель:

A) IP

B) DI

C) DX

D) BX

E ) BP

28. Укажите индексный указатель:

A) IP

B) DI

C) DX

D) BX

E) BP

29. Какой флаг указывает на переполнение старшего бита при арифметических командах?

A) T

B) I

C) D

D) O

E) S

30. Какой флаг указывает на возможность внешних переполнений?

A) A

B) I

C) P

D) C

E) Z

31. Флаг Т указывает на …

A) пошаговый режим

B) внешний перенос

C) контроль четности

D) прерывание

E) переполнение

32. Флаг Р указывает на …

A) пошаговый режим

B) внешний перенос

C ) контроль четности

D) прерывание

E) переполнение

33. Какая команда используется для умножения беззнаковых чисел?

A) MOV

B) DIV

C) IDIV

D) IMUL

E) MUL

34. Операция деления для знаковых данных выполняется командой …

A) SAR

B) DIV

C) IDIV

D) SHL

E) NEG

35. Команда NEG обеспечивает …

A) операцию умножения для беззнаковых данных

B) операцию умножения для знаковых данных

C) операцию деления для беззнаковых данных

D) операцию деления для знаковых данных

E ) преобразование знаков для двоичных чисел

36. В памяти с адресом Mem[$F000:$FFFE]

A) Содержится информация о типе IBM PC

B) Содержится информация о версии MS DOS

C) Содержится информация о версии Операционной системы

D) Содержится информация о числе дисковых накопителей

E) Содержится информация об имеющемся оборудовании

37. Функция 30H прерывания 21H

A) Возвращает номер версии MS DOS

B) Возвращает номер версии Операционной системы

C) Возвращает информацию о числе дисковых накопителей

D) Возвращает число и тип дисковых накопителей, присоединенных к IBM PC

E) Возвращает число и тип адаптеров дисплея

38. Данная команда exec(GetEnv('COMSPEC'),'/C '+'del /p '+'c:\STUDENT\1.txt') выполняет

A) удаление 1. txt файла

B) копирование 1.txt файла

C) открытие 1.txt файла

D) переименование 1.txt файла

E) поиск 1.txt файла

39. Путем обращения к области данных по адресу 40:49h

A) Содержится текущий видеорежим адаптера

B) Содержится номер версии MS DOS

C) Содержится номер версии Операционной системы

D) Содержится число дисковых накопителей

E) Содержится число и тип дисковых накопителей, присоединенных к IBM PC

40. Абсолютные координаты курсора могут меняться в пределах

A) 25 строк и 80 (иногда 40) столбцов

B) 20 строк и 40 столбцов

C) 15 строк и 20 (иногда 40) столбцов

D) 80 строк и 25 (иногда 40) столбцов

E) 25 строк и 100 (иногда 40) столбцов

41. Для определения типа компьютера необходимо прочитать байт, записанный в ПЗУ BIOS

A) по адресу FF00:0FFE

B) по адресу F000:0FFE

C) по адресу F0F0:0FFE

D) по адресу F000:00FE

E) по адресу FF00:0F00

42. Командные файлы -

A) средство MS-DOS, позволяющее автоматизировать часто выполняемые действия пользователя

B) файлы, предназначенные для хранения информации

C) файлы, содержащие команды для обработки информации

D) загрузочные файлы

E) нет правильного ответа

43. ВАТСН-файлы -

A) командные файлы

B) загрузочные файлы

C) файлы, содержащие команды для обработки информации

D) файлы, предназначенные для хранения информации

E) нет правильного ответа

44. Функции типа дескриптора (handle-функции) -

A) Функции управления файлами и записями, обеспечивающие совместимость с UNIX

B) Функции управления памятью компьютера

C) Функции управления процессом компьютера

D) Функции, предназначенные для обработки информации

E) Все выше перечисленное

45. Прерывание –

A) Это принудительная передача управления от выполняемой программы к программе, происходящая при выполнении какой-либо программы.

B) Это принудительная передача управления от выполняемой программы к системе , происходящая при выполнении какой-либо программы.

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

D) Это передача данных от выполняемой программы к системе, происходящая при возникновении определенного события.

E) нет правильного ответа

46. Внешние прерывания – это …

A) прерывание, происходящее по соответствующей команде;

B) специальный механизм, позволяющий координировать параллельное функционирование отдельных устройств вычислительной системы и не реагировать на особые состояния, возникающие при работе процессора;

C) прерывания, вызываемые событиями, которые связаны с работой процессора и являются синхронными с его операциями;

Ф. 4-71

Министерство образования и науки Республики Казахстан

 

Павлодарский государственный педагогический институт

  

Кафедра информатики

 

 

Программа обучения

Дисциплина Системное программное обеспечение

                                                                            

для специальностей 5В011100 «Информатика»

 

 

Павлодар   

 

 

Ф.4-72

УТВЕРЖДАЮ

Декан Факультета

Математики и Естествознания

___________ М.Алинова

«___» _____________ 201_г.

 

Составитель: _______ ст. преп. Б.Исабекова, К.Кусманов, Ж.Копеев

 

Кафедра информатики

 

Программа обучения

По дисциплине Системное программное обеспечение

 

Для студентов специальностей «Информатика»

 

 

Программа разработана на основании рабочей учебной программы, утвержденной «____» ___________ 201_г.

 


Поделиться:



Последнее изменение этой страницы: 2019-05-08; Просмотров: 236; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (2.193 с.)
Главная | Случайная страница | Обратная связь