Языки программирования: Мега-Бейсик, Бета-Бейсик, Бета-Бейсик, Лазер-Бейсик, ZX-Форт, Паскаль HP4TM 1993 г.

PASCAL НР4Т - комментарии и директивы компилятора. Встроенный редактор. Приложение 1. Сообщения об ошибках. Приложение 2. Зарезервированные слова, предварительно определенные идентификаторы. Приложение 3. Представление данных в памяти.


4.КОММЕНТАРИИ И ДИРЕКТИВЫ КОМПИЛЯТОРА.

КОММЕНТАРИИ.

Комментарии могут стоять между двумя любыми зарезервированными
словами, числами, идентификаторами или специальными символами.
Комментарии начинаются с символа { или с пары символов (*. Если
следующий символ не является $, то комментарии игнорируются до тех
пор, пока не встретится символ } или пара символов *). Если же
следующий знак - $, то компилятор в этом месте отыскивает
последовательность директив (см. ниже), после которой символы
игнорируются до тех пор, пока не встретятся знаки конца комментария.

ДИРЕКТИВЫ КОМПИЛЯТОРА.

Директива L.

Управляет листингом текста программы и адресов объектного кода.
При L+ выдается полный листинг, при L- только строки с ошибками.

По умолчанию принимается L+.

Директива О.

Назначает выполнение проверок на переполнение при некоторых
операциях.

Так, при целочисленном делении или умножении проверка на
переполнение выполняется всегда.

0+ - выполняется проверка на переполнение при целочисленном
сложении и вычитании.

О- - в этих случаях проверка на переполнение не выполняется.

По умолчанию принимается 0+.

Директива С.

Устанавливает выполняется ли сканирование клавиатуры во время
исполнения объектного кода. Если С+, то при нажатии СС исполнение
будет прервано и появится сообщение HALT.

Эта проверка делается перед началом всех циклов, процедур и
функций. Пользователь может использовать эту функцию для определения
какая процедура или функция работает ненормально во время процесса
отладки. После отладки, если Вам надо, чтобы программа работала
быстро, ее надо безусловно отключить.

При С- эта проверка не производится.

По умолчанию принимается С+.

Директива S.

Проверка на возможность переполнения стека.

При S+ перед началом каждой функции или процедуры производится
проверка стека на возможность переполнения в результате выполнения
этого блока. Если стек пусковых процедур перехлестывает "кучу"
динамических переменных или саму программу, то выдается сообщение
"OUT OF RAM AT PC=XXXX", и вычисления прерываются. Разумеется такая
проверка на дает стопроцентной гарантии. Если процедура внутри себя
имеет очень много работы со стеком, то программа может выйти из
строя. С другой стороны, если функция имеет очень мало работы со
стеком, то проведением таких проверок мы просто задерживает без
надобности работу функции.

При S- стек не проверяется.

По умолчанию принимается S+.

Директива А.

Определяет производить ли проверку на то, чтобы индексы
переменных находились в пределах, заданных при объявлении массивов.

Если А+ и индекс слишком большой или слишком малый, то выдается
сообщение "INDEX ТОО HIGH" или "INDEX ТОО SMALL". Исполнение
программы при этом прерывается.

Если А-, то проверки не выполняются.

По умолчанию принимается А+.

Директива I.

При работе в 16-битной двоичной дополнительной арифметике в
результате операций сравнения может происходить переполнение, если
два числа отличаются друг от друга на величину,большую MAXINT
(32767). Если это произойдет, то результат сравнения будет неверным.
Обычно это не представляет особых проблем, однако если пользователю
это все же необходимо сделать, то тогда директива 1+ обеспечит
получение правильного ответа. Аналогичная ситуация может

происходить и в действительной арифметике, если два аргумента
отличаются друг от друга на величину, большую 3.4Е+38, но тогда это
неизбежно.

При I- проверка результатов сравнения не производится.

По умолчанию принимается I+.

Директива Р.

При использовании этой директивы производится переключение
устройства, на которое выводится листинг при компиляции. Если был
включен экран дисплея, то включается принтер и наоборот. Обратите
внимание на то, что здесь знаки "+" или "-" не нужны. По умолчанию
принимается экран.

5. ВСТРОЕННЫЙ РЕДАКТОР.

ВВЕДЕНИЕ В РЕДАКТОР.

