Читайте также:
|
|
В Турбо-Паскале имеется возможность включения в программу фрагментов, написанных непосредственно в машинных кодах. Для этого используется зарезервированное слово INLINE, за которым в круглых скобках следует один или несколько элементов машинного кода, разделяемых косыми чертами. Элемент кода, в свою очередь, строится из одного или более элементов данных, разделенных знаками " + " или " - ".
В качестве элемента данных может использоваться целая константа, идентификатор (переменной, константы или функции) или ссылка на счетчик адреса " * ". Каждый элемент данных вызывает генерацию 1 или 2 байт кода программы. Значение этого кода получается сложением или вычитанием элементов данных в соответствии с разделяющим их знаком. Значением идентификатора переменной, константы, функции является адрес соответствующего объекта, значением ссылки на счетчик адреса является тот адрес, по которому будет размещаться следующий байт кода.
Элемент кода будет генерировать 1 байт кода, если этот элемент состоит только из целых констант и значение результата не превышает 1 байта, т.е. находится в диапазоне от 0 до 255. Если значение превышает 255 или элемент кода содержит ссылку на счетчик адреса, генерируются 2 байта. Знаки " > " и " < " могут использоваться для отмены автоматического выбора размера генерируемого кода. Если элемент кода начинается со знака "<", в код заносится только один младший байт, даже если само значение занимает 2 байта. Наоборот, если элемент начинается со знака " > ", в код заносится 2 байта (старший байт может оказаться нулевым).
Значением идентификатора, как уже говорилось, является смещение соответствующего объекта. Если переменная. глобальная, смещение задается относительно сегмента данных, хранящегося в регистре DS, если переменная локальная, - относительно сегмента стека (регистр SР). Базовым сегментом типизированной константы является сегмент кода (регистр СS).
В следующем примере приводятся две короткие процедуры, с помощью которых можно вывести данные через любой порт ПЭВМ:
Function InPort(Port: Word): Word;
Var
pp: Word;
cc: Char;
Begin
pp:= port;
in1ine({assembler code: }
$8b/$96/pp/ { MOV DX,pp[bp] }
$EC/ { IN AX,DX }
$88/$86/cc { MOV cc[bp],AX }
);
InPort:= ord(cc);
End;
Procedure OutPort(Port, Bt: Word);
Var
pp: Word;
cc: Char;
Begin
pp:=port;
cc:=chr(Bt);
In1ine(
$8a/$86/cc/ { MOV AX,cc[bp] }
$8b/$96/pp/ { MOV DX,pp[bp] }
$EE { OUT DX,AX }
);
END;
Операторы INLINE могут произвольным образом смешиваться с другими операторами Турбо-Паскаля, однако при выходе из процедуры (функции) содержимое регистров BP, SP, DS и SS должно быть таким же, как и при входе в нее.
Дата добавления: 2015-10-24; просмотров: 61 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Внешние процедуры (функции) | | | Quot;Соленое детство". Автобиографическое эссе Александра Гезалова. |