Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Білети 23 і 24.doc
Скачиваний:
1
Добавлен:
18.09.2019
Размер:
66.05 Кб
Скачать

Білет 23

1. Структура програми розробленої в С++ Builder.

П рограмма на языке С++ представляет собой набор функций. Одна из функций должна иметь имя main. Операционная система передает управление в программу пользователя на функцию с этим именем и тем самым начинается вы-полнение программы. От функций в программе функция main отличается тем, что ее нельзя вызвать изнутри программы, а ее параметры, если они существуют, обычно  задаются ОС, хотя это необязательно, main бывает первой функцией в тексте программы.    main ( )    {      ...    return 0;    } Если предположить, что main- первая функция, определенная в программе на языке С++, то поскольку ни одна функция не может содержать определения другой функции, следом в тексте будут располагаться определения вспомогатель-ных функций, «неглавных» функций. Их может быть различное количество.    main ( )    {       ...    return 0;    }    function 1 ( )    {    }    function 2 ( )    {    }       ...    function n ( )    {    }

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

2. Призначення сігментних регістрів у мікропроцесорі 80286.

Процессор 8086 имел 16-разрядные регистры общего назначения, 16-разрядную шину данных и 20-разрядную шину адреса, что позволяло ему оперировать адрес ным пространством в 1 МБ. Отличие процессора 8088 заключалось в 8-разрядной шине данных.

Эти процессоры привнесли сегментацию в архитектуру IA-32. Память разделялась на сегменты размером до 64 КБ. Оперируя четырьмя сегментными регистрами одновременно, процессор имел возможность адресации до 256 КБ памяти без переключения между сегментами. При этом 20-разрядные адреса получались путем добавления 16-разря.!шого адреса к указателю сегментного регистра.

