Физическое представление указателей near, far, huge

Указатель типа 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;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: