1.1.4          Псевдозмінні і функції для доступу до регістрів і прапорів

Turbo C підтримує зручний механізм доступу до внутрішніх регістрів мікропроцесора через псевдозмінні, посилання на які в С – програмі компілюється в посилання на внутрішній регістр мікропроцесора. Перерахуємо імена псевдозмінних:

_AX; _AL; _AH; _BX; _BL; _BH;

_CX; _CL; _CH; _DX; _DL; _DH;

_SI; _DI; _BP; _SP;

_CS; _ES; _DS; _SS.

Для того щоб дізнатись, наприклад, поточне значення сегментних регістрів, використовують наступний код:

unsigned cur_code_seg, cur_data_seg, cur_stack_seg, cur_es_seg;
cur_code_seg=_CS;
cur_data_seg=_DS;
cur_stack_seg=_SS;
cur_es_seg=_ES;

Псевдозмінна може використовуватись і в лівій частині оператора присвоювання. При цьому слід пам’ятати, що:

1)     неможливо безпосередньо присвоїти значення регістрам CS, IP;

2)     зміна значення сегментних регістрів DS, SS та ES часто приводить до непередбачених наслідків для програми і вимагає особливої обережності;

3)     встановлення в регістрі значення можуть бути неявно змінені операторами програми які слідують за ними і до моменту використання в інших виразах будуть містити не раніше присвоєне, а випадкове значення;

4)     при використанні псевдозмінних слід відключити використання регістрових змінних і регістрової оптимізації в опціях компілятора.

Для отримання значення сегментних регістрів може бути використана і спеціальна бібліотечна функція segread(), специфікація якої наведена нижче:

#include<dos.h>
void segread(struct SREGS*segp)

Заповнюється значеннями сегментних регістрів поля структурної змінної по шаблону SREGS. Користувач повинен описати структурну змінну і передати покажчик на неї. Шаблон структури SREGS міститься у файлі <dos.h>:

struct SREGS {
      unsigned int es;
      unsigned int cs;
      unsigned int ss;
      unsigned int ds;
};

Turbo C дозволяє встановлювати необхідні значення прапору переривання. Для цього використовуються макро enable() та disable(), прототипи яких містяться в файлі <dos.h>:

# include <dos.h>
void disable(void)
void enable(void)

Функція disable() забороняє всі апаратні переривання, що маскуються, а функція enable() дозволяє їх.