Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Специальные адреса памяти

Читайте также:
  1. A) Постоянно находится в памяти.
  2. Double сохраняется в памяти 15-16 десятичных знаков.
  3. III. Распределение виртуальной памяти
  4. LINUX|| Структура памяти процесса в ОС Linux.
  5. LINUX|| Управление памятью в ОС Linux. Карта памяти
  6. Remembrance Day -День памяти.
  7. Swap MACRO a,b; a,b - параметры макро (ячейки памяти)
  8. Адреса IP
  9. Адреса и указатели
  10. Адреса компьютеров в Internet

В ОС 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 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав