- •Содержание
- •Часть 1. Основные понятия программирования §1.1. Этапы разработки программного обеспечения
- •§1.2. Основные сведения об алгоритмах Понятие алгоритма
- •Свойства алгоритма
- •Формы записи алгоритмов
- •Блок-схемы алгоритмов
- •§1.3. Языки программирования
- •§1.4. Паскаль и Object Pascal, Турбо-Паскаль и Delphi
- •Контрольные вопросы
- •Язык, оболочка и интегрированная среда разработки
- •Часть 2. Общие сведения о языке Паскаль §2.1. Алфавит и служебные слова
- •Описание общих конструкций языка
- •§2.2. Структура программы
- •§2.3. Разделы описаний Описание меток
- •Определение констант
- •Определение типов
- •Описание переменных
- •Контрольные вопросы
- •Часть 3. Простые типы данных Иерархия типов
- •§3.1. Целые типы
- •§3.2. Вещественные типы
- •§3.3. Логический тип
- •§3.4. Литерный тип
- •§3.5. Перечисляемый тип
- •§3.6. Диапазоны (интервальный тип)
- •Дополнительные типы в Delphi
- •Контрольные вопросы
- •Глава 4. Операторы языка Паскаль Выражения
- •§4.1. Оператор присваивания
- •§4.2. Ввод-вывод данных
- •§4.3. Составной оператор
- •§4.4. Пустой оператор
- •§4.5. Безусловный оператор перехода
- •§4.6. Условный оператор
- •§4.7. Оператор цикла с параметром for
- •§4.8. Оператор цикла с предусловием while
- •§4.9. Оператор цикла с постусловием repeat
- •§4.10. Оператор выбора case
- •Контрольные вопросы
- •Глава 5. Процедурное программирование §5.1. Функции
- •Параметры – значения
- •Параметры – переменные
- •Бестиповые параметры
- •§5.2. Процедуры
- •Правила использования подпрограмм
- •Рекурсия
- •Директивы
- •Процедурные типы
- •Пример использования подпрограмм
- •Контрольные вопросы
- •Глава 6. Структурированные типы данных
- •§6.1. Массивы
- •§6.2. Строки
- •§6.3. Записи
- •§6.4. Множества
- •Пример использования множеств
- •§6.5. Файлы
- •Установочные и завершающие операции
- •Операции ввода-вывода
- •Перемещения по файлу
- •Пример работы с файлом
- •Обработка ошибок ввода-вывода
- •Специальные операции
- •Пример объединения двух файлов
- •Текстовые файлы
- •Стандартные текстовые файлы
- •Файлы без типа
- •Контрольные вопросы
- •Глава 7. Динамические структуры данных §7.1. Динамические переменные
- •§7.2. Указатели
- •Работа с динамическими переменными
- •Пример двухсвязанного циклического списка
- •Указатели без типа
- •Контрольные вопросы
- •Глава 8. Низкоуровневые возможности Паскаля §8.1. Язык Ассемблер
- •§8.2. Доступ к аппаратуре Доступ к памяти
- •Доступ к портам ввода-вывода
- •Работа по прерываниям
- •Контрольные вопросы
- •Глава 9. Модули §9.1. Основные понятия
- •§9.2. Использование модулей
- •§9.3. Стандартные модули
- •§9.4. Модуль Crt
- •Работа с экраном в текстовом режиме
- •Работа с клавиатурой
- •Работа со звуком
- •§9.5. Модуль dos
- •§9.6. Графический режим монитора
- •Контрольные вопросы
- •Глава 10. Введение в объектно-ориентированное программирование §10.1. История развития программирования
- •Понятие объекта
- •§10.2. Свойства объектов
- •Раннее и позднее связывание
- •§10.3. Виртуальные методы
- •Конструкторы и деструкторы
- •§10.4. Динамические объекты
- •Скрытые поля и методы
- •Контрольные вопросы
- •Литература
Контрольные вопросы
Что означает термин «статические переменные»?
Как производится обращение к статическим переменным?
Что означает термин «динамические переменные»?
Как производится обращение к динамическим переменным?
В каких случаях используются динамические переменные?
Что такое «указатели»?
Для каких целей используются указатели?
Что такое «пустой указатель», и как он обозначается?
Для чего используется операция взятия адреса?
Что такое «разыменование»?
При каком значении указателя его нельзя разыменовывать?
Как выглядит процедура создания динамической переменной?
Что происходит при выполнении процедуры создания динамической переменной?
Что можно определить с помощью функции MaxAvail?
Как выглядит процедура уничтожения динамической переменной?
Что происходит при выполнении процедуры уничтожения динамической переменной?
С помощью какой функции можно определить максимальный размер непрерывного участка свободной памяти?
Какой тип совместим со всеми ссылочными типами?
Глава 8. Низкоуровневые возможности Паскаля §8.1. Язык Ассемблер
Специфика системных программ, ориентированных на непосредственное взаимодействие с физическими устройствами компьютера, а так же необходимость доступа ко всем его аппаратным возможностям, часто не позволяют создавать элементы программ средствами языков высокого уровня. Более того, исполняемый код, порождаемый компиляторами, менее эффективен, чем код, созданный вручную. Поэтому повышенные требования к быстродействию и объему программ вызывают необходимость использования машинных команд или языка ассемблера.
Ассемблер (assembler, assembly language – монтаж, сборка) – язык программирования, понятия которого отражают архитектуру ЭВМ. Обеспечивает доступ к регистрам, указание методов адресации и описание операций в терминах команд конкретного процессора. Ассемблер, содержащий средства более высокого уровня: встроенные и определяемые макрокоманды, соответствующие нескольким машинным командам, автоматический выбор команды в зависимости от типов операндов, средства описания структур данных и т.д., является макроассемблером.
Язык ассемблера используется при:
Создании драйверов низшего уровня и некоторых других программ, требующих прямого доступа к потенциальным возможностям компьютера.
Достижении наибольшей эффективности использования вычислительных ресурсов при вычислениях с большим количеством вложенных циклов. Самые внутренние циклы часто программируются на языке ассемблера.
Решении задач в реальном масштабе времени, то есть управляющих программ, которые требуют быстрой реакции вычислительной системы на внешние воздействия, и процессы, строго привязанные к определенным моментам времени. Более того, управляющие однокристальные ЭВМ обычно имеют маленький объем памяти.
Для управляющих ЭВМ набор языков программирования очень ограничен. Обычно это ассемблер и Си, причем последний часто отсутствует.
Изучение языка ассемблера дает понимание организации вычислительных процессов в процессоре, принципов его работы и позволяет создавать оптимальные программы и на языках высокого уровня.
Язык Турбо Паскаль допускает три основных вида доступа ко всем аппаратным возможностям ЭВМ:
Можно запрограммировать подпрограммы вне среды Паскаль на языке ассемблера или любом другом языке программирования и подключить полученный после ассемблирования или трансляции объектный модуль к Паскаль-программе.
Начиная с шестой версии в Паскале появились средства включения в текст программ фрагментов на языке ассемблера. Эти средства называются «встроенный ассемблер».
Можно непосредственно включать в текст программы фрагменты, написанные в машинном коде. Эти средства оставлены для совместимости с предыдущими версиями Турбо Паскаля и сейчас практически не используются и здесь не рассматриваются.
После трансляции с большинства языков программирования получается промежуточный объектный файл (OBJ-файл). Кроме непосредственно кодов он содержит некоторую дополнительную информацию.
Для подключения внешних подпрограмм в Паскале используется директива external, следующая за заголовком подпрограммы. Кроме этого, где-либо в тексте программы надо задать директиву компилятора $L, аргументом которой является имя OBJ-файла, содержащего код подключаемой подпрограммы, например:
Procedure SRoots(A,B,C:real); external;
Procedure CRoots(B,C,D.F:real); external;
...
{$L ROOTS.OBJ}
Для обеспечения корректности такого подключения необходимо соблюдать определенные межъязыковые соглашения о связях, принятые в системе Турбо Паскаль.
Средства встроенного ассемблера позволяют подключать ассемблерный текст непосредственно в Паскаль-программы, что гораздо удобнее и гибче, чем техника подключения независимо разработанных ассемблерных программ с помощью аппарата внешних подпрограмм.
Встроенный ассемблер реализует подмножество языка ассемблера, совместимого с языками Turbo Assembler фирмы Borland (TASM) и макроассемблера фирмы Microsoft (MASM). Хотя некоторые возможности по описанию структур не реализованы, но они во многом соответствуют описаниям Паскаль-объектов – констант, переменных, подпрограмм.
Средства, образующие встроенный ассемблер, организованы в виде двух конструкций: ассемблерные операторы (asm-операторы) и ассемблерные подпрограммы.
Структура asm-оператора:
asm
<команды (операторы) ассемблера>
end
Например:
asm
mov ah, 12 {работа с клавиатурой}
{информация о статусе смены регистра}
int 16h
mov OsnFlag,al
mov DopFlag,ah
end;
Обычно комментарии на ассемблере следуют за точкой с запятой. Но в asm-операторах используются ограничители, принятые для Паскаля – { } и (* *). Точкой с запятой могут разделяться команды ассемблера, но обычно используется общепринятый разделитель – переход на новую строку.
Поэтому возможна следующая запись:
asm
mov ax,Left; xchg ax,Right; mov Left,ax;
end;
Синтаксис команды:
[метка:][префикс] инструкция [операнд[,операнд]]
Инструкцией является мнемоническое обозначение действия, выполняемого командой.
Особенности использования asm-операторов.
Использование регистров. В связи с тем, что Паскаль использует некоторые регистры в своих целях, не допускается изменять содержимое регистров BP, SP, SS и DS.
Метки. Образование меток такое же, как и в Паскале. Они могут быть глобальными или локальными в asm-операторе. Но в последнем случае они не описываются и должны начинаться с символа «@».
Коды инструкций. Поддерживаются только все коды инструкций процессора i8086. Для использования расширения этих кодов для процессора i80286 и арифметических сопроцессоров необходимо использовать специальные директивы компилятора.
Зарезервированные слова. Для совместимости с ассемблером используется 41 зарезервированное слово, имеющее область действия только в asm-операторах. Эти слова имеют приоритет над именами пользователя, например:
Var Ch:char;
...
asm
mov Ch,1
end;
Здесь единица загружается в регистр процессора Ch, а не в ячейку памяти с именем Ch. Для указания описанного имени, совпадающего с зарезервированным словом, надо использовать перед именем символ «&»:
asm
mov &Ch,1
end;
Выражения. Использование выражений существенно отличается в Паскале и ассемблере. В Паскале упоминание переменной понимается как ее содержимое, а в asm-операторах обозначает адрес или константу. Поэтому оператор для х,
asm
mov AX,x+4
end;
описанного как переменная, не помещает значение х+4 в АХ, а загружает в регистр значение слова, хранящегося по адресу, на 4 байта большему х. Для увеличения х на 4 выполняются действия:
asm
mov AX,x
add AX,4
end;
Но записывать константы возможно следующим образом:
Const x=10;
y=20;
Var z:integer;
...
asm
mov z,x+y
end;
Есть 3 специальных переменных, одна из которых
@Result,
обозначает переменную с результатом функции. Например, функция
Function Sum(x,y:integer):integer;
Begin
Sum:=x+y;
end;
эквивалентна
Function Sum(x,y:integer):integer;
Begin
asm
mov ax,x
add ax,y
mov @Result,ax
end;
end;
Для чисто ассемблерных подпрограмм может использоваться директива assembler. Это позволяет записывать подпрограммы полностью на языке ассемблера, с отсутствием операторных скобок и единственным asm-оператором:
Function LongMul(x,y:integer):longint; assembler;
asm
mov ax,x
imul y
end;
Использование @Result здесь не допускается, так как компилятор не образует переменную для результата функции. Обмен данными производится через регистры.
