Указатель типа near задает неполный физический адрес, а только смещение (offset). Сегментная часть адреса определяется текущим значением регистра.
Указатель типа far задает полный физический адрес и при хранении в памяти занимает 4 байта. В памяти сначала располагается смещение адреса (2 байта) затем сегмент адреса.
Синтаксис обоих указателей следующий:
Тип _ near * имя _ переменный
Тип _ _ far * имя _ переменный
Например, описание
Int far * my _ ptr = 0x0000041A
Задает адрес 0000:041А, который находится в ячейке памяти, которая адресуется указателем my _ ptr
Заголовочный файл <dos.h> определяет три макроопределения (макрос) работы с указателями
FP _ OFF (void far * p),
Макрос возвращает смещение указателя Р
FP _ SEG (void far * p),
Макрос возвращает сегмент указателя Р
MK _ FP (unsigned seg, unsigned off)
Макрос возвращает длинный указатель, составленный из сегмента seg и смещения off, определенных в качестве параметров. А функция
* MK _ FP (unsigned seg, unsigned off)
возвратит содержимое адреса, на который указывает данный указатель.
Указатель типа huge аналогичен far – указателю, у которого смещение не превышает 15 (OXOF) байт.
|
|
Указатель может обозначаться в виде знака амперсанда &. Например
P = &a
означает, что Р указывает адрес, по которому размещается значение переменной а.
Когда вызванная функция получает параметры, обрабатывает их, то в ней нет прямой возможности изменить значения переменных вызывающей функции. В случае необходимости такого изменения вызывающая программа должна передать функции несами параметры (переменные), а их указатели, например
Pixlit (&x, &y),
Где x, y параметры.
Тогда сама функция имеет вид:
Int pixlit (* x, *y) {…},
Где х, у описаны уже как указатели. Прототип этой функции будет:
int pixlit (* x, *y)
Доступ к регистрам и флагам.
Доступ к регистрам и флагам в языке Си осуществляется через псевдопеременные. Их имена имеют вид: _AX, _AL, _ AH, _BX, _BL, _BH, _CX, _CL, _CH, _DX, _DL, _DH, _SI, _DI, _BP, _SP, _CS, _ES, _DS, _SS.
Для этого, например, чтобы узнать состояние регистра АХ необходимо ввести переменную, например sost _ reg, описать ее
int unsigned sost _reg
и выполнить оператор присваивания
sost _ reg = _AX
В регистр через псевдопеременную можно поместить также и определенное значения. Например, полагая
Char ch;
Можно осуществить следующий оператор присваивания
_ AL = ch;