Читайте также:
|
|
В ОС MS-DOS имеются специальные адреса памяти, которые используются системой и с помощью которых можно выполнять, например, операции по обслуживанию периферийных устройств. Эти адреса расположены в сегменте, для доступа к которому используется константа Seg0040.
Таблица 1. Некоторые специальные адреса MS-DOS
смещение | размер | Назначение |
$0010 | word | список оборудования |
$0017 | word | статус клавиатуры |
$0019 | word | альтернативный ввод с клавиатуры |
$001A | word | вершина буфера клавиатуры |
$001C | word | нижняя часть буфера клавиатуры |
$001Е | 16*word | буфер клавиатуры - кольцевой список |
В таблице 2 приведено описание байта состояния клавиатуры (адрес $0040:$0017). Установка каждого бита в этом байте соответствует наступлению определенного события.
Таблица 2. Байт состояния клавиатуры
Бит | событие |
нажата правая клавиша Shift | |
нажата левая клавиша Shift | |
нажата клавиша Ctrl | |
нажата клавиша Alt | |
нажата клавиша ScrollLock | |
нажата клавиша NumLock | |
нажата клавиша CapsLock | |
нажата клавиша Insert |
Шестнадцатеричная константа $DF, в двоичной записи имеющая вид 1101 1111, играет роль маски. Побитовое выполнение логической операции and над этой константой и байтом состояния клавиатуры устанавливает значение 5-го бита (‘режим NumLock включен’) в 0, т.е. отключает его.
Переменная Absolute
В языке Паскаль имеется возможность размещать переменные по конкретным адресам оперативной памяти. Такие переменные называются абсолютными и обычно используются в системных программах. Для описания абсолютных переменных предназначено зарезервированное слово Absolute. Формат:
Var <идентификатор>: <тип> Absolute BA:BS;
где BA – базовый адрес сегмента, BS смещение внутри этого сегмента. Например,
Var root: integer Absolute $0000:$01F0;
BA:BS может заменяться на идентификатор другой переменной, тогда вместо BA:BS будет подставлен ее адрес. Таким способом можно выполнять ‘наложение’ переменных.
Пример. Программа образует строку букв алфавита путем ее увеличения в цикле на одну букву, начиная с латинской буквы ‘a’.
Var
str:string[10];
len: byte absolute str; {len налагается на str, т.е. len будет содержать значение первого байта переменной str, содержащего текущую длину строки}
i:integer;
c:char;
Begin
c:='a';
str:='a';
Writeln(str);
writeln('length of string =',len);
for i:=1 to 3 do
Begin
str:=str+succ(c);
Writeln(str);
writeln('length of string =',len);
c:=succ(c);
End;
Readln
End.
Результат работы:
a
length of string = 1
ab
length of string = 2
abc
length of string = 3
abcd
length of string = 4
Для работы с абсолютными переменными в языке Паскаль имеется ряд стандартных подпрограмм:
Addr(Id) – возвращает адрес расположения первого байта переменной с идентификатором Id. Результат имеет длину два слова и содержит базовый адрес и величину смещения.
Ofs(Id) – возвращает величину смещения в сегменте первого байта указанной переменной, процедуры или функции, определяемой Id. Результат имеет целочисленное значение.
Seg(Id) – возвращает адрес сегмента, содержащего первый байт переменной с идентификатором Id. Результат имеет целочисленный тип.
CSeg – возвращает базовый адрес сегмента кода. Результат имеет целочисленный тип.
DSeg – возвращает базовый адрес сегмента данных. Результат имеет целочисленный тип.
Массивы Mem
В Турбо Паскале имеется пять предварительно объявленных массивов: MEM, MEMW, MEML, PORT и PORTW. Первые три обеспечивают доступ к любому участку оперативной памяти по абсолютному адресу, два других - доступ к портам ввода-вывода.
Компонентами массива MEM являются данные типа BYTE, массива MEMW - типа WORD, массива MEML - типа LONGINT. Обращение к элементам этих массивов, т.е. их индексация, имеет специальный вид: каждый индекс представляет собой абсолютный адрес и состоит из двух выражений типа WORD; первое дает сегментную часть адреса, второе - смещение; выражения разделяются двоеточием. Например:
Меm[$0000:$1000]:= 0;
DataMem:= MemWfSeg(p):0fs(p)];
MemLong:.= MemL [64: i*SizeOf (real) ];
Как следует из технического описания операционной системы MS-DOS, в памяти по адресу $F000:$FFFE располагается байт-указатель типа компьютера. Следующая программа прочтет этот байт и выведет на экран тип вашего ПК.
Пример
begin
Write (' Тип компьютера: ');
case Mem [$FOOO:$FFFE] of
$FF: WriteLn ('PC');
$FE: WriteLn('XT');
$FD: WriteLn('PCjr');
$FC: WriteLn('AT');
$F9: WriteLn('совместимый с PC')
End;
readln
end.
Компонентами массива PORT являются байты (тип BYTE), а массива PORTW - слова (тип WORD). Индексами этих массивов должно быть выражение типа BYTE, указывающее номер нужного порта. Присвоение значения элементу массива PORT или PORTW приведет к записи в порт, упоминание элемента в выражении - к чтению из порта. Компоненты массивов PORT и PORTW нельзя передавать в качестве параметров процедурам или функциям. Эти идентификаторы не употребляются без индексных выражений.
Дата добавления: 2014-12-18; просмотров: 96 | Поможем написать вашу работу | Нарушение авторских прав |