МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів Контакти
Тлумачний словник |
|
|||||||
Вказівники типу near і far
Як і звичайні вказівники на дані, вказівники на функцію можуть мати тип near, far або huge. Вказівник типу nearзаймає в пам’яті 2 байти, вказівники far і huge– 4 байти. Тип вказівника на функцію, який встановлюється по замовчуванню, залежить від моделі пам’яті. В моделях пам’яті COMPACT, TINY i SMALL по замовчуванню вказівник на функцію має тип nearі задає тільки зміщення до точки входу в функцію відносно значення в сегментному регістрі CS. При прямому чи побічному виклику функції через near-вказівник використовується машинна команда “близького” прямого чи побічного виклику процедури, яка пов’язана з установкою нового значення тільки у регістрі IP. Для моделей пам’яті MEDIUM, LARGE і HUGE по замовчуванню вказівник на функцію займає 4 байти і включає як зміщення, так і адресу сегмента точки входу у функцію. При прямому чи побічному виклику функції через far-вказівник на функцію використовується машинна команда далекого прямого чи побічного виклику процедури, яка пов’язана як з установкою нового значення в регістрі IP,так і зі зміною значення сегментного регістра CS. В моделі пам’яті HUGE при вході у функцію додатково встановлюється значення регістра DS, яке відповідає сегменту даних функції. Пряма адресація при виклику процедури відповідає виклику функції через вказівник-константу. Побічний виклик використовується при виклику функції по вказівнику-змінній. Прийнятий по замовчування формат вказівника на функцію може бути відмінений явним заданням типу функції з використанням ключових слів near, far або huge. Наприклад:
int far function (int, int); / * Прототип функції */ . . . int far function (int a, int b) /* Визначення функції */ { Тіло функції}
Синтаксис мови С вимагає співпадіння модифікаторів типу функції як в прототипі, так і у визначенні функції. Компілятор завжди трактує першу частину визначення як тип значення, яке повертає функція, а наступне слово, як модифікатор. Тому, наприклад,
char far *far str_func (void);
є прототипом far-функції, яка повертає значення вказівника типу char far *. Сама функція є far-функцією. Опис, наведений нижче, визначає вказівник func_ptr на far-функцію (можна сказати, і far-вказівник на функцію), яка приймає два аргументи типу int і повертає значення типу char far *:
char far *far (*func_ptr) (int, int);
При порівнянні far-вказівників операціями <, >, <=, >= використовуються тільки зміщення (вказівники порівнюються як числа типу int), а операціями != і == far-вказівники порівнюються як числа типу long. Нехай, наприклад, оголошені наступні вказівники:
void far* vp1=0xb8000000;
void far* vp2=0xb4004000;
void far* vp3=0xb0008000;
Дані вказівника вказують на одну і ту ж фізичну адресу, але операція порівняння == дає результат FALSE, != дає значення TRUE. При нарощенні вказівника типу farвикористовується тільки його зміщення. Якщо при цьому результат не вміщається у зміщення, то відбувається відрізання старших розрядів результату. Наприклад, після додавання до vp3 числа 8000h зміщення вказівника стане рівним b000:0000h. Таким чином, за межі сегмента вийти неможливо.
Читайте також:
|
||||||||
|