Ко всем версиям ПАСКАЛЯ НР4Т прилагается простой строчный
редактор, рассчитанный на работу со всеми операционными системами на
базе процессора Z80. Он обеспечивает простоту работы и возможность
быстрого и эффективного редактирования программ.

Текст хранится в памяти в компактной форме. Количество ведущих
пробелов хранится в одном символе, помещенном в начало строки, а все
зарезервированные слова хранятся в токенизированной форме по одному
символу на слово. Это позволяет, как правило, экономить 25% памяти.

Редактор стартует автоматически после загрузки ПАСКАЛя и выдает
на экран сообщение:

Copyright Hisoft 1982

All rights reserved

Затем идет приглашение

В ответ на это приглашение Вы можете ввести командную строку в
формате:

С N1, N2, SI, S2
с последующим RETURN.

Здесь: С - команда, подлежащая исполнению (см. 5.2 ниже).

N1 - число в диапазоне 1...32767 включительно.

N2 - число в диапазоне 1...32767 включительно.

51 - символьный стринг длиной 20.

52 - символьный стринг длиной 20.

В качестве разделителя служит запятая, пробелы игнорируются, за
исключением тех, которые находятся внутри стрингов. Аргументы не
являются обязательными, хотя некоторые команды, например, 'D' не
будет работать, пока Вы не введете и N1 и N2. Редактор запоминает
последние введенные числа и стринги и везде, где можно, использует

их, если Вы в командной строке не задаете конкретный аргумент.
Значения N1 и N2 изначально установлены по 10, а стринги пустые.
Если Вы введете неразрешенную команду, например, F-1,100,HELLO, то
строка будет проигнорирована и на экране появится сообщение Pardon?
Вам надо перенабрать эту строку правильно: F1,100,HELLO. Это же
сообщение об ошибке появится, если длина S2 превосходит 20. Если
длина S1 больше 20, то все лишние символы игнорируются.

Команды могут вводиться как в верхнем, так и в нижнем
регистрах.

При вводе управляющей строки могут применяться все управляющие
коды, описанные в разделе 1.1.

Последующие подразделы детально описывают способы применения
различных возможных команд при работе с редактором. Обратите
внимание на то, что когда мы заключаем аргумент в символы это

означает, что аргумент ДОЛЖЕН присутствовать для выполнения команды.

КОМАНДЫ РЕДАКТОРА.

Вставка текста.

Текст можно вставить, набрав номер строки, пробел и затем сам
текст, либо с использованием команды Если же Вы наберете номер

строки и нажмете RETUTN, то эта строка в тексте будет уничтожена.
При вводе могут использоваться управляющие команды:

СХ - устранение строки до ее начала.

CI - переход к следующей позиции табуляции.

СС - возвращение в командный цикл.

CP - переключение на принтер или экран.

Текст вводится во внутренний буфер компилятора и, если этот
буфер переполняется, то Вы не сможете ввести дальнейший текст, пока
не используете DELETE или СХ для освобождения пространства буфера.

Команда I n,m.

Использование этой команды дает Вам возможность работать в
режиме автоматического ввода. Номера строк, начиная с Н, и с шагом m
вводятся автоматически. Вы вводите нужный текст после номера строки.
Можете использовать управляющие коды. Строка завершается RETURN. Для
выхода из этого режима используйте управляющий код СС (см. раздел
1.1) .

Если Вы введете строку с номером, который уже существует, то
старая строка будет уничтожена и заменена новой после нажатия
RETURN.

Если режим автоматического ввода номера строки приведет к тому,
что номер превысит 32767, то Вы выйдете из этого режима
автоматически.

Если при впечатывании текста Вы достигнете конца экранной
строки, не введя еще 128 символов (размер буфера), то строка
автоматически передвинется вверх, и Вы сможете печатать на следующей
строке. При этом автоматически вводится сдвиг строки, чтобы номера
строк эффективно отделялись от текста.

Листинг текста.

Текст можно просмотреть командой 'L". Количество строк, которое
можно просмотреть одновременно, установлено изначально, но его можно
изменить с помощью команды 'К'.

Команда L n,m.

По этой команде на экран выдается листинг текста, начиная со
строки п до строки m включительно. По умолчаний эти параметры равны

