Читайте также:
|
|
Тема: «Работа с функциями BIOS.
Доступ к регистрам и флагам через псевдопеременные»
(2 часа)
Язык С поддерживает доступ к внутренним регистрам микропроцессора (МП) через псевдопеременные, ссылка на которые в С-программе компилируется в ссылку на внутренний регистр МП. Перечислим имена псевдопеременных:
_AX; _AL; _AH;
_BX; _BL; _BH;
_CX; _CL; _CH;
_DX; _DL; _DH;
_SI; _DI; _BP; _SP;
_CS; _ES; _DS; _SS.
Пример: Чтобы узнать текущее значение сегментных регистров, в программу помещается следующий код:
...
unsigned cur_code_seg, cur_data_seg, cur_stack_seg, cur_es_seg;
cur_code_seg = _CS;
cur_data_seg = _DS;
cur_stack_seg = _SS;
cur_es_seg = _ES;
...
Псевдопеременная может также использоваться в левой части оператора присваивания. Но необходимо помнить, что:
1. Невозможно непосредственно присвоить значение регистрам CS, IP;
2. Изменение значений сегментных регистров DS, SS, ES приводит к непредсказуемым последствиям для программы и требует особой осторожности;
3. Установленные в регистры значения могут быть неявно переопределены последующими операторами программы и к моменту использования в других выражениях будут содержать не ранее присвоенное, а случайное значение;
4. При использовании псевдопеременных следует отключить использование регистровых переменных и регистровой оптимизации в опциях компилятора.
Пример:
Вывод символа на экран с помощью псевдопеременных:
#include<dos.h>
void main(){
/*используется 10-е прерывание и выводится символ на активную видеостраницу*/
_AH=0x0e;
_AL='N';
/*вызывает 10-е прерывание*/
geninterrupt(0x10);
}
Функция void geninterrupt(int intr_num) выполняет обращение к обработчику прерывания с номером intr_num. Для задания необходимых значений регистрам и получения значений из обработчика следует использовать псевдопеременные. Достоинством функции является минимальный размер и максимально возможная производительность кода при выполнении прерывания.
Недостаток – это возможность переопределения при загрузке регистров ранее установленных значений.
Задание:
1. Написать программу вывода пяти символов, используя псевдопеременные.
2. Написать программу, используя псевдопеременные, в которой необходимо реализовать функцию AH=01h (0x01) прерывания 10h BIOS, чтобы установить размер/форму курсора (текст), причем если курсор виден, то он мерцает. Для этого в качестве входа используются регистры CH и CL, где CH = начальная строка (значения от 0 до 1Fh; 20h=подавить курсор) CL = конечная строка (0-1Fh).
Дата добавления: 2015-07-11; просмотров: 86 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Лабораторная работа №1 | | | Лабораторная работа №3 |