- |
- |
- |
-
-
- Документация на C--.
- |
- |
- |
- |
-
-
-
-
-
-Содержание.
-
-
-
-
-1 Введение.
+
+
+ Документация на C--
+
+
+
+
+Содержание
+
+
+ 1 Введение.
1.1 История создания и развития.
- 1.2 Что такое C--?
- 1.3 Как установить C--.
+ 1.2 Что такое C--?
+ 1.3 Как установить C--.
-2. Управление компиляцией.
+2. Управление компиляцией.
2.1 Параметры командной строки компилятора C--.
- 2.1.1 /ON - Оптимизация числовых выражений.
- 2.1.2 /DE - Временное расширение разрядности переменной.
- 2.1.3 /ARGC - Альтернативный обработчик командной строки.
- 2.1.4 /OST - слияние одинаковых строковых констант.
- 2.1.5 /D - установка идентификатора в TRUE из командной строки.
- 2.1.6 /IA - упрощенный ввод ассемблерных инструкций.
- 2.1.7 /CRI - пропуск повторно включаемого файла.
- 2.1.8 /IND - импорт имен процедур из DLL.
- 2.1.9 /WS - задать имя stub файла для программ под windows.
- 2.1.10 /WBSS - разместить не инициализированные данные в отдельной секции.
- 2.1.11 /DBG - создание отладочной информации.
- 2.1.12 /J0 /J1 /J2.
- 2.1.13 /LST - Создание ассемблерного листинга.
- 2.1.14 /ENV - Сохранение адреса переменных окружения.
- 2.1.15 /CPA - Очистка post-области данных.
- 2.1.16 /W - вывод предупреждений.
- 2.1.17 /NW - Выборочное отключение типов предупреждений.
- 2.1.18 /WSI - короткая таблица импорта.
- 2.2 Директивы транслятора.
- 2.2.1 ?ifdef/?ifndef
- 2.2.2 ?initallvar
- 2.2.3 ?usestartup
- 2.2.4 ?startusevar
- 2.2.5 ?atexit
- 2.2.6 ?startuptomain
- 2.2.7 ?undef
- 2.2.8 ?align и ?aligncode
- 2.2.9 ?pragma
+ 2.1.1 /ON - Оптимизация числовых выражений.
+ 2.1.2 /DE - Временное расширение разрядности переменной.
+ 2.1.3 /ARGC - Альтернативный обработчик командной строки.
+ 2.1.4 /OST - слияние одинаковых строковых констант.
+ 2.1.5 /D - установка идентификатора в TRUE из командной строки.
+ 2.1.6 /IA - упрощенный ввод ассемблерных инструкций.
+ 2.1.7 /CRI - пропуск повторно включаемого файла.
+ 2.1.8 /IND - импорт имен процедур из DLL.
+ 2.1.9 /WS - задать имя stub файла для программ под windows.
+ 2.1.10 /WBSS - разместить не инициализированные данные в отдельной секции.
+ 2.1.11 /DBG - создание отладочной информации.
+ 2.1.12 /J0 /J1 /J2.
+ 2.1.13 /LST - Создание ассемблерного листинга.
+ 2.1.14 /ENV - Сохранение адреса переменных окружения.
+ 2.1.15 /CPA - Очистка post-области данных.
+ 2.1.16 /W - вывод предупреждений.
+ 2.1.17 /NW - Выборочное отключение типов предупреждений.
+ 2.1.18 /WSI - короткая таблица импорта.
+ 2.2 Директивы транслятора.
+ 2.2.1 ?ifdef/?ifndef
+ 2.2.2 ?initallvar
+ 2.2.3 ?usestartup
+ 2.2.4 ?startusevar
+ 2.2.5 ?atexit
+ 2.2.6 ?startuptomain
+ 2.2.7 ?undef
+ 2.2.8 ?align и ?aligncode
+ 2.2.9 ?pragma
-3. Константы.
+3. Константы.
3.1 Числовые константы.
- 3.2 Символьные константы.
- 3.3 Строковые константы.
- 3.4 Постоянные выражения.
+ 3.2 Символьные константы.
+ 3.3 Строковые константы.
+ 3.4 Постоянные выражения.
-4. Выражения.
+4. Выражения.
4.1 Типы выражений.
- 4.2 Выражения типа EAX/AX/AL.
- 4.3 Выражения использующие получатель при вычислении выражения.
- 4.4 Не - EAX/AX/AL выражения.
- 4.5 Условные выражения.
- 4.5.1 Простые условные выражения.
- 4.5.2 Сложные условные выражения.
- 4.6 Изменение типа выражения при присваивании.
- 4.7 Вычисление в регистры EAX/AX/AL со знаком.
+ 4.2 Выражения типа EAX/AX/AL.
+ 4.3 Выражения использующие получатель при вычислении выражения.
+ 4.4 Не - EAX/AX/AL выражения.
+ 4.5 Условные выражения.
+ 4.5.1 Простые условные выражения.
+ 4.5.2 Сложные условные выражения.
+ 4.6 Изменение типа выражения при присваивании.
+ 4.7 Вычисление в регистры EAX/AX/AL со знаком.
-5. Идентификаторы.
+5. Идентификаторы.
5.1 Формат идентификатора.
- 5.2 Зарезервированные идентификаторы.
- 5.3 Универсальные регистры для 16 и 32-битного режима.
- 5.4 Предопределенные идентификаторы.
+ 5.2 Зарезервированные идентификаторы.
+ 5.3 Универсальные регистры для 16 и 32-битного режима.
+ 5.4 Предопределенные идентификаторы.
-6. Переменные.
+6. Переменные.
6.1 Типы переменных.
- 6.2 Объявление переменных.
- 6.3 Глобальные переменные.
- 6.4 Локальные переменные.
- 6.5 Динамические переменные и структуры.
- 6.6 Присваивание одного значения нескольким переменным.
- 6.7 Переменные типа float.
+6.2 Объявление переменных.
+ 6.3 Глобальные переменные.
+ 6.4 Локальные переменные.
+ 6.5 Динамические переменные и структуры.
+ 6.6 Присваивание одного значения нескольким переменным.
+ 6.7 Переменные типа float.
6.7.1 Формат переменных типа float.
- 6.7.2 Константы с плавающей точкой.
- 6.7.3 Диапазон допустимых значений.
- 6.7.4 Математические операции.
- 6.7.5 Преобразования типов.
- 6.7.6 Операции сравнения.
- 6.7.7 Сравнение переменных типа float с 32-битным регистром.
- 6.8 Указатели.
+ 6.7.2 Константы с плавающей точкой.
+ 6.7.3 Диапазон допустимых значений.
+ 6.7.4 Математические операции.
+ 6.7.5 Преобразования типов.
+ 6.7.6 Операции сравнения.
+ 6.7.7 Сравнение переменных типа float с 32-битным регистром.
+ 6.8 Указатели.
-7. Адресация.
+7. Адресация.
7.1 Относительная адресация.
- 7.2 Абсолютная адресация.
+ 7.2 Абсолютная адресация.
-8. Работа с блоками данных.
+8. Работа с блоками данных.
8.1 Структуры.
8.1.1 Что такое структуры.
- 8.1.2 Синтаксис.
- 8.1.3 Инициализация структур при объявлении.
- 8.1.4 Инициализация структуры при выполнении программы.
- 8.1.5 Операции с элементами структур.
- 8.1.6 Вложенные структуры.
- 8.1.7 Отображение тега структуры на блок памяти.
- 8.1.8 Битовые поля структур.
- 8.2 Объединения.
- 8.3 Команды FROM и EXTRACT.
+ 8.1.2 Синтаксис.
+ 8.1.3 Инициализация структур при объявлении.
+ 8.1.4 Инициализация структуры при выполнении программы.
+ 8.1.5 Операции с элементами структур.
+ 8.1.6 Вложенные структуры.
+ 8.1.7 Отображение тега структуры на блок памяти.
+ 8.1.8 Битовые поля структур.
+ 8.2 Объединения.
+ 8.3 Команды FROM и EXTRACT.
-9. Операторы.
+9. Операторы.
9.1 Условные инструкции.
- 9.2 Циклы do{} while.
- 9.3 Циклы loop, LOOPNZ, loopnz.
- 9.4 Цикл while, WHILE.
- 9.5 Цикл for, FOR.
- 9.6 Оператор переключатель switch.
- 9.7 Оператор перехода goto, GOTO.
- 9.8 Оператор разрыва break, BREAK.
- 9.9 Оператор продолжения continue, CONTINUE.
- 9.10 Логическое объединение условий.
- 9.11 Переход через циклы.
- 9.12 Инвертирование флага проверки условий.
- 9.13 Вычисление выражения, а затем проверка условия.
- 9.14 Проверка битов при операции сравнения.
- 9.15 Оператор перестановки.
- 9.16 Оператор отрицания.
- 9.17 Оператор инверсии.
- 9.18 Специальные условные выражения.
- 9.19 Символ $ - вставляет текущий адрес программы.
- 9.20 Ключевое слово static и оператор ::.
- 9.21 Оператор sizeof.
- 9.22 Метки перехода.
+ 9.2 Циклы do{} while.
+ 9.3 Циклы loop, LOOPNZ, loopnz.
+ 9.4 Цикл while, WHILE.
+ 9.5 Цикл for, FOR.
+ 9.6 Оператор переключатель switch.
+ 9.7 Оператор перехода goto, GOTO.
+ 9.8 Оператор разрыва break, BREAK.
+ 9.9 Оператор продолжения continue, CONTINUE.
+ 9.10 Логическое объединение условий.
+ 9.11 Переход через циклы.
+ 9.12 Инвертирование флага проверки условий.
+ 9.13 Вычисление выражения, а затем проверка условия.
+ 9.14 Проверка битов при операции сравнения.
+ 9.15 Оператор перестановки.
+ 9.16 Оператор отрицания.
+ 9.17 Оператор инверсии.
+ 9.18 Специальные условные выражения.
+ 9.19 Символ $ - вставляет текущий адрес программы.
+ 9.20 Ключевое слово static и оператор ::.
+ 9.21 Оператор sizeof.
+ 9.22 Метки перехода.
-10. Ассемблер.
+10. Ассемблер.
10.1 Поддержка команд ассемблера.
- 10.2 Ключевое слово asm.
- 10.3 Префикс dup - повторение инструкций DB/DW/DD.
- 10.4 Инструкции процессора Pentium III.
+ 10.2 Ключевое слово asm.
+ 10.3 Префикс dup - повторение инструкций DB/DW/DD.
+ 10.4 Инструкции процессора Pentium III.
-11. Процедуры.
+11. Процедуры.
11.1 Типы процедур, функций и макрокоманд.
- 11.2 Стековые процедуры.
- 11.3 Регистровые процедуры.
- 11.4 Динамические процедуры.
- 11.4.1 Установка динамической процедуры в определенное место программы.
- 11.5 inline-процедуры.
- 11.5.1 Другое применение inline.
- 11.6 Процедуры обработки прерываний.
- 11.7 Замена return на goto.
- 11.8 Возвращаемые значения.
- 11.9 Объявление параметров в регистровых процедурах.
- 11.10 Объявление параметров в стековых процедурах.
- 11.11 Использование макрокоманд.
- 11.12 Передача параметров в стековые процедуры через регистры.
- 11.13 Вызов процедур с адресом в регистре.
- 11.14 Встоенные в компилятор процедуры.
- 11.14.1 Процедуры ABORT, ATEXIT и EXIT.
- 11.14.2 Процедуры inp/inportb, inport, inportd, outp/outportb, outport и
+11.2 Стековые процедуры.
+ 11.3 Регистровые процедуры.
+ 11.4 Динамические процедуры.
+ 11.4.1 Установка динамической процедуры в определенное место программы.
+ 11.5 inline-процедуры.
+ 11.5.1 Другое применение inline.
+ 11.6 Процедуры обработки прерываний.
+ 11.7 Замена return на goto.
+ 11.8 Возвращаемые значения.
+ 11.9 Объявление параметров в регистровых процедурах.
+ 11.10 Объявление параметров в стековых процедурах.
+ 11.11 Использование макрокоманд.
+ 11.12 Передача параметров в стековые процедуры через регистры.
+ 11.13 Вызов процедур с адресом в регистре.
+ 11.14 Встоенные в компилятор процедуры.
+ 11.14.1 Процедуры ABORT, ATEXIT и EXIT.
+ 11.14.2 Процедуры inp/inportb, inport, inportd, outp/outportb, outport и
outportd.
- 11.14.3 Процедуры для работы с вещественными числами.
- 11.15 Классы.
+11.14.3 Процедуры для работы с вещественными числами.
+ 11.15 Классы.
11.15.1 Объявление процедур в структурах.
- 11.15.2 Наследование.
- 11.15.3 Наследование процедур.
+ 11.15.2 Наследование.
+ 11.15.3 Наследование процедур.
-12. Типы выходных файлов.
+12. Типы выходных файлов.
12.1 Выходные файлы типа COM.
- 12.2 Выходные файлы типа EXE.
- 12.3 Выходной файл *.EXE с моделью памяти tiny.
- 12.4 Объектный выходной файл OBJ.
- 12.5 COM файл symbiosis.
+12.2 Выходные файлы типа EXE.
+ 12.3 Выходной файл *.EXE с моделью памяти tiny.
+ 12.4 Объектный выходной файл OBJ.
+ 12.5 COM файл symbiosis.
12.5.1 СИМБИОЗ - что это такое?
- 12.5.2 Как это делать.
- 12.5.3 Использование.
- 12.5.4 Злоупотребления.
- 12.6 SYS - драйверы устройств.
- 12.7 Компиляция кода расширителей ROM-BIOS.
- 12.8 32-битные файлы.
+12.5.2 Как это делать.
+ 12.5.3 Использование.
+ 12.5.4 Злоупотребления.
+ 12.6 SYS - драйверы устройств.
+ 12.7 Компиляция кода расширителей ROM-BIOS.
+ 12.8 32-битные файлы.
12.8.1 32-битный код под DOS.
- 12.8.2 32-битный код под Windows.
- 12.8.3 Вызов API процедур по ординалам.
- 12.8.4 Создание DLL под Windows.
- 12.8.5 Инициализация DLL при загрузке.
- 12.8.6 Компиляция ресурсов.
- 12.9 Выходные файлы для MeOS.
+ 12.8.2 32-битный код под Windows.
+ 12.8.3 Вызов API процедур по ординалам.
+ 12.8.4 Создание DLL под Windows.
+ 12.8.5 Инициализация DLL при загрузке.
+ 12.8.6 Компиляция ресурсов.
+ 12.9 Выходные файлы для MeOS.
-13. Приложения.
+13. Приложения.
13.1 Поиск включаемых файлов.
- 13.2 Регистры, которые должны быть сохранены.
- 13.3 C--.ini файл.
- 13.4 startup.h-- файл.
- 13.5 mainlib.ldp файл.
- 13.6 C-- символы.
-
+ 13.2 Регистры, которые должны быть сохранены.
+ 13.3 C--.ini файл.
+ 13.4 startup.h-- файл.
+ 13.5 mainlib.ldp файл.
+ 13.6 C-- символы.
+
-1. Вступление.
+1. Вступление.
1.1 История создания и развития.
-
+
Автором языка SPHINX C-- является Peter Cellik (CANADA). Последняя
авторская версия SPHINX C-- v0.203 от 28.Oct.96. К сожалению автор
@@ -251,12 +250,12 @@
предложение будет ценным (на мой взгляд, так что Вам придется свое
предложение хорошо аргументировать) и его будет возможным реализовать, оно
без сомнения найдет место в компиляторе.
-Return to contents.
+Return to contents.
-
+
1.2 Что такое C--?
-
+
C-- был разработан, для того чтобы строить маленькие и быстрые
программы. Это наиболее подходит для создания резидентных программ (TSR),
@@ -280,12 +279,12 @@
C-- разработан только для использования на компьютерах с процессорами
совместимыми с семейством 80x86. Компилятор может работать только с
операционными системами DOS и семейством Windows.
-Return to contents.
+Return to contents.
-
+
1.3 Как установить C--.
-
+
Компилятору C-- для работы нужны совсем незначительные ресурсы:
процессор 386 или лучше, чуть более 1 Мб дискового пространства и 4Мб
@@ -320,14 +319,14 @@
компилятора нет. Существует несколько других способов, указать компилятору
место расположения библиотек. Поэтому определять или не определять
переменную окружения дело вашего вкуса и привычек.
-Return to contents.
+Return to contents.
-
+
2. Управление компиляцией.
2.1 Параметры командной строки компилятора C--.
-
+
Формат командной строки вызова компилятора C--:
@@ -498,12 +497,12 @@
Параметры командной строки можно писать как большими, так и
маленькими буквами.
-Return to contents.
+Return to contents.
-
+
2.1.1 /ON - Оптимизация числовых выражений.
-
+
При включении в командную строку опции /ON или в файл C--.INI строчки
ON, компилятор будет анализировать операции над числами и где это
@@ -543,12 +542,12 @@
AX = AX / 16;
AX = AX * 16;
var = AX;
-Return to contents.
+Return to contents.
-
+
2.1.2 /DE - Временное расширение разрядности переменной.
-
+
Как известно, после умножения может произойти переполнение, т.е
разрядность результата может превысить разрядность исходных операндов и
@@ -572,12 +571,12 @@
если значения переменных b = 0xC000, c = 0x1000, d=0x10, после запуска
такая программа зависнет с сообщением о том, что произошло переполнение
при делении.
-Return to contents.
+Return to contents.
-
+
2.1.3 /ARGC - Альтернативный обработчик командной строки.
-
+
Отличие этого обработчика командной строки от parsecommandline
заключается в том, что при вызове PARAMSTR(0); Вы получите адрес строки в
@@ -589,12 +588,12 @@
Альтернативный обработчик командной строки включается директивой
?argc TRUE или из командной строки компилятора ключом /argc или
строчкой argc в файле C--.INI.
-Return to contents.
+Return to contents.
-
+
2.1.4 /OST - слияние одинаковых строковых констант.
-
+
Если этот режим оптимизации будет активизирован, то компилятор будет
запоминать все строковые константы и при обнаружении одинаковых в код
@@ -609,7 +608,7 @@
//оптимизации.
void proc(){
- WRITESTR("test"); // эта строка будет участвовать в оптимизации.
+ WRITESTR("test"); // эта строка будет участвовать в оптимизации.
AX="test"; // переменной AX будет присвоен адрес строки,
// которая была вставлена в код программы в
// предыдущей строке.
@@ -621,12 +620,12 @@
Включается этот режим оптимизации либо с командной строки /ost, либо
директивой #pragma option ost, либо строкой в файле c--.ini - ost.
Отключить, включенный ранее, этот режим можно директивой #pragma option ost-.
-Return to contents.
+Return to contents.
-
+
2.1.5 /D - установка идентификатора в TRUE из командной строки.
-
+
Если Вы написали программу, которая может компилироваться по разному,
в зависимости от состояния некоторых идентификаторов (используется режим
@@ -636,12 +635,12 @@
программы.
Идентификатор вводится с командной строки ключом /d=idname.
-Return to contents.
+Return to contents.
-
+
2.1.6 /IA - упрощенный ввод ассемблерных инструкций.
-
+
Стало возможным использовать ассемблерные инструкции без префикса $
и вне блока asm. Этот режим включается: с командной строки опцией /ia;
@@ -652,12 +651,12 @@
качестве имен переменных или процедур. Ассемблерные инструкции компилятор
распознает независимо от того, написаны они маленькими или большими
буквами.
-Return to contents.
+Return to contents.
-
+
2.1.7 /CRI - пропуск повторно включаемого файла.
-
+
Чаще всего, повторно включать файл в компилируемый проект, нет
необходимости, но это иногда происходит из-за того, что некоторые
@@ -671,12 +670,12 @@
/cri-, которая запрещает компилятору делать проверку на повторное
включение. Соответственно, для c--.ini файла, это можно сделать строкой
cri- или директивой в компилируемом файле - #pragma option cri-.
-Return to contents.
+Return to contents.
-
+
2.1.8 /IND - импорт имен процедур из DLL.
-
+
Если Вы хотите в своей программе использовать DLL, для которой нет
заголовочного файла с описанием процедур, то компилятор может
@@ -692,12 +691,12 @@
контролировать число параметров передаваемых процедуре. И, к сожалению,
компилятор умеет импортировать имена из библиотек имеющих только формат
PE-файла.
-Return to contents.
+Return to contents.
-
+
2.1.9 /WS - задать имя stub файла для программ под windows.
-
+
Как известно, в программах под windows есть DOS заглушка, называемая
stub, которой передается управление при запуске такой программы в чистом
@@ -711,12 +710,12 @@
Таким образом, у Вас появилась возможность создавать программы,
работающие и под DOS и под windows.
-Return to contents.
+Return to contents.
-
+
2.1.10 /WBSS - разместить не инициализированные данные в отдельной секции.
-
+
Секция .bss создается автоматически при компиляции программ с ключом
/w32. Если Вы хотите иметь эту секцию и при компиляции программ с
@@ -728,12 +727,12 @@
файла. Теоретически, для процессоров, у которых есть отдельный кэш для
данных, использование секции .bss, должно повышать скорость работы
программы.
-Return to contents.
+Return to contents.
-
+
2.1.11 /DBG - создание отладочной информации.
-
+
Если при компиляции программы в командную строку добавить ключ /dbg,
или в файл конфигурации c--.ini добавить строку dbg, то компилятор после
@@ -757,12 +756,12 @@
делать. Если Вы знаете, как создавать 32-битные программы с
DOS-расширителем компиляторами фирмы Borland с включением в них отладочной
информации, то расскажите мне. А я попробую применить это для C--.
-Return to contents.
+Return to contents.
-
+
2.1.12 /J0 /J1 /J2
-
+
Синонимом ключей /J0 /J1 /J2 является директива #jumptomain с
параметрами NONE, SHORT и NEAR соответственно.
@@ -811,12 +810,12 @@
{
...
}
-Return to contents.
+Return to contents.
-
+
2.1.13 /LST - Создание ассемблерного листинга.
-
+
С помощью дополнительной опции командной строки -lst Вы можете
получить вместе с исполнительным файлом и его ассемблерный листинг.
@@ -825,12 +824,12 @@
Ассемблерный листинг создается независимой от компилятора частью кода
с использованием информации накапливаемой при компиляции программы.
-Return to contents.
+Return to contents.
-
+
2.1.14 /ENV - Сохранение адреса переменных окружения.
-
+
Если при компиляции программы Вы в командную строку добавите опцию
-ENV или в файл c--.ini строка ENV, то компилятор добавит в вашу
@@ -838,12 +837,12 @@
адрес переменных окружения запускаемой программы. Для программ под
Windows это будет полный адрес, а для остальных в этой переменной будет
сохраняться только адрес сегмента.
-Return to contents.
+Return to contents.
-
+
2.1.15 /CPA - Очистка post-области данных.
-
+
Переменные, которым в теле программы не было присвоено никакое
значение, не включаются в тело скомпилированной программы. Для них
@@ -853,12 +852,12 @@
Если Вам необходимо, чтобы неинициализированные переменные при
загрузке программы всегда содержали одно и тоже значение (ноль) -
включите в командную строку опцию -CPA.
-Return to contents.
+Return to contents.
-
+
2.1.16 /W - вывод предупреждений.
-
+
По умолчанию компилятор не выводит предупреждения и многие даже не
подозревают о существовании такой полезной опции. В C-- предупреждения
@@ -879,12 +878,12 @@
wf=warning
Вы будете получать в файле warning предупреждения.
-Return to contents.
+Return to contents.
-
+
2.1.17 /NW - Выборочное отключение типов предупреждений.
-
+
Сейчас компилятор может выдавать 12 типов предупреждений и, иногда их
бывает так много, что становится трудно в них ориентироваться. Теперь
@@ -905,12 +904,12 @@
10 - Return flag was destroyed
11 - Code may not be executable
12 - Don't use local/parametric values in inline procedures
-Return to contents.
+Return to contents.
-
+
2.1.18 /WSI - короткая таблица импорта.
-
+
Таблица импорта обычно состоит в свою очередь из четырех таблиц. Две
таблицы LookUp Table и Import Address Table абсолютно одинаковы.
@@ -920,12 +919,12 @@
только Import Address Table). Тем самым у Вас получится более компактная
таблица импорта, что приведет, в некоторых случаях, к созданию более
компактного выходного файла.
-Return to contents.
+Return to contents.
-
+
2.2 Директивы транслятора.
-
+
C-- не содержит препроцессор. Тем не менее, есть несколько функций
очень похожих на функции C препроцессора.
@@ -939,7 +938,7 @@
? aligncode [val] Выровнять код программы на четный по
умолчанию или на адрес кратный величине val.
- Заполнение производится кодом 0x90.
+ Заполнение производится кодом 0x90.
? aligner (aligner value) определить значение байта вставки.
@@ -1129,12 +1128,12 @@
? usestartup разрешает компилятору использовать ячейки
памяти, занимаемые кодом начальной
инициализации программы.
-Return to contents.
+Return to contents.
-
+
2.2.1 ?ifdef/?ifndef
-
+
Ранее директива ?ifdef срабатывала на наличие константы независимо
от значения ее величины, а директива ?ifndef срабатывала на отсутствие
@@ -1150,7 +1149,7 @@
Есть возможность проверки типа CPU для которого ведется компиляция.
Допустимые варианты синтаксиса:
- ?ifdef cpu > 1 //если программа компилируется для CPU выше 80186
+ ?ifdef cpu > 1 //если программа компилируется для CPU выше 80186
?ifndef cpu >= 2 // -------//------------- не больше или равно 80286
?ifdef cpu == 3 // -------//------------- равно 80386
?ifdef cpu != 0 // -------//------------- не равен 8086
@@ -1159,12 +1158,12 @@
Эта директива позволит Вам писать одну процедуру для различных типов
CPU.
-Return to contents.
+Return to contents.
-
+
2.2.2 ?initallvar
-
+
Директивой ?initallvar TRUE включается режим при котором всем
неинициализированным переменным будет присвоено нулевое значение и они
@@ -1174,12 +1173,12 @@
Параметр FALSE этой директивы отключает этот режим.
По умолчанию эта директива установлена в FALSE.
-Return to contents.
+Return to contents.
-
+
2.2.3 ?usestartup
-
+
Директива ?usestartup разрешает компилятору использовать ячейки кода
начальной инициализации программы (startup) для последующего размещения в
@@ -1188,12 +1187,12 @@
резидентных.
Эту директиву применяют только для генерации *.COM файлов.
-Return to contents.
+Return to contents.
-
+
2.2.4 ?startusevar
-
+
Директивой ?startusevar можно указать начальный адрес с которого
компилятор будет распределять память для неинициализированных переменных.
@@ -1203,12 +1202,12 @@
резидентных, так и для обычных программ.
Эту директиву применяют только для генерации *.COM файлов.
-Return to contents.
+Return to contents.
-
+
2.2.5 ?atexit
-
+
Директива ?atexit добавляет в startup программы код поддержки
процедуры ATEXIT, резервирует место для хранения 16 адресов процедур и
@@ -1221,12 +1220,12 @@
Всего можно зарегистрировать до 16 процедур. Процедуры вызываются в
порядке обратном порядку их регистрации.
-Return to contents.
+Return to contents.
-
+
2.2.6 ?startuptomain
-
+
По этой директиве компилятор в начале файла делает jmp на начало
процедуры main(). Перед началом компиляции этой процедуры компилятор
@@ -1236,22 +1235,22 @@
компиляции резидентных программ (TSR).
Директива ?startuptomain работает только при компиляции com-файлов.
-Return to contents.
+Return to contents.
-
+
2.2.7 ?undef
-
+
Эта директива уничтожает константы объявленные директивой ?define. Ее
можно применять для изменения в процессе компиляции значения какой-нибудь
константы.
-Return to contents.
+Return to contents.
-
+
2.2.8 ?align и ?aligncode
-
+
В C-- существует директива ?align, которая делает однократное
выравнивание данных на четный адрес. Но если к этой директиве добавить
@@ -1270,12 +1269,12 @@
директиву можно применять и внутри исполняемого кода. Например, если Вы
хотите получить быстрый код на 486 процессоре, то рекомендуется делать
выравнивание начала процедур и циклов на адрес кратный 16.
-Return to contents.
+Return to contents.
-
+
2.2.9 ?pragma
-
+
Директива #pragma это многофункциональнальная директива, которая в
свою очередь имеет свои директивы:
@@ -1330,14 +1329,14 @@
END
#pragma resource end
-Return to contents.
+Return to contents.
-
+
3. Константы.
3.1 Числовые константы.
-
+
Представление числовых констант в виде десятичных чисел (чисел с
основанием 10) и шестнадцатеричных чисел (основание счисления 16) полностью
@@ -1382,12 +1381,12 @@
Эти суффиксы не зависят от регистра, т.е. их можно писать как
маленькими, так и большими буквами.
-Return to contents.
+Return to contents.
-
+
3.2 Символьные константы.
-
+
Одиночные символьные константы, как и в C, должны заключаться в
одиночные кавычки '.
@@ -1434,12 +1433,12 @@
символов. Для многобуквенных символьных констант первый символ
соответствует старшим разрядам, таким образом, значение для ab будет
закодировано как a*256+b.
-Return to contents.
+Return to contents.
-
+
3.3 Строковые константы.
-
+
Строковые константы, как и в C, заключаются в двойные кавычки (").
Специальные символы внутри строк обозначаются так же, как и в символьных
@@ -1451,12 +1450,12 @@
В настоящее время наибольшая длина строковой константы - 2048 символов,
включая символ-ограничитель 0, таким образом, максимум 2047 значащих
символов.
-Return to contents.
+Return to contents.
-
+
3.4 Постоянные выражения.
-
+
Постоянное выражение - одиночная числовая константа или несколько
числовых констант, связанных между собой операторами. Числовое значение
@@ -1474,25 +1473,25 @@
1 * 2 * 3 / 2 + 4 // равняется 7
Примеры с применением вещественных чисел:
3.23*1.53+2.0E2 // равняется 204.9419
-Return to contents.
+Return to contents.
-
+
4. Выражения.
4.1 Типы выражений.
-
+
Имеются три типа выражений в C--, не считая постоянных выражений. Это
выражения типа EAX/AX/AL, выражения типа неEAX/AX/AL и условные выражения.
Все C-- выражения вычисляются слева направо, независимо от старшинства
входящих в выражение математических операций.
-Return to contents.
+Return to contents.
-
+
4.2 Выражения типа EAX/AX/AL.
-
+
Этот тип выражений применяется в случае, когда его результат может быть
сохранен в переменной в памяти или в регистре EAX или AX или AL.
@@ -1505,12 +1504,12 @@
Если результат может быть сохранен в переменных типа dword, long или
float, используется нотация EAX.
-Return to contents.
+Return to contents.
-
+
4.3 Выражения использующие получатель при вычислении выражения.
-
+
Если в правой части выражения используется переменная являющаяся
одновременно и приемником, то такие выражения дают различные результаты в
@@ -1524,12 +1523,12 @@
var = BX = 2;
var = 3 + var; // результатом будет 5
BX = 3 + BX; // результатом будет 6
-Return to contents.
+Return to contents.
-
+
4.4 Не - EAX/AX/AL выражения.
-
+
Этот тип выражений применяется в случае, когда его результат должен
быть сохранен в любом другом регистре, отличном от аккумулятора EAX, AX
@@ -1561,12 +1560,12 @@
числа: 0, 1, 2, 4, 8, 16, 32, 64 и 128. Все эти ограничения связаны со
стремлением не разрушать другие регистры при использовании не-EAX/AX/AL
выражений.
-Return to contents.
+Return to contents.
-
+
4.5 Условные выражения.
-
+
Условные выражения - выражения, результатом вычисления которых является
логическое значение да или нет, используемое в операторе if и циклах do {}
@@ -1575,22 +1574,22 @@
Имеются два типа условных выражений, простые и сложные.
Возможно логическое объединение условий.
-Return to contents.
+Return to contents.
-
+
4.5.1 Простые условные выражения.
-
+
Простые условные выражения - одиночная лексема или выражение, которое
примет значение да, если расчетное значение отлично от нуля, или значение
нет, если расчетное значение равно нулю.
-Return to contents.
+Return to contents.
-
+
4.5.2 Сложные условные выражения.
-
+
Сложные условные выражения имеют следующую форму:
@@ -1622,12 +1621,12 @@
(x+y >= x-y) // правая часть не является одиночной лексемой или
постоянным выражением.
(Z = y) // вместо == ошибочно поставлен =
-Return to contents.
+Return to contents.
-
+
4.6 Изменение типа выражения при присваивании.
-
+
Если после знака равенства написать тип отличный от типа вычисляемой
переменной, то все переменные участвующие в процессе вычисления, будут
@@ -1649,12 +1648,12 @@
то переменные a, b, и c в этом примере перед вычислением будут
преобразованы к типу long, а конечный результат будет преобразован к типу
переменной i - int.
-Return to contents.
+Return to contents.
-
+
4.7 Вычисление в регистры EAX/AX/AL со знаком.
-
+
По умолчанию все вычисления в регистры производятся как с без знаковыми
величинами.
@@ -1674,14 +1673,14 @@
Обращаю ваше внимание, что для регистра AL можно использовать только
модификатор char, для AX соответственно только int, а для EAX - long. Для
остальных регистров подобное делать нельзя.
-Return to contents.
+Return to contents.
-
+
5. Идентификаторы.
5.1 Формат идентификатора.
-
+
Идентификаторы в C-- должны начинаться или с символа подчеркивания _
или заглавных или строчных букв. Следующие символы могут быть любой
@@ -1704,12 +1703,12 @@
/*длина идентификатора превышает 64 */
Y_es sir /* пробелы недопустимы */
The-end /* дефисы недопустимы */
-Return to contents.
+Return to contents.
-
+
5.2 Зарезервированные идентификаторы.
-
+
Список зарезервированных в C-- идентификаторов, которые не могут
использоваться как общие идентификаторы, поскольку они уже были определены
@@ -1778,12 +1777,12 @@
tr0 tr1 tr2 tr3 tr4 tr5 tr6 tr7
mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7
xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7
-Return to contents.
+Return to contents.
-
+
5.3 Универсальные регистры для 16 и 32-битного режима.
-
+
При создании библиотечных процедур очень часто приходится писать
варианты процедуры для работы в 16-битном и 32-битном режимах, которые
@@ -1799,12 +1798,12 @@
Использование автоматических регистров позволит упростить библиотечные
файлы и сделать их более понятными.
-Return to contents.
+Return to contents.
-
+
5.4 Предопределенные идентификаторы.
-
+
Идентификаторы, определяемые компилятором в зависимости от режима
компиляции:
@@ -1828,28 +1827,28 @@
codesize компиляция ведется с оптимизацией на размер кода
speed компиляция ведется с оптимизацией на быстродействие кода
cpu определяет тип процессора для которого ведется компиляция:
- 0 - 8086
- 1 - 80186
- 2 - 80286
- 3 - 80386
- 4 - 80486
- 5 - Pentium
- 6 - Pentium MMX
- 7 - Pentium II
+ 0 - 8086
+ 1 - 80186
+ 2 - 80286
+ 3 - 80386
+ 4 - 80486
+ 5 - Pentium
+ 6 - Pentium MMX
+ 7 - Pentium II
Эти идентификаторы могут быть проверены директивами #ifdef или #ifndef.
Идентификатор cpu может быть использован лишь с операторами проверки
условий:
#ifdef cpu > 3 //если тип процессора больше 80386
-Return to contents.
+Return to contents.
-
+
6. Переменные.
6.1 Типы переменных.
-
+
В C-- имеется семь типов переменных (именованных областей памяти), это:
byte, word, dword, char, int, long, float.
@@ -1898,12 +1897,12 @@
такие свойства типа int вносят некоторую путаницу, но это дает большой
выигрыш при использовании этого типа в библиотечных файлах, которые могут
быть использованы при компиляции 16-битных и 32-битных программ.
-Return to contents.
+Return to contents.
-
+
6.2 Объявление переменных.
-
+
Синтаксис для объявления переменных следующий:
@@ -1940,12 +1939,12 @@
и массив с именем x, состоящий из 27 элементов типа int */
long size=0; /* объявлена переменная типа long с именем size и ей присвоено
значение 0. */
-Return to contents.
+Return to contents.
-
+
6.3 Глобальные переменные.
-
+
Глобальные переменные - это переменные, область действия которых
распространяется на всю программу. В C-- использовать глобальные переменные
@@ -1979,12 +1978,12 @@
значение), то переменная будет включена в код компилируемого файла. Если
переменная не инициализируется, то место для переменной будет
зарезервировано сразу же за последним байтом скомпилированной программы.
-Return to contents.
+Return to contents.
-
+
6.4 Локальные переменные.
-
+
Локальные переменные - это переменные область действия которых
распространяется лишь в пределах одной процедуры. Объявлять локальные
@@ -2021,12 +2020,12 @@
int locproc; // а на это объявление переменной компилятор выдаст сообщение
// об ошибке, т.к. уже началось тело процедуры
}
-Return to contents.
+Return to contents.
-
+
6.5 Динамические переменные и структуры.
-
+
Наряду с уже известными Вам динамическими процедурами в C-- есть
возможность использовать динамически и переменные и структуры. Динамические
@@ -2047,12 +2046,12 @@
расположены в его самом конце, после динамических процедур. Эту их
особенность можно использовать, если Вам будет необходимо, чтобы данные не
были разбросаны среди кода, а были сгруппированы в одном месте.
-Return to contents.
+Return to contents.
-
+
6.6 Присваивание одного значения нескольким переменным.
-
+
Если Вам необходимо присвоить нескольким переменным одинаковые значения:
@@ -2066,14 +2065,14 @@
При использовании такой записи генерируется более компактный и более
быстрый код.
-Return to contents.
+Return to contents.
-
+
6.7 Переменные типа float.
6.7.1 Формат переменных типа float.
-
+
Для представления значений с плавающей точкой в язык C-- введен тип
float. Этому типу соответствует действительное число одинарной точности
@@ -2089,12 +2088,12 @@
| | | -------------- - поле мантиссы
| ------------------------ - поле порядка
--------------------------- - бит знака
-Return to contents.
+Return to contents.
-
+
6.7.2 Константы с плавающей точкой.
-
+
Компилятор отличает вещественное число от целого по наличию в нем
точки. Начинаться вещественное число должно либо цифрой от 0 до 9, либо
@@ -2106,24 +2105,24 @@
-15.75
3.14e2
1.234567E-20
-Return to contents.
+Return to contents.
-
+
6.7.3 Диапазон допустимых значений.
-
+
Вещественное число типа float может находиться в диапазоне от 3.37E38
до -3.37E38. Минимально близкое к нулю значение равняется 1.17E-38 и
-1.17E-38. Записывать вещественное число одинарной точности более чем 8
цифрами не имеет смысла. Показатель степени может принимать значения от
+38 до -38.
-Return to contents.
+Return to contents.
-
+
6.7.4 Математические операции.
-
+
Компилятор поддерживает 4 основных действия над переменными типа
float: сложение, вычитание, умножение и деление. Поддерживается также
@@ -2136,12 +2135,12 @@
ВНИМАНИЕ! Составные математические операции выполняются в том
порядке, в котором они записаны, невзирая на правила арифметики.
-Return to contents.
+Return to contents.
-
+
6.7.5 Преобразования типов.
-
+
При математических операциях конечным итогом которых является
переменная типа float, все операнды других типов перед вычислением будут
@@ -2153,12 +2152,12 @@
участие в вычислениях. При присваивании целочисленной переменной значения
переменной типа float, из нее также будет выделена целая часть, которая и
будет присвоена целочисленной переменной.
-Return to contents.
+Return to contents.
-
+
6.7.6 Операции сравнения.
-
+
Если при операции сравнения левым операндом является переменная или
выражение типа float, а правым является целочисленное значение, то
@@ -2166,12 +2165,12 @@
левым операндом является целочисленное выражение или переменная, а правым
операндом значение типа float, то из правого операнда будет выделена целая
часть, которая и примет участие в сравнении.
-Return to contents.
+Return to contents.
-
+
6.7.7 Сравнение переменных типа float с 32-битным регистром.
-
+
В регистрах могут содержаться знаковые, без знаковые и вещественные
данные. По умолчанию считается, что в регистре находится без знаковое целое
@@ -2183,19 +2182,19 @@
void PROC()
{
- IF( f < signed ECX) //в регистре ECX находится знаковое число
+ IF( f < signed ECX) //в регистре ECX находится знаковое число
IF( unsigned EBX > f) //в регистре EBX находится без знаковое число
IF( f == float EAX ) //в EAX находится число формата float
}
ВНИМАНИЕ! При операции сравнения с участием переменой типа float,
содержимое регистра AX будет разрушено.
-Return to contents.
+Return to contents.
-
+
6.8 Указатели.
-
+
В C-- сейчас указатели реализованы не в полном объеме. Поэтому многие
вещи, которые возможны в обычных языках C, здесь будут недоступны.
@@ -2209,13 +2208,13 @@
int i;
char *tstr;
{
- FOR(i=0; string[i]!=0; i++){
- WRITESTR(string[i]);
- WRITELN();
- }
- FOR(tstr=str;byte *tstr!=0; tstr++){
- WRITE(byte *tstr);
- }
+ FOR(i=0; string[i]!=0; i++){
+ WRITESTR(string[i]);
+ WRITELN();
+ }
+ FOR(tstr=str;byte *tstr!=0; tstr++){
+ WRITE(byte *tstr);
+ }
}
Указатели можно использовать при передаче параметров процедурам, а в
@@ -2235,14 +2234,14 @@
инициализируется указатель. Т.е. Вы можете указателю на char присвоить
указатель на int или указателю на процедуру присвоить адрес переменной.
Это может вызвать ошибку в работе программы.
-Return to contents.
+Return to contents.
-
+
7. Адресация.
7.1 Относительная адресация.
-
+
Изначально индексный доступ к элементам в массивах любого типа в
компиляторе осуществлялся побайтно, независимо от объявленного типа данных.
@@ -2349,12 +2348,12 @@
числовую константу или регистры BX,DI,SI,BP компилятор использует эти
значения без изменения. Во всех других случаях будет коррекция значения в
зависимости от типа массива.
-Return to contents.
+Return to contents.
-
+
7.2 Абсолютная адресация.
-
+
Абсолютная адресация также возможна. Действуют те же самые ограничения
на индексы, что и при относительной адресации.
@@ -2441,25 +2440,25 @@
Сохранить BX в сегменте стека по смещению 42:
SSWORD [42] = BX;
-Return to contents.
+Return to contents.
-
+
8. Работа с блоками данных.
8.1 Структуры.
8.1.1 Что такое структуры.
-
+
Структура позволяет объединить в одном объекте совокупность значений,
которые могут иметь различные типы.
-Return to contents.
+Return to contents.
-
+
8.1.2 Синтаксис.
-
+
struct [<тег>] { <список-объявлений-элементов> }
<описатель>[,<описатель>...];
@@ -2510,12 +2509,12 @@
struct можно не писать. Т.е можно написать вот так:
test dd;
-Return to contents.
+Return to contents.
-
+
8.1.3 Инициализация структур при объявлении.
-
+
После объявления структуры ее элементы могут принимать произвольные
значения. Что бы этого не было надо структуры проинициализировать.
@@ -2553,12 +2552,12 @@
В этом примере на место где расположена структура dd при компиляции будет
загружен фрагмент из файла file.dat длиной 10 байт со смещения 24.
Недостающие байты будут заполнены нулями.
-Return to contents.
+Return to contents.
-
+
8.1.4 Инициализация структуры при выполнении программы.
-
+
При выполнении программы, кроме присвоения каждому элементу структуры
значения, можно проинициализировать всю структуру присвоением ей числа или
@@ -2591,12 +2590,12 @@
Будет скопировано содержимое третьей структуры массива структур aa в
структуру rr.
-Return to contents.
+Return to contents.
-
+
8.1.5 Операции с элементами структур.
-
+
С элементами структур можно выполнять все те операции, которые
доступны для переменных соответствующего типа. Например: Объявлена
@@ -2628,25 +2627,25 @@
long c; // третий элемент структуры
};
- struct BB //тег второй структуры
+ struct BB //тег второй структуры
{
- word aa; // первый элемент
- AA bb; // второй элемент - вложенная структура
- }ss; // объявляем структуру с тегом BB
+ word aa; // первый элемент
+ AA bb; // второй элемент - вложенная структура
+ }ss; // объявляем структуру с тегом BB
void proc()
{
AX=#ss.bb.b; // получить адрес элемента b структуры bb в структуре ss
AX=#BB.bb.b; // получить смещение этого же элемента в теге BB
- AX=sizeof(ss.bb); // получить размер элемента bb в структуре ss
- AX=sizeof(BB.bb); // получить размер элемента bb в теге BB
+ AX=sizeof(ss.bb); // получить размер элемента bb в структуре ss
+ AX=sizeof(BB.bb); // получить размер элемента bb в теге BB
}
-Return to contents.
+Return to contents.
-
+
8.1.6 Вложенные структуры.
-
+
При объявлении тегов структур можно использовать теги других,
объявленных ранее структур. Пример вложенных структур:
@@ -2696,12 +2695,12 @@
AX=second[2].first[j].a; //а этот синтаксис допустим.
AX=second[i].first[3].a;
}
-Return to contents.
+Return to contents.
-
+
8.1.7 Отображение тега структуры на блок памяти.
-
+
Отображение тега структуры на блок памяти является альтернативой
указателям на структуры.
@@ -2750,12 +2749,12 @@
локальными и параметрическими переменными. В 32-битном режиме можно
использовать любой кроме ESP и EBP регистр, а регистры EDI и ESI надо
использовать осторожно.
-Return to contents.
+Return to contents.
-
+
8.1.8 Битовые поля структур.
-
+
Битовые поля структур используются для экономии памяти, поскольку
позволяют плотно упаковать значения, и для организации удобного доступа к
@@ -2794,12 +2793,12 @@
примененный к битовому полю вернет размер этого поля в битах. При
использовании битового поля, его содержимое будет расширятся в регистр
как без знаковое целое число.
-Return to contents.
+Return to contents.
-
+
8.2 Объединения.
-
+
Объединения позволяют в разные моменты времени хранить в одном объекте
значения различного типа.
@@ -2824,8 +2823,8 @@
void test()
{
- regEAX = 0x2C;
- BL = regAL; //в регистре BL окажется значение 0x2C
+ regEAX = 0x2C;
+ BL = regAL; //в регистре BL окажется значение 0x2C
}
Объединять можно переменные различных типов, массивы, строковые
@@ -2837,12 +2836,12 @@
элемент объединения. Если же первый элемент объединения не инициализирован,
а следующие элементы инициализированы, то это вызовет сообщение компилятора
об ошибке.
-Return to contents.
+Return to contents.
-
+
8.3 Команды 'FROM' и 'EXTRACT'.
-
+
В C-- есть очень оригинальные команды, которых нет в других языках. Это
FROM и EXTRACT.
@@ -2869,14 +2868,14 @@
byte LIT128 = EXTRACT "8X16.FNT", 16*128, 16;
byte LIT130 = EXTRACT "8X16.FNT", 16*130, 16;
-Return to contents.
+Return to contents.
-
+
9. Операторы.
9.1 Условные инструкции.
-
+
Условные инструкции, при помощи которых осуществляется ветвление, такие
же как в C.
@@ -2920,12 +2919,12 @@
Это можно просто исправить, заменив в этом месте инструкцию ELSE на
else.
-Return to contents.
+Return to contents.
-
+
9.2 Циклы do{} while.
-
+
В таком цикле блок кода, составляющий тело цикла, будет повторяться,
пока условное выражение имеет значение истинно.
@@ -2944,12 +2943,12 @@
Условное выражение в do {} while инструкции должно соответствовать тем же
правилам, что и в инструкциях IF и if.
-Return to contents.
+Return to contents.
-
+
9.3 Циклы loop, LOOPNZ, loopnz.
-
+
Циклы loop повторяют блок кода, пока определенная переменная или
регистр, выполняющие роль счетчика цикла, содержат значение, отличное от
@@ -3022,12 +3021,12 @@
максимально эффективным при оптимизации на размер кода, если в качестве
параметра-счетчика используется регистр CX/ECX. При этом компилятор
использует ассемблерные инструкции JCXZ/JECXZ и LOOP.
-Return to contents.
+Return to contents.
-
+
9.4 Цикл while, WHILE.
-
+
Синтаксис:
while(<выражение>)
@@ -3043,19 +3042,19 @@
меньше 127 байт.
Примеры:
- while ( i < 20 ){
- WRITEWORD(i);
- i++;
- }
+ while ( i < 20 ){
+ WRITEWORD(i);
+ i++;
+ }
- WHILE (i < 20 ) @WRITEWORD(i); //цикл либо будет бесконечным либо не
+ WHILE (i < 20 ) @WRITEWORD(i); //цикл либо будет бесконечным либо не
//выполнится ни разу
-Return to contents.
+Return to contents.
-
+
9.5 Цикл for, FOR.
-
+
Синтаксис:
for ([<начальное выражение>]; [<условие>]; [<приращение>])
@@ -3087,11 +3086,11 @@
127 байт.
Примеры:
- for(i=0;i<5;i++){
- WRITESTR("СТРОКА ");
- WRITEWORD(i);
- WRITELN();
- }
+ for(i=0;i<5;i++){
+ WRITESTR("СТРОКА ");
+ WRITEWORD(i);
+ WRITELN();
+ }
Число начальных выражений и число приращений не ограничено. Каждый
оператор в начальных выражениях и приращениях должен разделяться
@@ -3104,21 +3103,21 @@
скобки. Пример:
for ( a=0 ; (a>=0) && (a<10) ; a++ ){...
-Return to contents.
+Return to contents.
-
+
9.6 Оператор переключатель switch.
-
+
Синтаксис:
switch(<выражение>){
case <константа>:
<оператор>
- ...
+ ...
case <константа>:
<оператор>
- ...
+ ...
...
default:
<оператор>
@@ -3222,29 +3221,29 @@
Кроме того, что новый формат записи более компактен и более читабелен,
но еще при этом компилятор создает более компактный и быстрый код.
-Return to contents.
+Return to contents.
-
+
9.7 Оператор перехода goto, GOTO.
-
+
Синтаксис:
goto <метка>;
- .
- .
- .
+ .
+ .
+ .
<метка>:
Оператор перехода goto передает управление на оператор помеченный
меткой. Аналогом в ассемблере оператору goto является команда jmp near.
Аналогом в ассемблере оператору GOTO является команда jmp short.
-Return to contents.
+Return to contents.
-
+
9.8 Оператор разрыва break, BREAK.
-
+
Оператор разрыва break прерывает выполнение операторов do-while,
for, switch, while, loop, loopnz, LOOPNZ. Он может содержаться
@@ -3256,18 +3255,18 @@
до конца цикла должен быть меньше 127 байт.
Примеры:
- FOR (i=0; ; i++){
- FOR(j=0; j < WIDTH; j++){
- IF(i==5)BREAK;
- }
- IF(i==10)BREAK;
- }
-Return to contents.
+ FOR (i=0; ; i++){
+ FOR(j=0; j < WIDTH; j++){
+ IF(i==5)BREAK;
+ }
+ IF(i==10)BREAK;
+ }
+Return to contents.
-
+
9.9 Оператор продолжения continue, CONTINUE.
-
+
Оператор продолжения continue передает управление на следующую
итерацию в циклах do-while, for, while, loop, loopnz. В циклах
@@ -3279,12 +3278,12 @@
Оператор CONTINUE аналогичен continue, но при этом генерируется код на
1 байт короче. Размер сгенерированного кода от места где применяется
CONTINUE до начала итерации должен быть меньше 127 байт.
-Return to contents.
+Return to contents.
-
+
9.10 Логическое объединение условий.
-
+
Существует возможность логического объединения сравнений в условиях
IF и if, циклах do{}while, while{}, WHILE{}, for{} и FOR{}.
@@ -3298,16 +3297,16 @@
Пример:
- if ( (a>3) && (b>4) || (c<8) ){
+ if ( (a>3) && (b>4) || (c<8) ){
Т.е. если произвести расшифровку этого условия, то получится следующее:
условие выполнится если a>3 и b>4 или a>3 и c<8.
-Return to contents.
+Return to contents.
-
+
9.11 Переход через циклы.
-
+
Для операторов BREAK, break, CONTINUE, continue введена
поддержка числового параметра, определяющего, сколько циклов надо
@@ -3317,10 +3316,10 @@
do{
loop(CX){
for(BX=0;BX<10;BX++){
- break; //стандартный оператор
- break 0; //break с параметром - пропустить 0 циклов
- break 1; //break с параметром - пропустить 1 цикл
- break 2; //break с параметром - пропустить 2 цикла
+ break; //стандартный оператор
+ break 0; //break с параметром - пропустить 0 циклов
+ break 1; //break с параметром - пропустить 1 цикл
+ break 2; //break с параметром - пропустить 2 цикла
}
LABL0:
}
@@ -3342,12 +3341,12 @@
Ну и я надеюсь, Вам понятно, что значение параметра не может превышать
числа циклов находящихся перед текущим. Так для одиночного цикла этот
параметр может принимать максимальное и единственное значение - 0.
-Return to contents.
+Return to contents.
-
+
9.12 Инвертирование флага проверки условий.
-
+
Инвертирование флага проверки условий в операциях сравнения if/IF
for/FOR while/WHILE происходит с помощью символа ! - not.
@@ -3358,12 +3357,12 @@
IF ( proc() == 0 )... и IF ( ! proc() ) ...
являются синонимами.
-Return to contents.
+Return to contents.
-
+
9.13 Вычисление выражения, а затем проверка условия.
-
+
В операциях сравнения в левом операнде теперь допустимо использовать
вычисления выражения с присваиванием и операции инкремента, декремента.
@@ -3377,12 +3376,12 @@
Во всех этих примерах сначала произойдет вычисление выражения в левой
части операции сравнения, а потом будет произведено сравнение результата с
правой частью выражения сравнения.
-Return to contents.
+Return to contents.
-
+
9.14 Проверка битов при операции сравнения.
-
+
Если в левой части выражения сравнения написано: BX & 5, то при
вычислении выражения содержимое регистра BX будет изменено инструкцией
@@ -3400,12 +3399,12 @@
IF ( ! $test AX,5)
IF ( asm test AX,5)
IF ( ! asm { test AX,5 } )
-Return to contents.
+Return to contents.
-
+
9.15 Оператор перестановки.
-
+
В C-- есть оператор, который не встречается в других языках, это
оператор перестановки. Оператор перестановки меняет местами содержимое двух
@@ -3428,12 +3427,12 @@
памяти, будет разрушено содержимое EAX. В любом другом случае, например,
между переменной в памяти и регистром, значения всех регистров будут
сохранены.
-Return to contents.
+Return to contents.
-
+
9.16 Оператор отрицания.
-
+
C-- поддерживает быстрый синтаксис смены знака переменной - оператор
отрицания. Поставив - (знак минус) перед идентификатором переменной памяти
@@ -3445,12 +3444,12 @@
-AX; // результат тот же, что и при 'AX = -AX;' ,но быстрее.
-tree; // то же самое, что 'tree = -tree;' ,но быстрее.
-BH; // меняет знак BH.
-Return to contents.
+Return to contents.
-
+
9.17 Оператор инверсии.
-
+
C-- поддерживает быстрый синтаксис выполнения логической инверсии
значения переменной - оператор инверсии. Поставив ! (восклицательный знак)
@@ -3462,12 +3461,12 @@
!AX; // то же самое, что ' AX ^ = 0xFFFF; ' но быстрее.
!node; // заменяет значение 'node' его логической инверсией.
!CL; // то же самое, что ' CL ^ = 0xFF ' но быстрее.
-Return to contents.
+Return to contents.
-
+
9.18 Специальные условные выражения.
-
+
C-- поддерживает восемь специальных условных выражений:
@@ -3496,12 +3495,12 @@
do {
// здесь вы опять чего-то делаете
} while( NOTOVERFLOW );
-Return to contents.
+Return to contents.
-
+
9.19 Символ $ - вставляет текущий адрес программы.
-
+
Символ $, кроме того, что является признаком последующей ассемблерной
инструкции, в языке C--, как и в языке Assembler может указывать текущий
@@ -3515,14 +3514,14 @@
Примеры применения:
- DW #main-$ //записать расстояние от процедуры main до текущего места
- GOTO $+2; //перейти по адресу на 2 больше, чем текущий адрес
-Return to contents.
+ DW #main-$ //записать расстояние от процедуры main до текущего места
+ GOTO $+2; //перейти по адресу на 2 больше, чем текущий адрес
+Return to contents.
-
+
9.20 Ключевое слово static и оператор ::.
-
+
Если перед объявлением глобальной переменной, структуры или процедуры
указать слово static, то эти переменная, структура или процедура будут
@@ -3555,15 +3554,15 @@
int var; //объявляем локальную переменную с именем уже существующей
//глобальной переменной
{
- (E)AX=var; //имеем доступ только к локальной переменной
+ (E)AX=var; //имеем доступ только к локальной переменной
(E)AX=::var; //а так можно получить доступ к глобальной переменной
}
-Return to contents.
+Return to contents.
-
+
9.21 Оператор sizeof.
-
+
Операция sizeof определяет размер памяти, который соответствует объекту
или типу. Операция sizeof имеет следующий вид:
@@ -3608,12 +3607,12 @@
sizeof ( file "filename.dat" )
Результатом этой операции будет размер файла "filename.dat".
-Return to contents.
+Return to contents.
-
+
9.22 Метки перехода.
-
+
Метки перехода применяются для указания начальных точек участков кода,
используемых командами перехода встроенного ассемблера и операторами
@@ -3642,14 +3641,14 @@
качестве имен для меток вне процедур могут быть использованы уникальные
идентификаторы, в которых можно использовать большие, маленькие и смесь
больших и маленьких букв.
-Return to contents.
+Return to contents.
-
+
10. Ассемблер.
10.1 Поддержка команд ассемблера.
-
+
Встроенный в C-- ассемблер поддерживает все инструкции 8088/8086,
80286, 80386, 80486, Pentium, Pentium II и Pentium III процессоров.
@@ -3658,36 +3657,36 @@
доллара $. Поддерживается также ключевое слово asm, которое являясь
синонимом к символу доллара, еще и поддерживает объединение ассемблерных
инструкций в блоки.
-Return to contents.
+Return to contents.
-
+
10.2 Ключевое слово asm.
-
+
Ключевое слово asm является синонимом к $ - префикс ассемблерной
команды. После слова asm можно писать блок ассемблерных команд. Пример:
- asm {
- .
- .
- push AX
+ asm {
+ .
+ .
+ push AX
labl:
- push BX
- mov AX,0x1234
- jmp short labl
- .
- .
- .
- }
+ push BX
+ mov AX,0x1234
+ jmp short labl
+ .
+ .
+ .
+ }
Метки внутри блока ассемблерных команд допустимы.
-Return to contents.
+Return to contents.
-
+
10.3 Префикс dup - повторение инструкций DB/DW/DD.
-
+
Для ассемблерных инструкции DB, DW, DD введена возможность использовать
префикс повторений dup. Применение этого префикса имеет следующий
@@ -3700,12 +3699,12 @@
В отличие от аналога этого префикса из ассемблера повторяемую величину
заключать в скобки нельзя.
-Return to contents.
+Return to contents.
-
+
10.4 Инструкции процессора Pentium III.
-
+
В компилятор добавлена поддержка 19 новых инструкций MMX расширения
@@ -3798,18 +3797,18 @@
{
asm{
movaps var8_128,xmm0 //в массив из 16 байт будет записано содержимое XMM0
- movaps xmm1,var16_128 //в XMM1 будет записано содержимое 8 слов
+ movaps xmm1,var16_128 //в XMM1 будет записано содержимое 8 слов
movaps var32_128,xmm1 //в массив из 4 двойных слов будет записано XMM1
}
}
-Return to contents.
+Return to contents.
-
+
11. Процедуры.
11.1 Типы процедур, функций и макрокоманд.
-
+
Сейчас C-- поддерживает 4 типа вызова процедур: cdecl, pascal, stdcall
и fastcall. Вот краткие характеристики этих типов вызовов процедур:
@@ -3853,12 +3852,12 @@
Объявление процедур введено для того, чтобы сообщать компилятору о
типе возврата из процедур, способе передачи параметров процедуре и их числе.
-Return to contents.
+Return to contents.
-
+
11.2 Стековые процедуры.
-
+
Стековые процедуры по умолчанию объявляются при помощи идентификатора,
который содержит, по крайней мере, один символ строчных букв (букв нижнего
@@ -3882,10 +3881,10 @@
В следующем примере стековая процедура возвращает сумму всех своих
параметров (имеющих различные типы) как величину типа word:
- word add_them_all (int a,b,c; byte d,e; word x,y)
- {
- return( a+b+c+d+e+x+y );
- }
+ word add_them_all (int a,b,c; byte d,e; word x,y)
+ {
+ return( a+b+c+d+e+x+y );
+ }
Ранее C-- делал вызовы стековых процедур лишь в стиле pascal.
Преимуществом этого способа вызова процедур является компактность и более
@@ -3949,12 +3948,12 @@
необязательно (тогда компилятор не будет контролировать число и тип
передаваемых параметров), но если Вы их вставите, то включится механизм
контроля за числом и типом параметров.
-Return to contents.
+Return to contents.
-
+
11.3 Регистровые процедуры.
-
+
Регистровые процедуры определяются, по умолчанию, при помощи
идентификатора, который не содержит символов строчных букв. Или же явным
@@ -4000,12 +3999,12 @@
Для того, чтобы использовать регистровую процедуру как макрокоманду,
она должна быть объявлена как динамическая процедура. Динамические
процедуры описаны в следующем подразделе.
-Return to contents.
+Return to contents.
-
+
11.4 Динамические процедуры.
-
+
Динамические процедуры - процедуры, которые определены, но вставляются
в код программы, только если есть вызов. Динамические процедуры могут
@@ -4029,12 +4028,12 @@
IF (int AX < 0)
-AX;
}
-Return to contents.
+Return to contents.
-
+
11.4.1 Установка динамической процедуры в определенное место программы.
-
+
Динамические процедуры, если они не используются как макросы и если
они были востребованы в программе, вставляются в код программы в самом
@@ -4054,12 +4053,12 @@
@ void proc ();
- В итоге динамическая процедура будет вставлена в код программы не в
+ В итоге динамическая процедура будет вставлена в код программы не в
конце ее, как обычно, а в месте, где будет расположена эта строка. Если
динамическая процедура имеет параметры, то прописывать эти параметры
необязательно.
- В компиляторе есть еще более мощное средство, позволяющее все
+ В компиляторе есть еще более мощное средство, позволяющее все
динамические объекты ( процедуры, переменные, структуры ) расположить в
указанном месте, а не в конце программы, как обычно. Это директива
#setdinproc. Встретив эту директиву, компилятор немедленно расположит все
@@ -4068,14 +4067,14 @@
обычно, в конце программы, если конечно, не будет повторно применена
директива #setdinproc.
- Это может быть применено и быть полезным при создании резидентных
+ Это может быть применено и быть полезным при создании резидентных
программ (TSR) и драйверов устройств.
-Return to contents.
+Return to contents.
-
+
11.5 inline-процедуры.
-
+
inline-процедурами могут быть динамические процедуры, которые можно
использовать как макросы. Но в отличие от макросов, inline-процедуры, при
@@ -4106,14 +4105,14 @@
{
IF ( int AX < 0 ) -AX ;
}
-Return to contents.
+Return to contents.
-
+
11.5.1 Другое применение inline.
-
+
- Ключевое слово inline имеет в процедурах и другое применение. Если
+ Ключевое слово inline имеет в процедурах и другое применение. Если
это слово расположено перед началом блока процедуры, то для такой
процедуры не создается кадр стека и не генерируется завершающий процедуру
ret. Пример:
@@ -4124,7 +4123,7 @@
...
}
- Такие процедуры не должны содержать локальных переменных. Если
+ Такие процедуры не должны содержать локальных переменных. Если
процедура является регистровой (тип fastcall), то с передачей ей
параметров нет проблем. Если же процедура является стековой, то передать
в такую процедуру параметры Вы можете, но воспользоваться этими
@@ -4135,20 +4134,20 @@
inline
{
AX=par1; /* компилятор обратится с параметру 'par1' через регистр BP.
- Но так как кадр стека не был создан, при выполнении этого
+ Но так как кадр стека не был создан, при выполнении этого
кода программа будет работать не правильно. */
...
}
- Встретив такое определение процедуры, компилятор выдаст предупреждение
+ Встретив такое определение процедуры, компилятор выдаст предупреждение
о том, что в таких процедурах использовать локальные и параметрические
переменные нельзя.
-Return to contents.
+Return to contents.
-
+
11.6 Процедуры обработки прерываний.
-
+
Процедуры обработки прерываний определяются следующим способом:
@@ -4183,12 +4182,12 @@
При завершении процедуры прерывания будет автоматически сгенерирована
инструкция выхода из обработчика прерывания - IRET.
-Return to contents.
+Return to contents.
-
+
11.7 Замена return на goto.
-
+
В некоторых ситуациях, при компиляции программы, оператор return
будет заменяться на goto. Это происходит при разрешенной оптимизации по
@@ -4212,12 +4211,12 @@
компилятор выдаст сообщение об ошибке. При использовании return на
расстоянии меньше 128 байт до конца кода, компилятор выдаст вам
предупреждение о возможном использовании RETURN.
-Return to contents.
+Return to contents.
-
+
11.8 Возвращаемые значения.
-
+
Возвращаемые из функций значения располагаются в регистрах. В таблице
показано, какой регистр используется для каждого из возвращаемых типов:
@@ -4263,7 +4262,7 @@
carry флага, а не сравнение регистра AX. Пример использования возврата
флагов из процедур:
- int CARRYFLAG FOPEN(); // объявление процедуры
+ int CARRYFLAG FOPEN(); // объявление процедуры
void proc()
{
@@ -4283,16 +4282,16 @@
А вот варианты, в которых, несмотря на то, что для процедуры объявлен
возврат флага, будет производиться сравнение регистра AX:
- IF ( FOPEN() == 5 )... // производится сравнение
+ IF ( FOPEN() == 5 )... // производится сравнение
IF ( FOPEN() + 2 )... // результат процедуры подвергается дальнейшему
// вычислению, в результате которого флаги будут
- // изменены.
-Return to contents.
+ // изменены.
+Return to contents.
-
+
11.9 Объявление параметров в регистровых процедурах.
-
+
Ранее каждому параметру регистровой процедуры соответствовал строго
определенный регистр. Например, для переменных типа int или word первый
@@ -4313,11 +4312,11 @@
параметр процедуре, его размерностью и числом передаваемых параметров. Вот
как будет выглядеть объявление и использование процедуры STRCPY:
- void STRCPY ( DI, SI ) ; //это объявление процедуры
+ void STRCPY ( DI, SI ) ; //это объявление процедуры
void main ()
{
- STRCPY ( #dest, #sourc ) ; //а это вызов процедуры
+ STRCPY ( #dest, #sourc ) ; //а это вызов процедуры
}
Можно не делать объявления процедуры, а указать расположение регистров
@@ -4357,7 +4356,7 @@
| |---------------------------------------- Модификатор, указывающий, что
| эта проц. явл. регистровой.
|--------------------------------------------- Процедура возвращает перемен.
- типа int.
+ типа int.
Если Вы сделали объявление регистров процедуры, то компилятор будет
строго следить за количеством указанных параметров при вызове этой
@@ -4376,12 +4375,12 @@
ни в заголовке самой процедуры, то компилятор будет считать, что параметры
в эту процедуру передаются старым способом. Таким образом, достигается
полная совместимость с предыдущими версиями компилятора.
-Return to contents.
+Return to contents.
-
+
11.10 Объявление параметров в стековых процедурах.
-
+
Как известно, ранее в C-- контроль за числом и типом передаваемых
процедуре параметров возлагался на программиста. Поэтому возникла непростая
@@ -4423,12 +4422,12 @@
Вот как будет выглядеть объявление процедуры printf:
void cdecl printf ( word, ... );
-Return to contents.
+Return to contents.
-
+
11.11 Использование макрокоманд.
-
+
Теперь любая динамическая процедура может быть использована как макрос.
Если перед вызовом динамической процедуры поставить символ @, то код этой
@@ -4439,12 +4438,12 @@
инструкцией ADD SP,SIZE_PARAMETRS сразу после окончания кода вставленного
макроса. Поэтому, если эта процедура использовала флаги в качестве
возврата, то они будут разрушены.
-Return to contents.
+Return to contents.
-
+
11.12 Передача параметров в стековые процедуры через регистры.
-
+
При передаче параметров через регистры, чаще всего получается более
компактный и быстрый код. Но содержимое регистров может быть легко
@@ -4479,12 +4478,12 @@
процедур типа pascal регистровые параметры лучше располагать после
стековых параметров. Для процедур типа cdecl и stdcall сначала лучше
располагать регистровые параметры.
-Return to contents.
+Return to contents.
-
+
11.13 Вызов процедур с адресом в регистре.
-
+
В C-- допустимо делать вызов процедуры, адрес которой находится в
регистре. Параметры для такого вызова передаются только через стек. Тип
@@ -4512,12 +4511,12 @@
0111 85C0 test ax,ax
0113 7503 jne 118h
0115 B80200 mov ax,2
-Return to contents.
+Return to contents.
-
+
11.14 Встроенные в компилятор процедуры.
-
+
Для некоторых процедур Вы не найдете их исходные тексты в библиотеках
компилятора. Код этих процедур генерирует компилятор. Вот список этих
@@ -4553,12 +4552,12 @@
библиотечные процедуры. Встретив определение такой процедуры, компилятор не
будет выдавать никаких сообщение, он просто будет применять Ваш вариант
процедуры.
-Return to contents.
+Return to contents.
-
+
11.14.1 Процедуры ABORT, ATEXIT и EXIT.
-
+
Процедуры ABORT и EXIT связаны с работой директивы #atexit и
процедурой ATEXIT. Наиболее оптимальную их реализацию и взаимную
@@ -4584,13 +4583,13 @@
работу программы с кодом возврата 0. Процедуре EXIT передается в
качестве параметра код возврата, с которым она и завершает работу
программы.
-Return to contents.
+Return to contents.
-
+
11.14.2 Процедуры inp/inportb, inport, inportd, outp/outportb, outport и
outportd
-
+
Эти процедуры всегда вставляются в код как макросы, т.е. для этих
процедур никогда не генерируется вызов процедуры. В зависимости от
@@ -4611,12 +4610,12 @@
Имена процедур inp и inportb, также как и имена outp и outportb
являются синонимами.
-Return to contents.
+Return to contents.
-
+
11.14.3 Процедуры для работы с вещественными числами.
-
+
Эти процедуры реализуются компилятором и всегда вставляются в код как
макросы, т.е. для них никогда не генерируется вызов процедуры. Кроме
@@ -4644,14 +4643,14 @@
float sin ( float val );
float sqrt ( float val );
float tan ( float val );
-Return to contents.
+Return to contents.
-
+
11.15 Классы.
11.15.1 Объявление процедур в структурах.
-
+
С введение поддержки объявления процедур в структурах, структура
становится подобной классу в C++. Т.е. такая процедура становится методом
@@ -4659,15 +4658,15 @@
struct Point // объявление класса
{
- int x; // элементы данных
- int y; // класса типа Point
- void SetX(int); // объявление методов
- void SetY(int); // класса Point
+ int x; // элементы данных
+ int y; // класса типа Point
+ void SetX(int); // объявление методов
+ void SetY(int); // класса Point
};
void Point::SetX(int _x) //определение процедуры класса Point
{
- IF((_x>=0)&&(_x<=MAX_X)) x=_x;
+ IF((_x>=0)&&(_x<=MAX_X)) x=_x;
// переменные x, y являются членами этого класса и поэтому доступ к ним из
// процедур этого же класса осуществляется напрямую.
}
@@ -4690,12 +4689,12 @@
при ее определении, в самом ее начале, надо написать символ двоеточия :
(также как и для обычных динамических процедур). Но такая динамическая
процедура не может быть использована как макрос.
-Return to contents.
+Return to contents.
-
+
11.15.2 Наследование.
-
+
В C-- поддерживаются простые и множественные наследования. Объявление
структуры с наследованием имеет следующий синтаксис:
@@ -4753,29 +4752,29 @@
d.C::x0=0;
являются равнозначными.
-Return to contents.
+Return to contents.
-
+
11.15.3 Наследование процедур.
-
+
- Если в базовом классе есть процедура, а в производном классе Вы эту
+ Если в базовом классе есть процедура, а в производном классе Вы эту
процедуру переопределили, то эта процедура будет переопределена и в
базовом классе. Таким образом процедура определенная в базовом классе
будет потеряна. Пример:
struct Point // базовый класс
{
- int x; // элементы данных
- int y; // класса типа Point
- void SetX(int); // объявление методов
- void SetY(int); // класса Point
+ int x; // элементы данных
+ int y; // класса типа Point
+ void SetX(int); // объявление методов
+ void SetY(int); // класса Point
};
void Point::SetX(int _x) // определение процедуры класса Point
{
- IF((_x>=0)&&(_x<=MAX_X)) x=_x;
+ IF((_x>=0)&&(_x<=MAX_X)) x=_x;
}
struct Point2 : Point // производный класс
@@ -4790,10 +4789,10 @@
void Point3::SetX(int _x) // в этом производном классе переопределяем
{ // процедуру SetX
- IF((_x>=80)&&(_x<=MAX_X)) x=_x;
+ IF((_x>=80)&&(_x<=MAX_X)) x=_x;
}
- Процедура SetX, определенная в базовом классе Point, теперь будет
+ Процедура SetX, определенная в базовом классе Point, теперь будет
недоступна. Вместо кода определенного в этом классе, будет вызываться код
процедуры, определенный в наследуемом классе Point3. При вызове процедуры
SetX из другого производного класса Point2 будет также вызываться код
@@ -4801,21 +4800,21 @@
процедуру таким образом, Вы замените код этой процедуры в базовом классе и
во всех его наследуемых классах.
- Если Вам необходимо, чтобы код новой процедуры был доступен
+ Если Вам необходимо, чтобы код новой процедуры был доступен
одновременно с кодом старой процедуры, то в производном классе Вам
необходимо сделать еще одно объявление этой процедуры. Пример:
struct Point // базовый класс
{
- int x; // элементы данных
- int y; // класса типа Point
- void SetX(int); // объявление методов
- void SetY(int); // класса Point
+ int x; // элементы данных
+ int y; // класса типа Point
+ void SetX(int); // объявление методов
+ void SetY(int); // класса Point
};
void Point::SetX(int _x) // определение процедуры класса Point
{
- IF((_x>=0)&&(_x<=MAX_X)) x=_x;
+ IF((_x>=0)&&(_x<=MAX_X)) x=_x;
}
struct Point2 : Point // производный класс
@@ -4832,24 +4831,24 @@
void Point3::SetX(int _x) // в этом производном классе переопределяем
{ // процедуру SetX
- IF((_x>=80)&&(_x<=MAX_X)) x=_x;
- EDI=this;
- EDI.Point.SetX(_x); // делаем вызов одноименной процедуры из
- // базового класса
+ IF((_x>=80)&&(_x<=MAX_X)) x=_x;
+ EDI=this;
+ EDI.Point.SetX(_x); // делаем вызов одноименной процедуры из
+ // базового класса
}
- Теперь из производного класса Point3 Вам доступны две различные
+ Теперь из производного класса Point3 Вам доступны две различные
процедуры с одним именем SetX. А из базового класса Point и из другого
производного класса Point2 будет по прежнему доступен только базовый
вариант процедуры SetX.
-Return to contents.
+Return to contents.
-
+
12. Типы выходных файлов.
12.1 Выходные файлы типа COM.
-
+
Этот тип выходного файла получается автоматически по умолчанию.
@@ -4858,24 +4857,24 @@
и small для 16-битного кода, а также 32-битные для DOS и Windows. Также
есть возможность получения выходного файла в формате OBJ, что позволяет
связывать программы на C-- с программами на других языках.
-Return to contents.
+Return to contents.
-
+
12.2 Выходные файлы типа EXE.
-
+
Этот формат файла можно получить, если компилировать с ключом командной
строки /exe или /e.
Возможно также поддержка EXE-формата через выходной файл формата OBJ,
который можно затем обработать линковщиком, не входящим в пакет C--.
-Return to contents.
+Return to contents.
-
+
12.3 Выходной файл *.EXE с моделью памяти tiny.
-
+
Фактически код файла *.exe модели tiny ничем не отличается от кода
*.com. В сущности, это тот же com-файл, к которому добавлен 32-байтный
@@ -4887,12 +4886,12 @@
Чтобы получить exe-файл с моделью памяти tiny, надо запустить
компилятор с ключом в командной строке /TEXE.
-Return to contents.
+Return to contents.
-
+
12.4 Объектный выходной файл OBJ.
-
+
В настоящее время C-- может только создавать OBJ-файлы, но не может их
компоновать.
@@ -4914,8 +4913,8 @@
// тип cdecl и тип возврата void
extern int buts,cubs; // объявление двух внешних переменных типа int
extern struct IPXL ipxl; // объявление внешней структуры ipxl имеющей тег
- // IPXL, причем тег этой структуры должен быть
- // описан ранее.
+ // IPXL, причем тег этой структуры должен быть
+ // описан ранее.
Появление возможности объявлять внешние объекты позволяет подключать к
obj-модулю на C-- модули написанные на других языках или подключать к
@@ -4941,14 +4940,14 @@
удалось лишь с помощью wlink и расширителя zrdx.exe.
Создание obj-файлов под windows не предусмотрено.
-Return to contents.
+Return to contents.
-
+
12.5 COM файл symbiosis.
12.5.1 СИМБИОЗ - что это такое?
-
+
Транслятор C-- имеет ключ, позволяющий добавлять компилируемую
программу к концу уже имеющегося COM файла. Это называют COM-файл
@@ -4960,12 +4959,12 @@
прекратится, и первоначальный код COM-файла не будет выполнен. Это
позволяет программе, добавленной к COM файлу, определять, будет ли
управление передано на первоначальный код.
-Return to contents.
+Return to contents.
-
+
12.5.2 Как это делать.
-
+
Чтобы сделать это, Вы должны использовать ключ /SYM в командной
строке компилятора, в которой указывается полное имя COM-файла, к
@@ -4976,37 +4975,37 @@
C-- /SYM C:\COMMAND.COM HELLO.C--
Будет создан выходной файл HELLO.COM .
-Return to contents.
+Return to contents.
-
+
12.5.3 Использование.
-
+
Вы можете, вероятно, придумать большое количество путей использования
этой функции, типа:
- Добавление защиты с использованием пароля к некоторым
- специальным COM файлам.
+ специальным COM файлам.
- Уменьшение памяти, доступной COM файлу при запуске.
- Инициализация режима видео для COM файла.
-Return to contents.
+Return to contents.
-
+
12.5.4 Злоупотребления.
-
+
Любой злоумышленник может придумать и вредные применения для этой
функции. Наиболее очевидное из них - создание троянских коней. Я хотел бы
указать, что это неконструктивное использование C--, и любое
разрушительное использование симбиозов COM-файлов запрещено.
-Return to contents.
+Return to contents.
-
+
12.6 SYS - драйверы устройств.
-
+
Компилятор значительно облегчит Ваш труд при написании драйверов.
Компилятор сам создаст заголовок драйвера и процедуры СТРАТЕГИЯ и
@@ -5049,12 +5048,12 @@
других процедурах обработки команд используете динамические процедуры,
обязательно должна быть директива ?setdinproc. Глобальные переменные должны
быть обязательно проинициализированы.
-Return to contents.
+Return to contents.
-
+
12.7 Компиляция кода расширителей ROM-BIOS.
-
+
Расширители ROM-BIOS (BIOS видеоконтроллеров, сетевых карт...) имеют
определенную структуру и требования. C-- теперь может облегчить Вам процесс
@@ -5106,14 +5105,14 @@
3. Если директива ?movedatarom установлена в FALSE, то будьте внимательны
при работе с инициализированными переменными. Они в этом режиме доступны
только для чтения, и адресуются через регистр CS.
-Return to contents.
+Return to contents.
-
+
12.8 32-битные файлы.
12.8.1 32-битный код под DOS.
-
+
Для того чтобы откомпилировать 32-битную программу под DOS надо
запустить компилятор с ключом командной строки /d32. Но работа 32-битной
@@ -5154,12 +5153,12 @@
обычная DOS программа, и лишь в процессе работы переходит в 32-битный
режим работы, размер программы ограничен размером свободной DOS памяти.
Ну а преимуществом его является компактный размер исполняемого файла.
-Return to contents.
+Return to contents.
-
+
12.8.2 32-битный код под Windows.
-
+
Для того чтобы откомпилировать программу, написанную под Windows надо
запустить компилятор с ключом командной строки /w32.
@@ -5188,37 +5187,37 @@
С помощю ключа /W32C компилятор создает консольный файл под Windows.
- Если при компиляции указывали опцию командной строки /j0 или
+ Если при компиляции указывали опцию командной строки /j0 или
директиву #jumptomain NONE, то Ваша программа будет компилироваться без
использования кода начальной инициализации, описание которого находится в
файле startup.h--.
- Код начальной инициализации для программ под Windows имеет следующий
+ Код начальной инициализации для программ под Windows имеет следующий
вид:
- hThisInst=GetModuleHandleA(0);
+ hThisInst=GetModuleHandleA(0);
#ifdef __CONSOLE__
- hStdOut=GetStdHandle(-11);
+ hStdOut=GetStdHandle(-11);
#endif
lpszArgs=GetCommandLineA();
#ifdef __environ;
- environ=GetEnvironmentStringsA();
+ environ=GetEnvironmentStringsA();
#endif
- main();
- ExitProcess(EAX);
+ main();
+ ExitProcess(EAX);
- Таким образом, в глобальных переменных hThisInst будет находится
+ Таким образом, в глобальных переменных hThisInst будет находится
handl запущенного файла, а в lpszArgs адрес командной строки Вашего
файла. Если Вы в командной строке указали опции /p или /argc или в
начале вашего файла есть директивы #parsecommandline TRUE или argc TRUE,
- то компилятор создаст дополнительный код сделающий разборку этой
+ то компилятор создаст дополнительный код сделающий разборку этой
командной строки на части. Если Вы компилируете консольную программу, то
в вашей программе будет еще одна глобальная переменная - hStdOut. В этой
переменной хранится handl стандартного вывода (экрана). Если Вы при
компиляции программы указали опцию /env, то в глобальной переменной
environ хранится адрес переменной окружения программы.
- После завершения работы процедуры main выполнятся процедура
+ После завершения работы процедуры main выполнятся процедура
ExitProcess, которой в качестве параметра передается регистр EAX. Т.о.
Вам для завершения работы программы будет достаточно сделать выход из
процедуры main, предварительно загрузив в регистр EAX нужный Вам код
@@ -5241,12 +5240,12 @@
т.е. без круглых скобок. В программе, при обращении к такой процедуре, ее
имя надо писать без суффикса @8, т.е. вот так - ProcName(param1,param2);
-Return to contents.
+Return to contents.
-
+
12.8.3 Вызов API процедур по ординалам.
-
+
В динамически подключаемых библиотеках (DLL) каждой процедуре, кроме
ее имени, соответствует уникальное число, которое называется ординалом. И
@@ -5268,14 +5267,14 @@
можно двумя способами:
a). Автоматически, с помощью опции командной строки IND=name.dll,
- по которой компилятор просканирует эту библиотеку и импортирует из
- нее все имена и ординалы процедур. (Импорт возможет только из
- библиотек имеющих формат PE).
+ по которой компилятор просканирует эту библиотеку и импортирует из
+ нее все имена и ординалы процедур. (Импорт возможет только из
+ библиотек имеющих формат PE).
b). В ручную указать в объявлении API-процедур и ее ординал. Делается
- это так: после имени процедуры ставится точка, а за ней указывается
- номер ординала. Вот пример объявления API-процедуры с указанием ее
- ординала:
+ это так: после имени процедуры ставится точка, а за ней указывается
+ номер ординала. Вот пример объявления API-процедуры с указанием ее
+ ординала:
extern WINAPI "user32.dll"
{
@@ -5297,12 +5296,12 @@
К сожалению, нет никаких гарантий того, что номер ординала для данной
процедуры не изменится при смене версии динамической библиотеки. Поэтому
использовать ординалы надо осторожно.
-Return to contents.
+Return to contents.
-
+
12.8.4 Создание DLL под Windows.
-
+
Динамически подключаемые библиотеки позволят получать более
компактные программы и ускорить процесс компиляции. К минусам
@@ -5324,12 +5323,12 @@
как _export необязательно. Затем этот файл нужно откомпилировать с ключом
/dll. В результате Вы получите готовую динамически подключаемую
библиотеку.
-Return to contents.
+Return to contents.
-
+
12.8.5 Инициализация DLL при загрузке.
-
+
Иногда, для работы процедур из динамических библиотек (DLL), бывает
необходимым инициализировать некоторые переменные значениями, зависящими
@@ -5350,12 +5349,12 @@
{
...
}
-Return to contents.
+Return to contents.
-
+
12.8.6 Компиляция ресурсов.
-
+
Встроенный в C-- компилятор ресурсов по своим возможностям уступает
специализированным компиляторам ресурсов, но этих возможностей, как мне
@@ -5391,12 +5390,12 @@
Ничто не мешает Вам использовать компиляторы ресурсов от других
языков. Главное, чтобы синтаксис файла ресурсов соответствовал выбранному
компилятору.
-Return to contents.
+Return to contents.
-
+
12.9 Выходные файлы для MeOS.
-
+
Исполняемые файлы для операционной системы MenuetOS поддерживаются
компилятором совсем недавно. Для того, чтобы откомпилировать файл для
@@ -5409,14 +5408,14 @@
файл начальной инициализации startup.h--, в котором для операционной
системы MenuetOS создан блок инициализации и завершения программы.
Завершать выполнение таких программ можно просто выйдя из процедуры main.
-Return to contents.
+Return to contents.
-
+
13. Приложения.
13.1 Поиск включаемых файлов.
-
+
Поиск включаемого в вашу программу файла, имя которого объявляется
директивой include и заключено в двойные кавычки "", производится
@@ -5441,12 +5440,12 @@
Для консольной версии компилятора имена главного модуля и включаемых
файлов могут иметь длину более 8 символов.
-Return to contents.
+Return to contents.
-
+
13.2 Регистры, которые должны быть сохранены.
-
+
Регистры, которые должны сохраняться - BP, DI, SI, DS, SS, SP, CS и IP.
@@ -5475,12 +5474,12 @@
использованием CS и IP, следовательно их значения должны сохраняться. IP,
как известно, указатель адреса команды, и CS и IP непосредственно не могут
изменяться в процессорах 8086, 8088, 80286, 80386, 80486,...
-Return to contents.
+Return to contents.
-
+
13.3 C--.ini файл.
-
+
C--.ini файл предназначен для предустановки по умолчанию параметров
компилятора.
@@ -5531,12 +5530,12 @@
решать Вам, но как говорят, и я с этим согласен, лучше пользоваться золотой
серединой - Часть параметров прописать в c--.ini файле, а другую
непосредственно в компилируемом файле.
-Return to contents.
+Return to contents.
-
+
13.4 startup.h-- файл.
-
+
В этом файле находятся исходные тексты, которые компилируются
компилятором в код начальной инициализации файла, для всех поддерживаемых
@@ -5581,12 +5580,12 @@
либо в c--.ini файле или в командной строке компилятора укажете опцию
d=_USELONGNAME.
-Return to contents.
+Return to contents.
-
+
13.5 mainlib.ldp файл.
-
+
В этом файле находится большое число процедур из основной библиотеки
компилятора в уже откомпилированном виде. Все процедуры откомпилированы в
@@ -5615,12 +5614,12 @@
cmmlib.rar. Извлеките программу cmmlib.exe из этого архива и расположите ее
в одной с компилятором директории. Затем запустите эту программу с ключом
/L и Вы получите список процедур находящихся в этой библиотеке.
-Return to contents.
+Return to contents.
-
+
13.6 C-- символы.
-
+
SYMBOL|FUNCTION |EXAMPLE
--------------------------------------------------------------------
@@ -5669,29 +5668,9 @@
|флага операции сравнения. |
... |любое число параметров в | void proc(...);
:: |разрешение видимости | ::var=0;
-Return to contents.
-
-
-
-
-
-
- |
-
+