1 и 32767, соответственно, т.е. значения, принятые по умолчанию, не
берутся от аргументов, вводившихся в последний раз. Чтобы
распечатать весь текстовый файл, используйте просто VL/ без
аргументов. Номера строк форматируются с левосторонними полями так,
что номер строки изображается четко. Количество строк, изображаемых
на экране одновременно, может устанавливаться с помощью команды 'Kv.
После изображения определенного количества строк листинг
останавливается. Нажатием СС - вернитесь в командный цикл или
нажатием любой другой клавиши продолжите листинг.

Команда К п.

Команда К позволяет задать число строк, одновременно
изображаемых на экране дисплея. Значение (n MOD 256) рассчитывается
и запоминается. Если Вы хотите, чтобы при листинге на экране было 5
строк, то команда будет выглядеть просто как К5.

Редактирование текста.

После того, как текст введен, неизбежно возникает необходимость
в редактировании некоторых строк. Существуют команды для изменения,
стирания, перемещения и перенумерации строк.

Команда D<n,m>.

По этой команде уничтожаются все строки, начиная от п до т.
Если второй параметр меньше первого, то никаких шагов не
предпринимается. Одна строка может быть стерта, если эти параметры
равны, но это можно сделать и просто набрав номер строки и нажав
RETURN.

Команда М n,m.

По этой команде текст, содержавшийся в строке п, вставляется в
строку ш, уничтожая то, что содержалось там. Остается только первая
строка. Таким образом, эта команда дает возможность перемещать
строки. Если строка с номером п не существует, то никаких действий
не предпринимается.

Команда N<n,m>.

Эта команда позволяет перенумеровать строки текстового файла с
первым номером строки п и с шагом т. Оба параметра должны
присутствовать и, если при перенумерации появится строка с номером,
превосходящим 32767, то будет возвращена первоначальная нумерация.

Команда F n,m,f,s.

Эта команда поиска. Между строками пит разыскивается стринг
f. Если он найден, то соответствующая строка текста изображается на
экране и автоматически выполняется вход в режим редактирования (см.
ниже). Далее Вы можете использовать команды этого режима для поиска
последующих повторений этого стринга в определенном г Лапазоне строк
или произвести замену стринга f на стринг s в текущей строке и
перейти к дальнейшему поиску. Детали см. ниже.

Обратите внимание на то, что оба номера строк и оба стринга
могли быть введены ранее с помощью других команд, поэтому Вам
остается только нажать F для инициализации поиска. См. пример в
разделе 5.3 для пояснения.

Команда Е п.

Команда на редактирование строки с номером п. Если такого
номера не существует, то никаких действий не предпринимается, в
противном случае строка копируется в буфер и изображается на экране
вместе с номером строки. Номер строки повторяется еще раз ниже и

выполняется вход в режим редактирования. Все последующее
редактирование выполняется в буфере, а не в самом тексте, поэтому
исходная строка может быть возвращена в любой момент. Представьте
себе указатель, перемещаемый в этом режиме по строке. Для
редактирования Вы можете воспользоваться набором суб-команд, которые
рассмотрены ниже.

"(пробел) - переход к следующему символу в строке; выйти за
границу строки нельзя.

DELETE - возврат на один символ со стиранием; выйти за пределы
первого символа нельзя.

RETURN - завершение редактирования строки; все внесенные
изменения остаются.

Q - прекращение редактирования строки; все изменения
отменяются, строка остается в том виде, в каком она была до начала
редактирования.

R - перегрузить буфер редактора, т.е. забыть все изменения,
выполненные над этой строкой и восстановить ее в первоначальном
виде.

L - распечатать оставшуюся часть редактируемой строки. Вы
остаетесь в режиме редактирования, а указатель перемещается к началу
строки.

К - стереть символ, находящийся в текущей позиции указателя.

Z - стереть все символы, начиная с текущего (включительно) и до
конца строки.

F - найти следующее появление предварительно заданного стринга
(см. команду nFn выше). По этой команде автоматически производится
выход из редактирования текущей строки, если искомый стринг в ней не
найден. Все внесенные изменения остаются в силе. Если искомый стринг
будет найден внутри одной из последующих строк (из заданного
диапазона поиска), то автоматически включается режим редактирования
той строки, в которой он был найден. Обратите внимание на то, что
после поиска указатель всегда устанавливается на начало строки.

