- •Введение
- •Достоинства и недостатки языка c
- •Типы данных в с
- •Модификаторы
- •Константы
- •Арифметические операции
- •Логические операции
- •Оператор присваивания
- •Организация множественных выражений
- •Комбинированные операции
- •Локальные и глобальные объекты
- •Модификатор extern
- •Статические и динамические объекты
- •Регистровые переменные
- •Описание неизменяемых объектов
- •Указатели
- •Явное преобразование типа
- •Оператор if
- •Операторы циклов Оператор while
- •Оператор do ... While
- •Оператор for
- •Оператор switch (переключатель)
- •Операторы передачи управления
- •Прототипы функций
- •Передача данных в функцию
- •Структуры и определения типов пользователя
- •Битовые поля
- •Объединения
- •Псевдофункция sizeof
- •Основные директивы препроцессора
- •Основные директивы условной компиляции
- •Дополнительные данные по Turbo-c
- •Организация памяти на машинах класса pc. Виды указателей
- •Работа с указателями на функцию
- •Основные регистры общего назначения процессора
- •Модели памяти
- •Использование стека
- •Организация прерываний в программе. Модификатор volatile
- •Порядок передачи данных в функцию. Модификатор pascal
- •Передача данных в программу. Функция main
- •Разбор типовых ошибок и недочетов при программировании
- •Некоторые функции библиотеки Turbo-c
- •Функции работы с оперативной памятью эвм
- •Функции работы с клавиатурой
- •Работа с дисплеем в символьном режиме
- •Работа с дисплеем в графическом режиме
- •Функции работы с дисками
- •Функции работы с временными интервалами и звуком
- •Функции преобразования данных
- •Функции работы со строками
- •Математические функции
- •Функции работы с файлами и каталогами
- •Функции работы со временем и датой
- •Функции процессов
- •Функции работы с портами машины
- •Интерфейс с дос
- •Задачи на практические занятия
- •Литература
- •Оглавление
Основные директивы условной компиляции
В ходе трансляции задачи можно менять определения переменных или логику выполнения в зависимости от каких-то внешних условий(например, от типа процессора или операционной среды). Это позволяют сделать директивы условной компиляции).
Директивы условной компиляции:
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(дальний указатель);