Процессор 80286 привнес в архитектуру (Д-32 защищенный режим. В нем содержимое сегментных регистров используется в качестве указателей на таблицы дескрипторов, которые давали возможность 24-разрядной адресации, что составляло 16 МБ адресного пространства. К тому же появилась возможность проверки границ сегментов, опций read и execute-only для сегментов и 4 уровня защиты кода операционной системы от приложений и защита приложений друг от друга.

3.Функції преривання int16h.

Представление символов и управляющих кодов в памяти компьютера

Ввод информации с клавиатуры при помощи функций BIOS

Прерывание Int 16h, функция 00h: прочитать символ с клавиатуры

Прерывание Int 16h, функция 01h: получить состояние клавиатуры

Прерывание Int 16h, функция 02h: получить состояние флагов клавиатуры

Прерывание Int 16h, функция 03h: управление режимом автоповтора

Прерывание Int 16h, функция 04h: включить/выключить звуковой сигнал клавиш

Прерывание Int 16h, функция 05h: поместить символ в буфер клавиатуры

Прерывание Int 16h, функция 10h: прочитать символ с расширенной клавиатуры

Прерывание Int 16h, функция 11h: получить состояние расширенной клавиатуры

Прерывание Int 16h, функция 12h: получить состояние флагов расширенной клавиатуры

Примеры использования функций BIOS

Контроллер прерываний

Непосредственная работа с контроллером клавиатуры

Внимание: часть информации еще находиться в билете 24 вопрос №2

Глянь что нужное а что нет

4.Обробка подій клавіатури подій клавіатури в С++ Builder.

Событие Происходит OnClick При щелчке кнопкой мыши OnDb1Click При двойном щелчке кнопкой мыши OnMouseDown При нажатии кнопки мыши OnMouseUp При отпускании кнопки мыши OnMouseMove При перемещении мыши OnKeyPress При нажатии клавиши клавиатуры OnKeyDown При нажатии клавиши клавиатуры. События OnKeyDown и OnKeyPress — это чередующиеся, повторяющиеся события, которые происходят до тех пор, пока не будет отпущена удерживаемая клавиша (в этот момент происходит событие OnKeyUp) OnKeyUp При отпускании нажатой клавиши клавиатуры

Методику создания функций обработки событий рассмотрим на примере функции обработки события onclick для командной кнопки Вычислить. Чтобы приступить к созданию функции обработки события, сначала надо выбрать компонент, для которого создается функция обработки события. Выбрать компонент можно в окне Object Inspector или щелчком на изображении компонента в форме. После этого в окне Object Inspector нужно выбрать вкладку Events (События). В левой колонке вкладки Events перечислены события, которые может воспринимать выбранный компонент (имя и тип компонента указаны в верхней части окна). Если для события определена функция обработки, то в правой колонке рядом с именем события будет выведено имя этой функции. Для того чтобы создать функцию обработки события, нужно сделать двойной щелчок мышью в окне Object Inspector, в поле функции обработки соответствующего события. В результате этого откроется окно редактора кода, в которое будет добавлен шаблон функции обработки события, а в окне Object Inspector рядом с именем события появится сгенерированное C++ Builder имя функции обработки события

Білет 24

1. Призначення параметра Sender у заголовках опису подій програми С++.

2.Поясніть преривання INT09h при введенні данних з клавіатури.

Обзор Int 09h, Int16 h — поддержка клавиатуры взят из открытых источников в сети Поддержка клавиатуры заключается в обработке прерываний от устройства ввода и предоставлении сервисов ввода прикладным программам. Прерывания, вызванные приходом кодов нажатия и отпускания клавиш, обрабатывает BIOS Int 9h. Каждый принятый скан-код (или цепочка) обрабатывается с учетом состояния клавиатурных флагов. Результат обработки (как правило, ASCII-символ в младшем байте и скан-код в старшем) помещается в клавиатурный буфер, расположенный в ОЗУ. По приему каждого символа указатель головы буфера увеличивается. Буфер организован в виде кольца, после достижения конца области буфера указатель головы установится на начало области. В случае переполнения буфера (указатель головы «догнал» указатель хвоста) очередное слово не записывается, и подается звуковой сигнал. Размер позволяет хранить описание шестнадцати фактов нажатий клавиш. Нажатие клавиш Ctrl, Shift, Alt и некоторых комбинаций в буфере не отмечается, но приводит к модификации бит ячеек флагов клавиатуры. Нажатие «системной» комбинации Ctrl+Alt+Del, клавиши PrintScreen (SysRq) и некоторых других к записи в клавиатурный буфер не приводит, а вызывает специальные процедуры. Для обслуживания клавиатуры используются ячейки ОЗУ из области данных BIOS (BIOS Data Area): - 0:0417,0:418 - флаги клавиатуры; - 0:0419 - аккумулятор кода Alt-набора; - 0:041А - указатель головы буфера (Buffer Head), 2 байта (модифицируется при помещении символа в буфер); - 0:041С - указатель хвоста буфера (Buffer Tail), 2 байта (модифицируется при извлечении символа из буфера); - 0:041E-0:042D - область кольцевого буфера (16 слов). Обработчик аппаратного прерывания до обработки принятого скан-кода вызывает прерывание BIOS IntlSh с AH=4Fh, а в AL находится принятый скан-код. Стандартный обработчик Int 15h(4Fh) просто выполняет возврат с CF=0, но его можно заменить специальным обработчиком, который будет при необходимости подменять принятые скан-коды на какие-либо иные (оставляя их в AL), что должно отмечаться установкой CF=1. В старых версиях BIOS такой возможности перехвата не было, ее наличие можно определить вызовом Int 15h(COh). Для клавиатуры USB или иного устройства ввода, заменяющего клавиатуру в качестве консоли, прерывание Int 9h должно вызываться программно при обработке каждого клавиатурного события. Обработчик этого прерывания должен выполнять те же действия: скан-код пропускать через Int 15h(4Fh) и помещать в клавиатурный буфер, а также модифицировать флаги клавиатуры. Интерфейс прикладного уровня для клавиатуры представляет BIOS Int 16h. Его основное назначение - извлечение слов из клавиатурного буфера. Функция задается в регистре АН при вызове, результат помещается в регистр АХ. - АН = OOh - чтение (с ожиданием готовности) и выборка слова из буфера (меняется указатель хвоста). Индикаторы клавиатуры обновляются в соответ ствии с состоянием флагов. Если буфер пуст, то на AT выполняется прерывание Int 15h (подфункция 90), что может использоваться ОС, например, для переключения задач. Чтобы программа не «зависала» на ожидании символа, предварительно стоит проверить готовность функцией Olh. Символы расширенной клавиатуры фильтруются - преобразуются в их аналоги 83-клавишной клавиатуры. - АН = Olh - проверка готовности, чтение без выборки (указатели не изменяются). Признак наличия символа в буфере - установленный флаг ZF. - АН = 02h - чтение состояния флагов (в AL - байт 0:417h, см. выше). - АН = 03h - установка задержки и частоты автоповтора: BL - код задержки (00=250, 01=500,02=750,03=1000 мс), ВН - код частоты (см. п. 9.2.1). - АН = 05h - запись слова из регистра СХ в буфер (меняется указатель головы). Признак успешной записи - AL=Q, если в буфере нет места, то AL=1. - АН = 10h и AH=*llh - функции, аналогичные ООН и Olh, но предназначены специально для 101/102-клавишных клавиатур - в них не выполняется фильтрация символов расширенной клавиатуры. Для ряда клавиш, отсутствующих в клавиатуре АТ-84, эти функции дадут результаты, отличающиеся от вызовов OOh и Olh. - AH=12h . - чтение расширенного состояния флагов (в АХ - слово KbdShif tFlagslOlRec), в котором младший байт совпадает с тем, что дает i функция 02h (слово из 0:417h), а старший байт похож на слово из 0:418h. Назначение бит АХ: • бит 0 - клавиша Shift (правая) нажата; • бит 1 - клавиша Shift (левая) нажата; . • бит 2 - клавиша Ctrl (любая) нажата; • бит 3 - клавиша Alt (любая) нажата; • бит 4 - включен индикатор Scroll Lock; • бит 5 - включен индикатор Num Lock; • бит 6 - включен индикатор Caps Lock; • бит 7 - включен режим Insert; • бит 8 - клавиша Ctrl (левая) нажата; • бит 9 - клавиша Alt (левая) нажата; • бит 10 - клавиша Ctrl (правая) нажата; • бит 11 - клавиша Alt (правая) нажата; • бит 12 - клавиша Scroll Lock нажата; • бит 13 - клавиша Num Lock нажата; • бит 14 - клавиша Caps Lock нажата; • бит 15 - клавиша SysReq нажата. Функции чтения буфера (00 и 10h) в регистре AL возвращают ASCII-код символа, в АН - скан-код. Символы, полученные нестандартным способом (в русском регистре или Alt-набором), сопровождаются нулевым скан-кодом. Alt-набор позволяет ввести в буфер любой символ - для этого его код в десятичной системе набирается на цифровой клавиатуре при нажатой клавише Alt, результат заносится в буфер при отпускании клавиши Alt. При AL=0 регистр АН содержит расширенный ASCII-код (Extended ASCII Keystroke). Дополнительные клавиши 101/102 клавиатур при использовании функций 10h-12h генерируют код EOh в младшем байте и скан-код, соответствующий аналогичным управляющим клавишам 83/84-клавишных клавиатур. Функция записи (05h), несколько неожиданная для клавиатуры, позволяет легко имитировать работу оператора для различных демонстрационных программ. Если прикладная программа не перехватывает обслуживание клавиатуры на уровне аппаратного прерывания (In t 9h), то резидентная программа может ей «подбрасывать» слова в буфер, которые будут восприниматься как нажатие клавиш. ASCII-коды буфера, соответствующие нажатию клавиш, приведены в [1, 7]. При русификации (или другой локализации) клавиатуры отслеживание переключения регистров (языков) ложится на обработчик аппаратного прерывания клавиатуры.

3.Правила динамічної резервування пам’яті комп’ютера для нових змінних у програмі С++. (Ерунда, но другого не нашел).Задачи, в которых нужно хранить и обрабатывать заранее неизвестное число элементов, обычно требуют динамического выделения памяти. До сих пор во всех наших примерах использовалось статическое выделение памяти. Скажем, определение переменной ival int ival = 1024; заставляет компилятор выделить в памяти область, достаточную для хранения переменной типа int, связать с этой областью имя ival и поместить туда значение 1024. Все это делается на этапе компиляции, до выполнения программы. С объектом ival ассоциируются две величины: собственно значение переменной, 1024 в данном случае, и адрес той области памяти, где хранится это значение. Мы можем обращаться к любой из этих двух величин. Когда мы пишем: int ival2 = ival + 1; то обращаемся к значению, содержащемуся в переменной ival: прибавляем к нему 1 и инициализируем переменную ival2 этим новым значением, 1025. Каким же образом обратиться к адресу, по которому размещена переменная? С++ имеет встроенный тип "указатель", который используется для хранения адресов объектов. Чтобы объявить указатель, содержащий адрес переменной ival, мы должны написать: int *pint; // указатель на объект типа int Существует также специальная операция взятия адреса, обозначаемая символом &. Ее результатом является адрес объекта. Следующий оператор присваивает указателю pint int *pint; адрес переменной ival: pint = &ival; // pint получает значение адреса ival Мы можем обратиться к тому объекту, адрес которого содержит pint (ival в нашем случае), используя операцию разыменования, называемую также косвенной адресацией. Эта операция обозначается символом *. Вот как можно косвенно прибавить единицу к ival, используя ее адрес: *pint = *pint +1; // неявно увеличивает ival Это выражение производит в точности те же действия, что и ival = ival +1; // явно увеличивает ival В этом примере нет никакого реального смысла: использование указателя для косвенной манипуляции переменной ival менее эффективно и менее наглядно. Мы привели этот пример только для того, чтобы дать самое начальное представление об указателях. В реальности указатели используют чаще всего для манипуляций с динамически размещенными объектами. Основные отличия между статическим и динамическим выделением памяти таковы: статические объекты обозначаются именованными переменными, и действия над этими объектами производятся напрямую, с использованием их имен. Динамические объекты не имеют собственных имен, и действия над ними производятся косвенно, с помощью указателей; выделение и освобождение памяти под статические объекты производится компилятором автоматически. Программисту не нужно самому заботиться об этом. Выделение и освобождение памяти под динамические объекты целиком и полностью возлагается на программиста. Это достаточно сложная задача, при решении которой легко наделать ошибок. Для манипуляции динамически выделяемой памятью служат операторы new и delete. Оператор new имеет две формы. Первая форма выделяет память под единичный объект определенного типа: int *pint = new int(1024); Здесь оператор new выделяет память под безымянный объект типа int, инициализирует его значением 1024 и возвращает адрес созданного объекта. Этот адрес используется для инициализации указателя pint. Все действия над таким безымянным объектом производятся путем разыменовывания данного указателя, т.к. явно манипулировать динамическим объектом невозможно. Вторая форма оператора new выделяет память под массив заданного размера, состоящий из элементов определенного типа: int *pia = new int[4]; В этом примере память выделяется под массив из четырех элементов типа int. К сожалению, данная форма оператора new не позволяет инициализировать элементы массива. Некоторую путаницу вносит то, что обе формы оператора new возвращают одинаковый указатель, в нашем примере это указатель на целое. И pint, и pia объявлены совершенно одинаково, однако pint указывает на единственный объект типа int, a pia - на первый элемент массива из четырех объектов типа int. Когда динамический объект больше не нужен, мы должны явным образом освободить отведенную под него память. Это делается с помощью оператора delete, имеющего, как // освобождение единичного объекта delete pint; // освобождение массива и new, две формы - для единичного объекта и для массива: delete [] pia; Что случится, если мы забудем освободить выделенную память? Память будет расходоваться впустую, она окажется неиспользуемой, однако возвратить ее системе нельзя, поскольку у нас нет указателя на нее. Такое явление получило специальное название утечка памяти. В конце концов программа аварийно завершится из-за нехватки памяти (если, конечно, она будет работать достаточно долго).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]