S - заменить найденный стринг на его предварительно
определенную замену, а затем выполнить поиск следующего появления
искомого стринга. Примечание. В текущей версии программы имеется
ошибка, которая требуетчтобы подкоманда VSN применялась немедленно
после выполнения подкоманды NFN или VS4. На практике это не должно
вызывать проблем.

I - вставить символ в текущую позицию указателя. Вы остаетесь в
этом под-режиме до тех пор, пока не нажмете RETURN. Тогда Вы
вернетесь в режим редактирования, а указатель будет установлен после
последнего вставленного Вами символа. В этом под-режиме можно
использовать DELETE и CI.

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

С - внесение изменений. В этом под-режиме Вы можете изменить
символ, не выходя из этого под-режима. Выход из него - нажатием
RETURN. DELETE работает в этом под-режиме, а команда CI - нет.

Команды работы с магнитофоном.

Текст может быть выгружен на магнитофон или загружен с него
командами 'РN, N GN.

Команда P n,m,s.

На ленту выгружаются строки из диапазона, заданного параметрами
n, m под именем, заданном стрингом s. Помните, что эти параметры
могли быть заданы предшествующими командами. Перед использованием

этой команды убедитесь в том, что Ваш магнитофон уже включен на
запись. Во время выгрузки текста на экране изображается сообщение
" BUSY. . " .

Команда G..s.

По этой команде производится поиск на ленте файла, записанного
в формате НР4Т и имеющего имя s. Во время поиска на экране
изображается сообщение "BUSY..". Если находится файл с другим
именем, то на экране появляется сообщение 'FOUND' и имя найденного
файла. Поиск продолжается. После того, как искомый файл будет
найден, выполняется его загрузка. Если при загрузке проходит ошибка,
то выдается сообщение "CHECKSUM ERROR" и загрузка прекращается. В
этом случает надо перемотать ленту, дать команду еще раз и повторить
загрузку.

Если стринг, задающий имя, - пустой, то будет загружен первый
встреченный файл, невзирая на его имя.

В режиме поиска на ленте Вы можете сами прервать процесс
нажатием СС.

Обратите внимание на то, что если у Вас в редакторе уже
сформирован какой-либо файл, то загружаемый файл будет добавлен к
его концу, при этом строки будут перенумерованы таким образом, что
новый объединенный файл будет начинаться с 1 и далее идти с шагом 1.

Компиляция и запуск из редактора.

Команда С п.

По этой команде начинается компиляция, начиная со строки п.
Если номер строки не задан, то по умолчанию принимается первая
существующая строка. Подробности см. в разделе 1.2.

Команда R.

Предварительно откомпилированный объектный код запускается по
этой команде, но только если между компиляцией и запуском исходный
текст не расширялся. Подробности см. в разделе 1.2.

Команда Т п.

Это команда на выполнение трансляции. Выполняется компиляция
текущего источника, начиная со строки п или с начала текста, если
этот параметр опущен. После успешного завершения компиляции Вы
получите приглашение "O.K.?". Если Вы ответите "Y", то объектный
код, полученный в результате компиляции, будет перемещен и
"пристегнут" к пусковым процедурам (компилятор при этом
уничтожается), а затем выгружен вместе с ними на ленту под именем,
существующим в данный момент для разыскиваемого стринга (см. выше).
Позже Вы можете загружать этот код, используя загрузчик НР4Т, при
этом автоматически начинается и выполнение. Имейте в виду, что после
использования команды *ТУ Вам, может быть, придется перезагружать
компилятор, но обычно это не представляет проблем, так как эта
команда обычно применяется, когда программа уже полностью проверена
и работает.

Если же Вы передумаете делать выгрузку на ленту, то не
отвечайте "Y" в ответ на приглашение "O.K.?". Управление будет
передано в редактор, который будет продолжать нормальную работу,
поскольку перемещение объектного кода не состоялось.

Прочие команды.

Команда В.

Эта команда просто передает управление операционной системе

компьютера. Подробности того, как снова войти в компилятор, см. в
ДОПОЛНЕНИИ по применению НР4Т.

Команда О n,m.

Помните, что текст хранится в памяти в токенизированной форме,
а ведущие нули компрессированы в один символ, а все
зарезервированные слова представлены односимвольными токенами. В то
же время, если у Вас в памяти есть какой-либо текст, возможно
полученный в другом редакторе и не токенизированный, то Вы можете
использовать эту команду, чтобы токенизировать его. Текст
считывается в буфер в расширенном формате и затем помещается в файл
в токенизированной форме. Эта операция может занять какое-то время.
Должен быть задан интервал строк или будут использованы ранее
задававшиеся параметры.

