Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C.doc
Скачиваний:
29
Добавлен:
08.05.2015
Размер:
1.17 Mб
Скачать

Основные директивы условной компиляции

В ходе трансляции задачи можно менять определения переменных или логику выполнения в зависимости от каких-то внешних условий(например, от типа процессора или операционной среды). Это позволяют сделать директивы условной компиляции).

Директивы условной компиляции:

1. #if - если

2. #ifdef - если определено

3. #ifndef - если не определено

4. #else - иначе

5. #endif - конец конструкции #if

6. #elif - иначе если

Примеры:

а.

#if a==2

#define MAX 2

#else

#define MAX 3

#endif

б.

#ifdef test

#define MIN 4

#endif

Дополнительные данные по Turbo-c

В этом разделе рассмотрены специальные вопросы, связанные с использованием языка С для программирования физических устройств при написании программ управления, связью с другими языками программирования, а также составлением системных программ. Здесь же освещены вопросы, связанные с реализацией компилятора С на IBM-совместимых машинах.

Организация памяти на машинах класса pc. Виды указателей

Память в IBM-совместимых машинах организована по страничному принципу, где в стандартном режиме каждая страница состоит из памяти объемом 64 Кбт. Адрес на странице задается в виде 16-тиразрядного слова. Кроме этого, может также задаваться адрес страницы в виде 16-тиразрядного слова, а общий адрес получается путем сложения этих адресов со сдвигом адреса страницы влево на 4 разряда, то есть:

Адрес на странице (смещение) XXXXXXXXXXXXXXXX

Адрес страницы (сегмента) YYYYYYYYYYYYYYYY0000

______________________________________________________

Адрес объекта ZZZZZZZZZZZZZZZZZZZZ

Смещение располагается, как правило, в регистре общего назначения процессора CS, а адрес сегмента - в регистре DS.

Из приведенного рисунка видно, что общий адрес объекта может состоять из 20 разрядов, что обеспечивает адресацию в пределах 1 Мбт. Кроме того, разные пары "Адрес страницы - Адрес на странице" могут указывать на один и тот же адрес объекта, а страницы могут быть организованы с перекрытием друг с другом. Поэтому адреса объектов могут состоять только из адреса на странице, если все данные умещаются в 64Кбт (вид адреса near - ближний), а также из адреса на странице плюс адреса страницы (вид адреса far - дальний). Поскольку разные пары "Адрес страницы - Адрес на странице", например, 0:40 и 2:8, дают один и тот же адрес, то сравнение этих указателей даст неверный результат (не равны). Для устранения этого недостатка в С введен еще один вид 32-разрядного адреса huge, который нормирован относительно адреса сегмента (он наибольший из возможных, то есть выровнен относительно параграфа - 4 бита). В этом случае сравнение адресов всегда даст правильный результат. Кроме того, использование этого способа адресации позволит использовать структуры данных длиной свыше 64 Кбт.

Возвращаясь к вопросу об указателях, их описание может быть произведено следующим образом:

<модификаторы> <тип указателя> <вид> *<имя объекта>

Здесь добавлен вид указателя, который задается одним из ключевых слов near, far или huge. Если вид указателя опущен, то он определяется видом модели памяти.

Для создания дальнего указателя из двух чисел используется функция макроподстановки (псевдофункция)

void far *MK_FP(сегмент,смещение);

где сегмент и смещение - беззнаковые 16-тиразрядные целые.

Для получения смещения и сегмента дальнего указателя используются функции макроподстановки

unsigned FP_OFF(дальний указатель);

unsigned FP_SEG(дальний указатель);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]