
Массивы 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 нельзя передавать в качестве параметров процедурам или функциям. Эти идентификаторы не употребляются без индексных выражений.
Пример.
Var z:byte;
Begin
Z:=mem[0000:0001]; {чтение ячейки памяти}
Writeln(z); {вывод считанного значения}
Mem[0000:0001]:=5; {изменение значения ячейки памяти}
Writeln(Mem[0000:0001]) {вывод нового значения}
End.
Когда в память требуется занести или считать по указанному адресу слово (два байта) или двойное слово (четыре байта) используются массивы MemW и MemL соответственно.
Отметим, что для указания базового сегмента и смещения в некоторых случаях удобно использовать стандартные функции Seg и Ofs:
Mem[Seg(<имя_переменной>):Ofs(<имя_переменной>)]:=<значение>.
Прерывания
Операционная система осуществляет управление с помощью прерываний. Прерывание представляет собой сигнал процессору, вырабатываемый программой, каким-либо устройством или самим процессором. Этот сигнал приостанавливает выполнение программы и запускает соответствующую функцию операционной системы для выполнения необходимых системных действий, например ввод-вывод данных или обработка ошибок, с последующим возобновлением выполнения прерванной программы.
Прерывания могут быть внешними и внутренними. Внешние прерывания вызываются внешними по отношению к МП событиями и являются непланируемыми прерываниями. Внутренние прерывания возникают внутри МП во время вычислительного процесса. К их возбуждению приводит 1 из 2-х причин:
ненормальное внутреннее состояние МП, возникшее при выполнении некоторой команды программы. Такие события принято называть исключительными ситуациями, и относятся они к не планируемым;
обработка машинной команды вызова прерываний. Этот тип прерываний называется программным. Это планируемое прерывание, т. к. с его помощью программист обращается в нужное для него время за обслуживанием своих запросов либо к ОС, либо BIOS, либо к собственным программам обработки прерываний.
Под системой прерываний понимают совокупность программных и аппаратных средств, реализующих механизм прерываний. К аппаратным средствам системы прерываний относятся выводы МП, микросхема программируемого контроллера прерываний, внешние устройства. К программным средствам системы прерываний реального режима относятся:
Таблица векторов – содержит в определённом формате, который зависит от режима работы МП, указатели на процедуры обработки соответствующих прерываний.
Соответствующие флаги в регистре флагов flags/eflags:
If - флаг прерываний – предназначен для запрещения аппаратных прерываний по входу intr, если if=1, то МП обрабатывает прерывания, если if=0, МП игнорирует сигналы на входе intr.
Tf - флаг трассировки – переводит МП в режим покомандной работы.
машинные команды МП вызова прерываний.