Команда S.♦d.

Эта команда позволяет Вам изменить разделитель, который служит
для отделения параметров друг от друга. При входе в редактор в
качестве разделителя принимается запятая, однако ее можно заменить
этой командой. Тогда в качестве разделителя будет принят первый
символ стринга d. Помните, что после того, как Вы задали другой
разделитель, именно он и должен использоваться даже внутри команды S
до тех пор, пока не будет задан другой.

Разделителем не может быть пробел.

Пример использования редактора.

Предположим, что Вы набрали следующую программу, используя
режим 110,10:

10 PROGRAM BUBBLESORT

2 0 CONST

30 Size=2000;

40 VAR

50 Numbers: ARRAY[1..Size] OF INTEGER;

60 I, Temp: INTEGER;

70 BEGIN

80 FOR I:=1 TO Size DO Number[I]:=RANDOM;

90 REPEAT
100 FOR I:=1 TO Size DO

110 Noswaps:=Number[I]:=RANDOM;

120 IF Number[I]>Number[1+1] THEN

130 BEGIN

140 Temp:=Number[I];

150 Number[I]:=Number[I+1];

160 Number [1+1]:= Temp;

.17 0 Noswaps :=FALSE

180 END

190 UNTIL Noswapss
200 END

Эта программа содержит ряд ошибок:
Строка 10 - отсутствует точка с запятой.
Строка 30 - предположим, что Вам нужен размер 100.
Строка 100 - вместо Size должно быть Size-1.
Строка 110 - ее номер должен быть 95.
Строка 190 - вместо Noswapss должн быть Noswaps.

Кроме этого была объявлена переменная Numbers, а все обращения
производятся к Number. И, наконец, логическая переменная Noswaps
вообще не была объявлена.

Чтобы привести все в порядок, продолжайте так:

F60,200,Number,Numbers - а затем последовательно давайте

подкоманду 'S'

ЕЮ - затем последовательно X; RETURN

RETURN

ЕЗО - затем_ К С 1 RETURN RETURN

F100,100,Size,Size с последующей командой 'S'

MHO,95

110 с последующим RETURN

Е190 затем X DELETE RETURN RETURN

65 Noswaps: BOOLEAN;

N10,10 для перенумерации текста с шагом

10

Мы Вам решительно советует проработать этот пример. Если Вы
привыкли к полноэкранным редакторам, то работа может показаться
несколько утомительной, но Вы быстро адаптируетесь.

ПРИЛОЖЕНИЕ 1.

СООБЩЕНИЯ ОБ ОШИБКАХ.

Сообщения, генерируемые компилятором.

1. Number too large. Число слишком большое.

2. Semi-colon expected. Должна быть точка с запятой.

3. Undeclared indentifier. Необъявленный идентификатор.

4. Identifier expected. Должен быть идентификатор.

5. Use '=' not ': = ' in a constant Применяйте '=', а не ':='
declaration. при объявлении константы.

6. ' = ' expected. Должен быть знак '='.

7. This identifier cannot begin а Оператор не может начинаться
statement. с этого идентификатора.

8. ': = ' expected. Должно быть ': = '.

9. ')' expected. Должно быть ')'.

10.Wrong type. Неправильный тип.

11.'.' expected. Должно быть '.'.

12.Factor expected. Должен быть множитель.

13.Constant expected. Должна быть константа.

14.This identifier is not а Этот идентификатор не
constant. константа.

15.'THEN' expected. Должно быть 'THEN'.

16.'DO' expected. Должно быть 'DO'.

17.'TO' or 'DOWNTO' expected. Должно быть 'TO'или'DOWNTO'.

18.'(' expected. Должно быть '('.

19.Cannot write this type of Нельзя записать этот тип
expression. выражения.

20.'OF' expected. Должно быть 'OF'.

21.',' expected. Должно быть ','.

22.':' expected. Должно быть ':'.

23.'PROGRAM' expected. Должно быть 'PROGRAM'.

24.Variable expected since Должна быть переменная, т.к.
parameter is a variable параметр является параметром
parameter. переменной.

25.'BEGIN' expected. Должно быть 'BEGIN'.

26.Variable expected in call to При исполнении 'READ'
READ. отсутствует переменная.

27.Cannot compare expressions of Выражения этого типа нельзя
this type. сравнить.

28.Should be either type INTEGER Должен быть тип 'INTEGER'

or type REAL. или 'REAL'.

29.Cannot read this type of Нельзя считать переменную

variable. этого типа.

30.This idetifier iz not a type. Это не идентификатор типа.

31.Exponent expected in real В действительном числе не
number. хватает экспоненциальной

части.

32.Scalar expression (not Должно быть скалярное (не

numeric) expected. числовое) выражение.

33.Null strings not allowed Нулевые стринги не разрешены
(use CHR(0)). (используйте CHR(O)).

34.'[' expected. Должно быть '['.

35.']' expected. Должно быть ' ]'.

36.Array index must be scalar. Параметр массива должен

быть скалярным.

37.'..' expected. Должно быть '..'.

3 8.']' or expected. Должно быть ']' или ','.

39.Lowerbound is greater than Нижняя граница выше верхней,

upperbound.

40.Set too large (more than 255 Множество слишком большое
possible elements). (более 255 элементов).

41.Function result must be type Результат функции должен
idenyifier. быть идентификатором типа.

42.',' or ']' expected in set. В множестве должно быть ','

или ']'.

4 3.'..' or ',' or ']' expected В множестве должно быть ','

in set. или '..' или ']'.

44.Type of parameter must be а Тип параметра должен быть
type identifier. идентификатором.

45.Null set cannot be first Пустое множество не может
factor in a non-assignment быть первым множителем в
statement. операторе, отличном от

оператора присваивания.

46.Scalar (including real) Должен быть скаляр (в том

expected. числе и действительный).

47.Scalar (not including real) Должен быть скаляр, но не

expected. включающий действительные

числа.

48.Sets incompatible. Множества не упаковываемы.

49.'<' and '>' cannot be used to '<' и '>' не могут
compare sets. использоваться при сравнении

множеств.

50.'FOTWARD', 'LABEL', 'CONST', Должно быть 'FORWARD',
'VAR', 'TYPE', or 'BEGIN' 'LABEL', 'CONST', 'VAR',
expected. 'TAPE' или 'BEGIN'.

51.Hexadecimal digit expected. Должна быть

шестнадцатиричная цифра.

52.Cannot POKE sete. Для множеств нельзя делать

РОКЕ.

53.Array too lange (>64k). Массив слишком велик (>64k).

54.'END' or ';' expected in Должно быть 'END' или ';' в
RECORD definition. определении типа ЗАПИСЬ.

55.Field identifier expected. Должен быть идентификатор

поля записи.

56.Variable expected after WITH. После WITH должна идти

переменная.

57.Variable in WIHT must be of Переменная в операторе WIHT
RECORD type. должна иметь тип ЗАПИСЬ.

58.Field identifier has not had Идентификатор поля записи не
asociated WIHT statement. имеет связанного с ним

оператора WIHT.

59.Unsigned integer expected После метки должно быть
after label. целое без знака.

60.Unsigned integer expected После GO TO должно быть
after GO TO. целое без знака.

61.This label is at the wrong Эта метка находится не на
level. том уровне.

62.Undeclared label. Необъявленная метка.

63.This parameter of SIZE Этот параметр оператора SIZE
should be a variable. должен быть переменной.

64.Can only use eguality tests Переменные-указатели могут
for pointers. только сравниваться.

65.The only write parameter for Для оператора WRITE с двумя
integers with two ":" is знаками ":" возможна только
e:m:H. форма записи e:m:H.

66.Strings may not contain end Стринги не могут содержать

of line characters. символов "конец строки".

67.The parameter of NEW, MARK or Параметром операторов NEW,
RELEASE should be a variable MARK или RELEASE могут быть
of pointer type. только переменные-указатели.

68.The parameter of ADDR should Параметром оператора ADDR
be a variable. должна быть переменная.

Сообщения об ошибках во время прогона.

Если во время работы программы пусковые процедуры фиксируют
ошибку, то выдается одно из нижеуказанных сообщений с записью 'at PC
= ХХХХ', где ХХХХ - ячейка памяти в которой произошла ошибка. Часто
причина ошибки бывает очевидной. Если это не так, то просмотрите
распечатку компиляции, чтобы установить где именно в программе
произошла ошибка, используя для поиска ХХХХ. Лишь в редких случаях
это не дает результата.

1.

Halt.

Стоп.

2 .

Overflow.

Переполнение.

3 .

Out of RAM.

Нехватка оперативной памяти

4 .

/by zero.

Деление на ноль.

5 .

Index too low.

Индекс слишком мал.

6 .

Index too high.

Индекс слишком большой.

7 .

Maths call error.

Ошибка при обращении к

математическим процедурам.

8 .

Number too large.

Число слишком большое.

9 .

Number expected.

Должно быть число.

10

.Line too long.

Строка слишком длинная.

11

.Exponent expected.

Должен быть показатель

степени.

Ошибки во время прогона программы вызывают ее остановку.

Ошибки во время прогона программы вызывают ее остановку.

ПРИЛОЖЕНИЕ 2.

ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА.
ПРЕДВАРИТЕЛЬНО ОПРЕДЕЛЕННЫЕ ИДЕНТИФИКАТОРЫ.

AND
DO

GO ТО
OF
SET
WHILE

ARRAY

DOWNTO

IN

PACKED

THEN

WITH

Зарезервированные слова.

BEGIN
ELSE
LABEL
PROCEDURE
TYPE

CASE
END
MOD

PROGRAM
TO

CONST

FORWARD

NIL

RECORD
UNTIL

DIV

FUNCTION
NOT

REPEAT
VAR

Предварительно заданные идентификаторы.
Постоянные MAXINT = 32767
Тип BOOLEAN = (FALSE, TRUE);

CHAR (расширенный набор ASCII)
INTEGER = -MAXINT..MAXINT
REAL - подмножество действительных чисел.
Процедуры WRITE; WRITELN; READ; READLN; PAGE; HALT; USER;

POKE; INLINE; OUT; NEW; MARK; RELEASE; TIN; TOUT;
Функции ABS; SQR; ODD; RANDOM; ORD; SUCC; PRED, INCH; EOLN;

PEEK; CHR; SQRT; ENTIER; ROUND; TRUNC; FRAC; SIN;
COS; TAN; ARCTAN; EXP; LN; ADDR; SIZE; INP;

ПРИЛОЖЕНИЕ 3.

ПРЕДСТАВЛЕНИЕ ДАННЫХ В ПАМЯТИ.

Представление данных.

Ниже приводится описание того, как данные представляются внутри
ПАСКАЛЯ НР4Т.

Информация о том, когда требуется сколько памяти, может быть
полезной программистам в различных случаях; прочие подробности могут
пригодиться при объединении программ, написанных в машинном коде с
программами написанными на ПАСКАЛе.

Целые.

Целые числа занимают 2 байта и хранятся в двоичной
дополнительной форме. Примеры:
1 = #0001
256 = #0100

-256 = #FF00

Для хранения целых чисел компилятор использует регистр HL.

Символы, логические переменные и прочие скаляры.

Занимают 1 байт памяти. Логические переменные.

Символы. Примеры: ORD(TRUE) = 1

'Е' =#45 ORD(FALSE)= 0

' [ ' =#5В

Для хранения этих данных используется регистр А.

Действительные числа.

Здесь используется нотация, похожая на нормализованную запись
числа, только мантисса и экспонента записываются в двоичной форме.
Примеры:

Десятичная форма. Двоичная форма.

2=2*10 1.0*2
1=1*10 1.0*2

-12.5=-1.25*10 -1.1001*2

0.1=1.0*10 1.100100*2

В компьютере эти данные хранятся в 4-х байтах в следующем
формате:

ДАННЫЕ знак нормализованная мантисса экспонента
БИТ 23 22 0 7 0

РЕГИСТР Н L Е D

Знак - знак мантиссы; 1 - отрицательная; 0 - положительная.
Нормализованная мантисса - старший бит (бит 22) всегда равен 1,
кроме случая представления действительного нуля;НЬ=0; ED=0.

Экспонента - степенная часть числа в двоичной дополнительной
форме записи.

Таким образом, мы получим:
2 =0 1000000 00000000 00000000 00000001
1 =0 1000000 00000000 00000000 00000000
-12.5 = 1 1100100 00000000 00000000 00000011
0.1 = 0 1100110 01100110 01100110 11111100

или: 2 --- #40, #00, #00, #01

1 --- #40, #00, #00, #00

-12.5-- #Е4, #00, #00, #03
0.1— #66, #66, #66, #FC
Итак, регистры HL, DE используются для работы с действительными
числами и загружаться они должны следующим образом:

2--- LD HL, #4000

LD DE,#0100

1--- LD HL, #4000

LD DE,#0000
-12.5-- LD HL,#Е400
LD DE,#0300

0.1--- LD HL , #6666

LD DE,#FC66

Этот пример показывает, почему действительные числа имеют не-
точность. Так, представление 0.1 в виде двоичной дроби является бес-
конечным .

Примечание: в памяти действительные числа хранятся в порядке:
ED LH.

Записи и массивы.
Записи занимают в памяти столько же места, сколько и сумма их
элементов.

Для массивов, если п - количество элементов массива, as
размер каждого его элемента, то массив занимает n*s байтов.

Множества.

Множества хранятся как битовые стринги. Поэтому, если базовый
тип содержит к элементов, то количество занятых байтов равно:
(k-l)DIV 8 +1

Примеры:

Множество символов требует (256-1)DIV 8 +1=32 байта.
Множество (красный,зеленый,желтый) требует (3-1)DIV8+1=1 байт.

Переменные-указатели.
Занимают два байта, где хранится адрес переменной, на которую
они указывают (сначала младший байт).

Хранение переменных во время прогона.
Имеются три вида информации, которая может быть нужна
пользователю.

а) Глобальные переменные - заданные в главном программном

блоке.

б) Локальные переменные - заданные во внутренних блоках.

в) Параметры и результаты - передаются и принимаются при

работе с процедурами и функциями.

Ниже рассматриваются эти вопросы. Отдельные примеры можно найти
в Приложении 4.

Глобальные переменные.

Глобальные переменные размещаются начиная с вершины стека
пусковых процедур и далее вниз. Так, например, если вершина стека
находится по адресу #В000, то переменные основной программы
располагаются так:

VAR i:INTEGER; - i занимает 2 байта и хранится в #AFFE, #AFFF.

ch:CHAR; - ch занимает один байт - AFFD

X:REAL - X (4 байта) - #AFF9, #AFFA, #AFFB, #AFFC.

Локальные переменные.

К локальным переменным обратиться через стек так просто не
удается, поэтому здесь используется регистр процессора IX.

Он устанавливается на начало внутреннего блока программы таким
образом, чтобы IX-4 указывало на начало локальных переменных этого
блока и т.д.

PROCEDURE test

VAR i,j:INTEGER

Тогда: i (целое, потому занимает 2 байта) - хранится в IX-6, IX-5.
j - IX-8, IX-7.

Параметры и результаты исполнения процедур и функций.

Значащие параметры рассматриваются как локальные переменные и,
так же как и у них, чем раньше параметр объявлен, тем выше адрес в
памяти он имеет. Но, в отличие от локальных переменных, у них
фиксируется младший, а не старший адрес, и помещается он в IX+2.

Пример:

PROCEDURE test (i:REAL; j:INTEGER);
Тогда: j (помещается ниже) - в IX+2, IX+3.
i - IX+4, IX+5, IX+6, IX+7.

Переменные параметры трактуются так же, как и значащие
параметры, с одним исключением. Им всегда отводится по 2 байта и эти
байты содержат адрес переменной.

Пример:

PROCEDURE test(i:INTEGER; VAR x:REAL);
Тогда: указание на х помещается в IX+2, IX+3. Здесь хранится

адрес, в котором хранится х. Значение i находится в IX+4 и
IX+5 .

Результаты работы функций помещаются над первым параметром,
например:

FUNCTION test (i:INTEGER);REAL;
Тогда: i - хранится в IX+2, IX+3 и выше резервируется место для
результата - IX+4, IX+5, IX+6, IX+7.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
От авторов - Приветствую вас в новом номере моей газеты.
Программистам - Сборник кодов: зашифровка файла, Эффект точечной сетки, работа с диском при включенных прерываниях, программирование кэша.
TOP 20 - Лучшие 20 игр по итогам продаж на торговых точках Москвы.
INTRO - С наступлением лета.
Новинки - программа для оптимизации сканированых картинок Scan Screen Optimizer.

В этот день...   19 апреля