/programs/develop/oberon07/doc/CC.txt |
---|
0,0 → 1,36 |
Условная компиляция |
синтаксис: |
$IF "(" ident {"|" ident} ")" |
<...> |
{$ELSIF "(" ident {"|" ident} ")"} |
<...> |
[$ELSE] |
<...> |
$END |
где ident: |
- одно из возможных значений параметра <target> в командной строке |
- пользовательский идентификатор, переданный с ключом -def при компиляции |
примеры: |
$IF (win64con | win64gui | win64dll) |
OS := "WIN64"; |
$ELSIF (win32con | win32gui | win32dll) |
OS := "WIN32"; |
$ELSIF (linux64exe | linux64so) |
OS := "LINUX64"; |
$ELSIF (linux32exe | linux32so) |
OS := "LINUX32"; |
$ELSE |
OS := "UNKNOWN"; |
$END |
$IF (CPUX86_64) (* -def CPUX86_64 *) |
bit_depth := 64; |
$ELSE |
bit_depth := 32; |
$END |
/programs/develop/oberon07/doc/KOSLib.txt |
---|
0,0 → 1,566 |
============================================================================== |
Библиотека (KolibriOS) |
------------------------------------------------------------------------------ |
MODULE Out - консольный вывод |
PROCEDURE Open |
формально открывает консольный вывод |
PROCEDURE Int(x, width: INTEGER) |
вывод целого числа x; |
width - количество знакомест, используемых для вывода |
PROCEDURE Real(x: REAL; width: INTEGER) |
вывод вещественного числа x в плавающем формате; |
width - количество знакомест, используемых для вывода |
PROCEDURE Char(x: CHAR) |
вывод символа x |
PROCEDURE FixReal(x: REAL; width, p: INTEGER) |
вывод вещественного числа x в фиксированном формате; |
width - количество знакомест, используемых для вывода; |
p - количество знаков после десятичной точки |
PROCEDURE Ln |
переход на следующую строку |
PROCEDURE String(s: ARRAY OF CHAR) |
вывод строки s |
------------------------------------------------------------------------------ |
MODULE In - консольный ввод |
VAR Done: BOOLEAN |
принимает значение TRUE в случае успешного выполнения |
операции ввода, иначе FALSE |
PROCEDURE Open |
формально открывает консольный ввод, |
также присваивает переменной Done значение TRUE |
PROCEDURE Int(VAR x: INTEGER) |
ввод числа типа INTEGER |
PROCEDURE Char(VAR x: CHAR) |
ввод символа |
PROCEDURE Real(VAR x: REAL) |
ввод числа типа REAL |
PROCEDURE String(VAR s: ARRAY OF CHAR) |
ввод строки |
PROCEDURE Ln |
ожидание нажатия ENTER |
------------------------------------------------------------------------------ |
MODULE Console - дополнительные процедуры консольного вывода |
CONST |
Следующие константы определяют цвет консольного вывода |
Black = 0 Blue = 1 Green = 2 |
Cyan = 3 Red = 4 Magenta = 5 |
Brown = 6 LightGray = 7 DarkGray = 8 |
LightBlue = 9 LightGreen = 10 LightCyan = 11 |
LightRed = 12 LightMagenta = 13 Yellow = 14 |
White = 15 |
PROCEDURE Cls |
очистка окна консоли |
PROCEDURE SetColor(FColor, BColor: INTEGER) |
установка цвета консольного вывода: FColor - цвет текста, |
BColor - цвет фона, возможные значения - вышеперечисленные |
константы |
PROCEDURE SetCursor(x, y: INTEGER) |
установка курсора консоли в позицию (x, y) |
PROCEDURE GetCursor(VAR x, y: INTEGER) |
записывает в параметры текущие координаты курсора консоли |
PROCEDURE GetCursorX(): INTEGER |
возвращает текущую x-координату курсора консоли |
PROCEDURE GetCursorY(): INTEGER |
возвращает текущую y-координату курсора консоли |
------------------------------------------------------------------------------ |
MODULE ConsoleLib - обертка библиотеки console.obj |
------------------------------------------------------------------------------ |
MODULE Math - математические функции |
CONST |
pi = 3.141592653589793E+00 |
e = 2.718281828459045E+00 |
PROCEDURE IsNan(x: REAL): BOOLEAN |
возвращает TRUE, если x - не число |
PROCEDURE IsInf(x: REAL): BOOLEAN |
возвращает TRUE, если x - бесконечность |
PROCEDURE sqrt(x: REAL): REAL |
квадратный корень x |
PROCEDURE exp(x: REAL): REAL |
экспонента x |
PROCEDURE ln(x: REAL): REAL |
натуральный логарифм x |
PROCEDURE sin(x: REAL): REAL |
синус x |
PROCEDURE cos(x: REAL): REAL |
косинус x |
PROCEDURE tan(x: REAL): REAL |
тангенс x |
PROCEDURE arcsin(x: REAL): REAL |
арксинус x |
PROCEDURE arccos(x: REAL): REAL |
арккосинус x |
PROCEDURE arctan(x: REAL): REAL |
арктангенс x |
PROCEDURE arctan2(y, x: REAL): REAL |
арктангенс y/x |
PROCEDURE power(base, exponent: REAL): REAL |
возведение числа base в степень exponent |
PROCEDURE log(base, x: REAL): REAL |
логарифм x по основанию base |
PROCEDURE sinh(x: REAL): REAL |
гиперболический синус x |
PROCEDURE cosh(x: REAL): REAL |
гиперболический косинус x |
PROCEDURE tanh(x: REAL): REAL |
гиперболический тангенс x |
PROCEDURE arsinh(x: REAL): REAL |
обратный гиперболический синус x |
PROCEDURE arcosh(x: REAL): REAL |
обратный гиперболический косинус x |
PROCEDURE artanh(x: REAL): REAL |
обратный гиперболический тангенс x |
PROCEDURE round(x: REAL): REAL |
округление x до ближайшего целого |
PROCEDURE frac(x: REAL): REAL; |
дробная часть числа x |
PROCEDURE floor(x: REAL): REAL |
наибольшее целое число (представление как REAL), |
не больше x: floor(1.2) = 1.0 |
PROCEDURE ceil(x: REAL): REAL |
наименьшее целое число (представление как REAL), |
не меньше x: ceil(1.2) = 2.0 |
PROCEDURE sgn(x: REAL): INTEGER |
если x > 0 возвращает 1 |
если x < 0 возвращает -1 |
если x = 0 возвращает 0 |
PROCEDURE fact(n: INTEGER): REAL |
факториал n |
------------------------------------------------------------------------------ |
MODULE Debug - вывод на доску отладки |
Интерфейс как модуль Out |
PROCEDURE Open |
открывает доску отладки |
------------------------------------------------------------------------------ |
MODULE File - работа с файловой системой |
TYPE |
FNAME = ARRAY 520 OF CHAR |
FS = POINTER TO rFS |
rFS = RECORD (* информационная структура файла *) |
subfunc, pos, hpos, bytes, buffer: INTEGER; |
name: FNAME |
END |
FD = POINTER TO rFD |
rFD = RECORD (* структура блока данных входа каталога *) |
attr: INTEGER; |
ntyp: CHAR; |
reserved: ARRAY 3 OF CHAR; |
time_create, date_create, |
time_access, date_access, |
time_modif, date_modif, |
size, hsize: INTEGER; |
name: FNAME |
END |
CONST |
SEEK_BEG = 0 |
SEEK_CUR = 1 |
SEEK_END = 2 |
PROCEDURE Load(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER; |
Загружает в память файл с именем FName, записывает в параметр |
size размер файла, возвращает адрес загруженного файла |
или 0 (ошибка). При необходимости, распаковывает |
файл (kunpack). |
PROCEDURE GetFileInfo(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN |
Записывает структуру блока данных входа каталога для файла |
или папки с именем FName в параметр Info. |
При ошибке возвращает FALSE. |
PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN |
возвращает TRUE, если файл с именем FName существует |
PROCEDURE Close(VAR F: FS) |
освобождает память, выделенную для информационной структуры |
файла F и присваивает F значение NIL |
PROCEDURE Open(FName: ARRAY OF CHAR): FS |
возвращает указатель на информационную структуру файла с |
именем FName, при ошибке возвращает NIL |
PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN |
удаляет файл с именем FName, при ошибке возвращает FALSE |
PROCEDURE Seek(F: FS; Offset, Origin: INTEGER): INTEGER |
устанавливает позицию чтения-записи файла F на Offset, |
относительно Origin = (SEEK_BEG - начало файла, |
SEEK_CUR - текущая позиция, SEEK_END - конец файла), |
возвращает позицию относительно начала файла, например: |
Seek(F, 0, SEEK_END) |
устанавливает позицию на конец файла и возвращает длину |
файла; при ошибке возвращает -1 |
PROCEDURE Read(F: FS; Buffer, Count: INTEGER): INTEGER |
Читает данные из файла в память. F - указатель на |
информационную структуру файла, Buffer - адрес области |
памяти, Count - количество байт, которое требуется прочитать |
из файла; возвращает количество байт, которое было прочитано |
и соответствующим образом изменяет позицию чтения/записи в |
информационной структуре F. |
PROCEDURE Write(F: FS; Buffer, Count: INTEGER): INTEGER |
Записывает данные из памяти в файл. F - указатель на |
информационную структуру файла, Buffer - адрес области |
памяти, Count - количество байт, которое требуется записать |
в файл; возвращает количество байт, которое было записано и |
соответствующим образом изменяет позицию чтения/записи в |
информационной структуре F. |
PROCEDURE Create(FName: ARRAY OF CHAR): FS |
создает новый файл с именем FName (полное имя), возвращает |
указатель на информационную структуру файла, |
при ошибке возвращает NIL |
PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN |
создает папку с именем DirName, все промежуточные папки |
должны существовать, при ошибке возвращает FALSE |
PROCEDURE DeleteDir(DirName: ARRAY OF CHAR): BOOLEAN |
удаляет пустую папку с именем DirName, |
при ошибке возвращает FALSE |
PROCEDURE DirExists(DirName: ARRAY OF CHAR): BOOLEAN |
возвращает TRUE, если папка с именем DirName существует |
------------------------------------------------------------------------------ |
MODULE Read - чтение основных типов данных из файла F |
Процедуры возвращают TRUE в случае успешной операции чтения и |
соответствующим образом изменяют позицию чтения/записи в |
информационной структуре F |
PROCEDURE Char(F: File.FS; VAR x: CHAR): BOOLEAN |
PROCEDURE Int(F: File.FS; VAR x: INTEGER): BOOLEAN |
PROCEDURE Real(F: File.FS; VAR x: REAL): BOOLEAN |
PROCEDURE Boolean(F: File.FS; VAR x: BOOLEAN): BOOLEAN |
PROCEDURE Set(F: File.FS; VAR x: SET): BOOLEAN |
PROCEDURE WChar(F: File.FS; VAR x: WCHAR): BOOLEAN |
------------------------------------------------------------------------------ |
MODULE Write - запись основных типов данных в файл F |
Процедуры возвращают TRUE в случае успешной операции записи и |
соответствующим образом изменяют позицию чтения/записи в |
информационной структуре F |
PROCEDURE Char(F: File.FS; x: CHAR): BOOLEAN |
PROCEDURE Int(F: File.FS; x: INTEGER): BOOLEAN |
PROCEDURE Real(F: File.FS; x: REAL): BOOLEAN |
PROCEDURE Boolean(F: File.FS; x: BOOLEAN): BOOLEAN |
PROCEDURE Set(F: File.FS; x: SET): BOOLEAN |
PROCEDURE WChar(F: File.FS; x: WCHAR): BOOLEAN |
------------------------------------------------------------------------------ |
MODULE DateTime - дата, время |
CONST ERR = -7.0E5 |
PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec: INTEGER) |
записывает в параметры компоненты текущей системной даты и |
времени |
PROCEDURE Encode(Year, Month, Day, Hour, Min, Sec: INTEGER): REAL |
возвращает дату, полученную из компонентов |
Year, Month, Day, Hour, Min, Sec; |
при ошибке возвращает константу ERR = -7.0E5 |
PROCEDURE Decode(Date: REAL; VAR Year, Month, Day, |
Hour, Min, Sec: INTEGER): BOOLEAN |
извлекает компоненты |
Year, Month, Day, Hour, Min, Sec из даты Date; |
при ошибке возвращает FALSE |
------------------------------------------------------------------------------ |
MODULE Args - параметры программы |
VAR argc: INTEGER |
количество параметров программы, включая имя |
исполняемого файла |
PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) |
записывает в строку s n-й параметр программы, |
нумерация параметров от 0 до argc - 1, |
нулевой параметр -- имя исполняемого файла |
------------------------------------------------------------------------------ |
MODULE KOSAPI |
PROCEDURE sysfunc1(arg1: INTEGER): INTEGER |
PROCEDURE sysfunc2(arg1, arg2: INTEGER): INTEGER |
... |
PROCEDURE sysfunc7(arg1, arg2, ..., arg7: INTEGER): INTEGER |
Обертки для функций API ядра KolibriOS. |
arg1 .. arg7 соответствуют регистрам |
eax, ebx, ecx, edx, esi, edi, ebp; |
возвращают значение регистра eax после системного вызова. |
PROCEDURE sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER |
Обертка для функций API ядра KolibriOS. |
arg1 - регистр eax, arg2 - регистр ebx, |
res2 - значение регистра ebx после системного вызова; |
возвращает значение регистра eax после системного вызова. |
PROCEDURE malloc(size: INTEGER): INTEGER |
Выделяет блок памяти. |
size - размер блока в байтах, |
возвращает адрес выделенного блока |
PROCEDURE free(ptr: INTEGER): INTEGER |
Освобождает ранее выделенный блок памяти с адресом ptr, |
возвращает 0 |
PROCEDURE realloc(ptr, size: INTEGER): INTEGER |
Перераспределяет блок памяти, |
ptr - адрес ранее выделенного блока, |
size - новый размер, |
возвращает указатель на перераспределенный блок, |
0 при ошибке |
PROCEDURE GetCommandLine(): INTEGER |
Возвращает адрес строки параметров |
PROCEDURE GetName(): INTEGER |
Возвращает адрес строки с именем программы |
PROCEDURE LoadLib(name: ARRAY OF CHAR): INTEGER |
Загружает DLL с полным именем name. Возвращает адрес таблицы |
экспорта. При ошибке возвращает 0. |
PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER |
name - имя процедуры |
lib - адрес таблицы экспорта DLL |
Возвращает адрес процедуры. При ошибке возвращает 0. |
------------------------------------------------------------------------------ |
MODULE ColorDlg - работа с диалогом "Color Dialog" |
TYPE |
Dialog = POINTER TO RECORD (* структура диалога *) |
status: INTEGER (* состояние диалога: |
0 - пользователь нажал Cancel |
1 - пользователь нажал OK |
2 - диалог открыт *) |
color: INTEGER (* выбранный цвет *) |
END |
PROCEDURE Create(draw_window: DRAW_WINDOW): Dialog |
создать диалог |
draw_window - процедура перерисовки основного окна |
(TYPE DRAW_WINDOW = PROCEDURE); |
процедура возвращает указатель на структуру диалога |
PROCEDURE Show(cd: Dialog) |
показать диалог |
cd - указатель на структуру диалога, который был создан ранее |
процедурой Create |
PROCEDURE Destroy(VAR cd: Dialog) |
уничтожить диалог |
cd - указатель на структуру диалога |
------------------------------------------------------------------------------ |
MODULE OpenDlg - работа с диалогом "Open Dialog" |
TYPE |
Dialog = POINTER TO RECORD (* структура диалога *) |
status: INTEGER (* состояние диалога: |
0 - пользователь нажал Cancel |
1 - пользователь нажал OK |
2 - диалог открыт *) |
FileName: ARRAY 4096 OF CHAR (* имя выбранного файла *) |
FilePath: ARRAY 4096 OF CHAR (* полное имя выбранного |
файла *) |
END |
PROCEDURE Create(draw_window: DRAW_WINDOW; type: INTEGER; def_path, |
filter: ARRAY OF CHAR): Dialog |
создать диалог |
draw_window - процедура перерисовки основного окна |
(TYPE DRAW_WINDOW = PROCEDURE) |
type - тип диалога |
0 - открыть |
1 - сохранить |
2 - выбрать папку |
def_path - путь по умолчанию, папка def_path будет открыта |
при первом запуске диалога |
filter - в строке записано перечисление расширений файлов, |
которые будут показаны в диалоговом окне, расширения |
разделяются символом "|", например: "ASM|TXT|INI" |
процедура возвращает указатель на структуру диалога |
PROCEDURE Show(od: Dialog; Width, Height: INTEGER) |
показать диалог |
od - указатель на структуру диалога, который был создан ранее |
процедурой Create |
Width и Height - ширина и высота диалогового окна |
PROCEDURE Destroy(VAR od: Dialog) |
уничтожить диалог |
od - указатель на структуру диалога |
------------------------------------------------------------------------------ |
MODULE kfonts - работа с kf-шрифтами |
CONST |
bold = 1 |
italic = 2 |
underline = 4 |
strike_through = 8 |
smoothing = 16 |
bpp32 = 32 |
TYPE |
TFont = POINTER TO TFont_desc (* указатель на шрифт *) |
PROCEDURE LoadFont(file_name: ARRAY OF CHAR): TFont |
загрузить шрифт из файла |
file_name имя kf-файла |
рез-т: указатель на шрифт/NIL (ошибка) |
PROCEDURE SetSize(Font: TFont; font_size: INTEGER): BOOLEAN |
установить размер шрифта |
Font указатель на шрифт |
font_size размер шрифта |
рез-т: TRUE/FALSE (ошибка) |
PROCEDURE Enabled(Font: TFont; font_size: INTEGER): BOOLEAN |
проверить, есть ли шрифт, заданного размера |
Font указатель на шрифт |
font_size размер шрифта |
рез-т: TRUE/FALSE (шрифта нет) |
PROCEDURE Destroy(VAR Font: TFont) |
выгрузить шрифт, освободить динамическую память |
Font указатель на шрифт |
Присваивает переменной Font значение NIL |
PROCEDURE TextHeight(Font: TFont): INTEGER |
получить высоту строки текста |
Font указатель на шрифт |
рез-т: высота строки текста в пикселях |
PROCEDURE TextWidth(Font: TFont; |
str, length, params: INTEGER): INTEGER |
получить ширину строки текста |
Font указатель на шрифт |
str адрес строки текста в кодировке Win-1251 |
length количество символов в строке или -1, если строка |
завершается нулем |
params параметры-флаги см. ниже |
рез-т: ширина строки текста в пикселях |
PROCEDURE TextOut(Font: TFont; |
canvas, x, y, str, length, color, params: INTEGER) |
вывести текст в буфер |
для вывода буфера в окно, использовать ф.65 или |
ф.7 (если буфер 24-битный) |
Font указатель на шрифт |
canvas адрес графического буфера |
структура буфера: |
Xsize dd |
Ysize dd |
picture rb Xsize * Ysize * 4 (32 бита) |
или Xsize * Ysize * 3 (24 бита) |
x, y координаты текста относительно левого верхнего |
угла буфера |
str адрес строки текста в кодировке Win-1251 |
length количество символов в строке или -1, если строка |
завершается нулем |
color цвет текста 0x00RRGGBB |
params параметры-флаги: |
1 жирный |
2 курсив |
4 подчеркнутый |
8 перечеркнутый |
16 применить сглаживание |
32 вывод в 32-битный буфер |
возможно использование флагов в любых сочетаниях |
------------------------------------------------------------------------------ |
MODULE RasterWorks - обертка библиотеки Rasterworks.obj |
------------------------------------------------------------------------------ |
MODULE libimg - обертка библиотеки libimg.obj |
------------------------------------------------------------------------------ |
/programs/develop/oberon07/doc/MSP430.txt |
---|
0,0 → 1,520 |
Компилятор языка программирования Oberon-07/16 для |
микроконтроллеров MSP430x{1,2}xx. |
------------------------------------------------------------------------------ |
Параметры командной строки |
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или |
UTF-8 с BOM-сигнатурой. |
Выход - hex-файл прошивки. |
Параметры: |
1) имя главного модуля |
2) "msp430" |
3) необязательные параметры-ключи |
-out <file_name> имя результирующего файла; по умолчанию, |
совпадает с именем главного модуля, но с расширением ".hex" |
-ram <size> размер ОЗУ в байтах (128 - 2048) по умолчанию 128 |
-rom <size> размер ПЗУ в байтах (2048 - 24576) по умолчанию 2048 |
-nochk <"ptibcwra"> отключить проверки при выполнении |
-lower разрешить ключевые слова и встроенные идентификаторы в |
нижнем регистре |
-def <имя> задать символ условной компиляции |
параметр -nochk задается в виде строки из символов: |
"p" - указатели |
"t" - типы |
"i" - индексы |
"b" - неявное приведение INTEGER к BYTE |
"c" - диапазон аргумента функции CHR |
"a" - все проверки |
Порядок символов может быть любым. Наличие в строке того или иного |
символа отключает соответствующую проверку. |
Например: -nochk it - отключить проверку индексов и охрану типа. |
-nochk a - отключить все отключаемые проверки. |
Например: |
Compiler.exe "C:\example.ob07" msp430 -ram 128 -rom 4096 -nochk pti |
Compiler.exe "C:\example.ob07" msp430 -out "C:\Ex1.hex" -ram 512 -rom 16384 |
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1. |
При работе компилятора в KolibriOS, код завершения не передается. |
------------------------------------------------------------------------------ |
Отличия от оригинала |
1. Расширен псевдомодуль SYSTEM |
2. В идентификаторах допускается символ "_" |
3. Усовершенствован оператор CASE (добавлены константные выражения в |
метках вариантов и необязательная ветка ELSE) |
4. Расширен набор стандартных процедур |
5. Семантика охраны/проверки типа уточнена для нулевого указателя |
6. Добавлены однострочные комментарии (начинаются с пары символов "//") |
7. Разрешено наследование от типа-указателя |
8. "Строки" можно заключать также в одиночные кавычки: 'строка' |
9. Добавлена операция конкатенации строковых и символьных констант |
10. Добавлены кодовые процедуры |
11. Не реализована вещественная арифметика |
------------------------------------------------------------------------------ |
Особенности реализации |
1. Основные типы |
Тип Диапазон значений Размер, байт |
INTEGER -32768 .. 32767 2 |
CHAR символ ASCII (0X .. 0FFX) 1 |
BOOLEAN FALSE, TRUE 1 |
SET множество из целых чисел {0 .. 15} 2 |
BYTE 0 .. 255 1 |
2. Максимальная длина идентификаторов - 1024 символов |
3. Максимальная длина строковых констант - 1024 символов (UTF-8) |
4. Максимальная размерность открытых массивов - 5 |
5. Процедура NEW заполняет нулями выделенный блок памяти |
6. Локальные переменные инициализируются нулями |
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая |
модульность отсутствуют |
8. Тип BYTE в выражениях всегда приводится к INTEGER |
9. Контроль переполнения значений выражений не производится |
10. Ошибки времени выполнения: |
номер ошибка |
1 ASSERT(x), при x = FALSE |
2 разыменование нулевого указателя |
3 целочисленное деление на неположительное число |
4 вызов процедуры через процедурную переменную с нулевым значением |
5 ошибка охраны типа |
6 нарушение границ массива |
7 непредусмотренное значение выражения в операторе CASE |
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x) |
9 CHR(x), если (x < 0) OR (x > 255) |
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255) |
------------------------------------------------------------------------------ |
Псевдомодуль SYSTEM |
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры, |
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к |
повреждению данных времени выполнения и аварийному завершению программы. |
PROCEDURE ADR(v: любой тип): INTEGER |
v - переменная или процедура; |
возвращает адрес v |
PROCEDURE SADR(x: строковая константа): INTEGER |
возвращает адрес x |
PROCEDURE SIZE(T): INTEGER |
возвращает размер типа T |
PROCEDURE TYPEID(T): INTEGER |
T - тип-запись или тип-указатель, |
возвращает номер типа в таблице типов-записей |
PROCEDURE MOVE(Source, Dest, n: INTEGER) |
Копирует n байт памяти из Source в Dest, |
области Source и Dest не могут перекрываться |
PROCEDURE GET(a: INTEGER; |
VAR v: любой основной тип, PROCEDURE, POINTER) |
v := Память[a] |
PROCEDURE GET8(a: INTEGER; VAR x: INTEGER, SET, BYTE, CHAR) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1) |
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER) |
Память[a] := x; |
Если x: BYTE, то значение x будет расширено до 16 бит, |
для записи байтов использовать SYSTEM.PUT8 |
PROCEDURE PUT8(a: INTEGER; x: INTEGER, SET, BYTE, CHAR) |
Память[a] := младшие 8 бит (x) |
PROCEDURE CODE(word1, word2,... : INTEGER) |
Вставка машинного кода, |
word1, word2 ... - целочисленные константы (константные |
выражения) - машинные слова, например: |
SYSTEM.CODE(0D032H, 0010H) (* BIS #16, SR; CPUOFF *) |
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях. |
------------------------------------------------------------------------------ |
Оператор CASE |
Синтаксис оператора CASE: |
CaseStatement = |
CASE Expression OF Сase {"|" Сase} |
[ELSE StatementSequence] END. |
Case = [CaseLabelList ":" StatementSequence]. |
CaseLabelList = CaseLabels {"," CaseLabels}. |
CaseLabels = ConstExpression [".." ConstExpression]. |
Например: |
CASE x OF |
|-1: DoSomething1 |
| 1: DoSomething2 |
| 0: DoSomething3 |
ELSE |
DoSomething4 |
END |
В метках вариантов можно использовать константные выражения, ветка ELSE |
необязательна. Если значение x не соответствует ни одному варианту и ELSE |
отсутствует, то программа прерывается с ошибкой времени выполнения. |
------------------------------------------------------------------------------ |
Конкатенация строковых и символьных констант |
Допускается конкатенация ("+") константных строк и символов типа CHAR: |
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *) |
newline = 0DX + 0AX; |
------------------------------------------------------------------------------ |
Проверка и охрана типа нулевого указателя |
Оригинальное сообщение о языке не определяет поведение программы при |
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих |
Oberon-реализациях выполнение такой операции приводит к ошибке времени |
выполнения. В данной реализации охрана типа нулевого указателя не приводит к |
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет |
значительно сократить частоту применения охраны типа. |
------------------------------------------------------------------------------ |
Дополнительные стандартные процедуры |
COPY (x: ARRAY OF CHAR; VAR v: ARRAY OF CHAR); |
v := x; |
Если LEN(v) < LEN(x), то строка x будет скопирована |
не полностью. |
LSR (x, n: INTEGER): INTEGER |
Логический сдвиг x на n бит вправо. |
MIN (a, b: INTEGER): INTEGER |
Минимум из двух значений. |
MAX (a, b: INTEGER): INTEGER |
Максимум из двух значений. |
BITS (x: INTEGER): SET |
Интерпретирует x как значение типа SET. |
Выполняется на этапе компиляции. |
LENGTH (s: ARRAY OF CHAR): INTEGER |
Длина 0X-завершенной строки s, без учета символа 0X. |
Если символ 0X отсутствует, функция возвращает длину |
массива s. s не может быть константой. |
------------------------------------------------------------------------------ |
Использование регистров общего назначения R4 - R15 |
R4 - R7: регистровый стэк (промежуточные значения выражений) |
R8 - R13: не используются |
R14: указатель кучи |
R15: используется при обработке прерываний |
------------------------------------------------------------------------------ |
Вызов процедур и кадр стэка |
Правила вызова похожи на соглашение cdecl (x86): |
- параметры передаются через стэк справа налево |
- результат, если есть, передается через регистр R4 |
- вызывающая процедура очищает стэк |
Состояние стэка при выполнении процедуры: |
меньшие адреса <- |var3|var2|var1|PC|arg1|arg2|arg3| -> бОльшие адреса |
PC - значение регистра PC перед вызовом (адрес возврата) |
argX - параметры в порядке объявления (слева направо) |
varX - локальные переменные в порядке использования в процедуре |
Размер каждого элемента в стэке (кроме локальных переменных структурных |
типов) - 1 машинное слово (2 байта). Структурные переменные (массивы и |
записи) занимают место в стэке в соответствии с их размером (с учетом |
выравнивания). |
Размещение локальных переменных зависит от их размеров и порядка |
использования, и в общем случае неопределенно. Если переменная не |
используется явно, то компилятор не выделяет для нее место в стэке. |
------------------------------------------------------------------------------ |
Скрытые параметры процедур |
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке |
формальных параметров, но учитываются компилятором при трансляции вызовов. |
Это возможно в следующих случаях: |
1. Процедура имеет формальный параметр открытый массив: |
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL); |
Вызов транслируется так: |
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x)) |
2. Процедура имеет формальный параметр-переменную типа RECORD: |
PROCEDURE Proc (VAR x: Rec); |
Вызов транслируется так: |
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x)) |
------------------------------------------------------------------------------ |
Кодовые процедуры |
Компилятор поддерживает процедуры, написаные в машинных кодах. |
Синтаксис: |
PROCEDURE "[code]" имя [ (параметры): ТипРезультата ] |
МашСлово, МашСлово,... МашСлово; |
";" после заголовка и END "имя" в конце процедуры не ставятся. |
МашСлово - целочисленная константа (в том числе и константное выражение). |
Например: |
PROCEDURE [code] asr (n, x: INTEGER): INTEGER (* ASR(x, n) -> R4 *) |
4115H, 2, (* MOV 2(SP), R5; R5 <- n *) |
4114H, 4, (* MOV 4(SP), R4; R4 <- x *) |
0F035H, 15, (* AND #15, R5 *) |
2400H + 3, (* JZ L1 *) |
(* L2: *) |
1104H, (* RRA R4 *) |
8315H, (* SUB #1, R5 *) |
2000H + 400H - 3; (* JNZ L2 *) |
(* L1: *) |
Компилятор автоматически добавляет к такой процедуре команду RET. |
Способ передачи параметров и результата не изменяется. |
Кодовые процедуры можно использовать также и для добавления в программу |
константных данных: |
PROCEDURE [code] sqr |
0, 1, 4, 9, 16, 25, 36, 49, 64, 81; |
Получить адрес такой "процедуры": SYSTEM.ADR(sqr). |
Получить адрес n-го машинного слова: SYSTEM.ADR(sqr) + n * 2. |
Чтобы использовать кодовые процедуры, необходимо импортировать псевдомодуль |
SYSTEM. |
------------------------------------------------------------------------------ |
Обработка прерываний |
При появлении запроса на прерывание, процессор: |
- помещает в стэк значение регистра PC |
- помещает в стэк значение регистра SR |
- очищает регистр SR |
- выполняет переход по адресу IV[priority], где |
IV - таблица векторов прерываний, |
priority - приоритет прерывания (номер элемента в таблице IV) (0..30) |
Компилятор генерирует код обработки прерываний: |
; IV[0] = адрес следующей команды |
PUSH #0 ; поместить в стэк приоритет прерывания |
JMP Label ; перейти к обработчику |
; IV[1] = адрес следующей команды |
PUSH #1 ; поместить в стэк приоритет прерывания |
JMP Label ; перейти к обработчику |
... |
; IV[priority] = адрес следующей команды |
PUSH #priority ; поместить в стэк приоритет прерывания |
JMP Label ; перейти к обработчику |
... |
; IV[30] = адрес следующей команды |
PUSH #30 ; поместить в стэк приоритет прерывания |
Label: |
MOV SP, R15 ; настроить R15 на структуру данных прерывания (см. далее) |
PUSH R4 ; сохранить рабочие регистры (R4 - R7) |
... |
PUSH R7 |
PUSH R15 ; передать параметр interrupt в обработчик (см. далее) |
PUSH @R15 ; передать параметр priority в обработчик (см. далее) |
CALL int ; вызвать обработчик (см. далее) |
ADD #4, SP ; удалить из стэка параметры обработчика |
POP R7 ; восстановить рабочие регистры (R7 - R4) |
... |
POP R4 |
ADD #2, SP ; удалить из стэка значение priority |
RETI ; возврат из прерывания (восстановить SR и PC) |
------------------------------------------------------------------------------ |
Обработка ошибок |
В случае возникновения ошибки при выполнении программы, будет вызван общий |
обработчик ошибок, который: |
- запрещает прерывания |
- сбрасывает стэк (во избежание переполнения в процессе обработки ошибки) |
- передает параметры в пользовательский обработчик (см. далее) |
- вызывает пользовательский обработчик (если он назначен) |
- повторно запрещает прерывания |
- выключает CPU и все тактовые сигналы |
Если выключать CPU не требуется, то пользовательский обработчик может, |
например, перезапустить программу. |
------------------------------------------------------------------------------ |
Инициализация и финализация программы |
В начало программы компилятор вставляет код, который: |
- инициализирует регистры SP и R14 |
- выключает сторожевой таймер |
- назначает пустой обработчик прерываний |
- сбрасывает обработчик ошибок |
В конец программы добавляет команду |
BIS #16, SR; выключить CPU |
------------------------------------------------------------------------------ |
Структура ОЗУ (RAM) |
начало -> | спец. переменные | глобальные переменные | куча/стэк | <- конец |
Компилятор поддерживает размер ОЗУ 128..2048 байт. В нижних адресах |
располагаются специальные переменные, и далее пользовательские глобальные |
переменные. Оставшаяся часть памяти отводится для кучи и стэка (не менее 64 |
байта). При старте программы, в регистр R14 записывается адрес начала области |
кучи/стэка, а регистр SP настраивается на конец ОЗУ (начало_ОЗУ + размер_ОЗУ). |
При выделении памяти процедурой NEW, значение регистра R14 увеличивается (если |
есть свободная память). Таким образом, стэк и куча растут навстречу друг |
другу. Проверка переполнения стэка не производится. |
------------------------------------------------------------------------------ |
Структура ПЗУ (RОM) |
начало -> |код|свободная область|спец. данные|векторы прерываний| <- конец |
Компилятор поддерживает размер ПЗУ 2048..24576 байт. В верхних адресах |
располагается таблица векторов прерываний (64 байта), адреса 0FFC0H..0FFFFH. |
Непосредственно перед ней размещаются специальные данные. Программный |
код начинается с адреса (10000H - размер_ПЗУ), этот адрес является также и |
точкой входа в программу. Между кодом и спец. данными может оставаться |
свободное пространство. Если размер ПЗУ больше, чем указан при компиляции, |
то перед кодом будет свободная область. Таким способом можно зарезервировать |
нижние сегменты флэш-памяти для записи во время выполнения программы. |
============================================================================== |
MODULE MSP430 |
CONST |
биты регистра SR: |
GIE = {3} |
CPUOFF = {4} |
OSCOFF = {5} |
SCG0 = {6} |
SCG1 = {7} |
TYPE |
TInterrupt = RECORD priority: INTEGER; sr: SET; pc: INTEGER END |
структура данных прерывания |
priority - приоритет прерывания: |
адрес приоритет |
0FFFEH 31 |
0FFFCH 30 |
0FFFAH 29 |
... |
0FFC0H 0 |
sr - сохраненное значение регистра SR |
pc - сохраненное значение регистра PC |
TTrapProc = PROCEDURE (modNum, modName, err, line: INTEGER); |
Процедура-обработчик ошибок. |
modNum - номер модуля (в отчете о компиляции: |
compiling (modNum) "modName" ) |
modName - адрес имени модуля |
err - номер ошибки |
line - номер строки |
TIntProc = PROCEDURE (priority: INTEGER; interrupt: TInterrupt) |
Процедура-обработчик прерываний. |
priority - приоритет прерывания |
interrupt - структура данных прерывания |
PROCEDURE SetTrapProc (TrapProc: TTrapProc) |
Назначить обработчик ошибок. |
PROCEDURE SetIntProc (IntProc: TIntProc) |
Назначить обработчик прерываний. |
Нельзя вызывать эту процедуру с параметром NIL, т. к. для экономии |
тактов, значение адреса обработчика прерываний не проверяется на NIL. |
PROCEDURE Restart |
Перезапустить программу. |
При этом: очищается регистр SR, повторно выполняется код инициализации |
программы (см. выше). Всё прочее состояние ОЗУ и регистров устройств |
сохраняется. |
PROCEDURE SetIntPC (interrupt: TInterrupt; NewPC: INTEGER) |
interrupt.pc := NewPC |
После возврата из прерывания, регистр PC получит значение NewPC. |
PROCEDURE SetIntSR (interrupt: TInterrupt; NewSR: SET) |
interrupt.sr := NewSR |
После возврата из прерывания, регистр SR получит значение NewSR. |
PROCEDURE DInt |
Запретить прерывания. |
PROCEDURE EInt |
Разрешить прерывания. |
PROCEDURE CpuOff |
Выключить CPU (установить бит CPUOFF регистра SR). |
PROCEDURE Halt |
Запретить прерывания, выключить CPU и все тактовые сигналы. |
PROCEDURE SetSR (bits: SET) |
Установить биты bits регистра SR. |
PROCEDURE ClrSR (bits: SET) |
Сбросить биты bits регистра SR. |
PROCEDURE GetFreeFlash (VAR address, size: INTEGER) |
Получить адрес и размер свободной области Flash/ROM |
(между кодом и данными). |
PROCEDURE Delay (n: INTEGER) |
Задержка выполнения программы на 1000*n тактов, |
но не менее чем на 2000 тактов. |
============================================================================== |
/programs/develop/oberon07/doc/Oberon07.Report_2016_05_03.pdf |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/develop/oberon07/doc/STM32.txt |
---|
0,0 → 1,404 |
Компилятор языка программирования Oberon-07/16 для |
микроконтроллеров STM32 Cortex-M3. |
------------------------------------------------------------------------------ |
Параметры командной строки |
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или |
UTF-8 с BOM-сигнатурой. |
Выход - hex-файл прошивки. |
Параметры: |
1) имя главного модуля |
2) "stm32cm3" |
3) необязательные параметры-ключи |
-out <file_name> имя результирующего файла; по умолчанию, |
совпадает с именем главного модуля, но с расширением ".hex" |
-ram <size> размер ОЗУ в килобайтах (4 - 65536) по умолчанию 4 |
-rom <size> размер ПЗУ в килобайтах (16 - 65536) по умолчанию 16 |
-nochk <"ptibcwra"> отключить проверки при выполнении |
-lower разрешить ключевые слова и встроенные идентификаторы в |
нижнем регистре |
-def <имя> задать символ условной компиляции |
параметр -nochk задается в виде строки из символов: |
"p" - указатели |
"t" - типы |
"i" - индексы |
"b" - неявное приведение INTEGER к BYTE |
"c" - диапазон аргумента функции CHR |
"w" - диапазон аргумента функции WCHR |
"r" - эквивалентно "bcw" |
"a" - все проверки |
Порядок символов может быть любым. Наличие в строке того или иного |
символа отключает соответствующую проверку. |
Например: -nochk it - отключить проверку индексов и охрану типа. |
-nochk a - отключить все отключаемые проверки. |
Например: |
Compiler.exe "C:\example.ob07" stm32cm3 -ram 32 -rom 256 -nochk pti |
Compiler.exe "C:\example.ob07" stm32cm3 -out "C:\Ex1.hex" -ram 8 -rom 32 |
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1. |
При работе компилятора в KolibriOS, код завершения не передается. |
------------------------------------------------------------------------------ |
Отличия от оригинала |
1. Расширен псевдомодуль SYSTEM |
2. В идентификаторах допускается символ "_" |
3. Усовершенствован оператор CASE (добавлены константные выражения в |
метках вариантов и необязательная ветка ELSE) |
4. Расширен набор стандартных процедур |
5. Семантика охраны/проверки типа уточнена для нулевого указателя |
6. Добавлены однострочные комментарии (начинаются с пары символов "//") |
7. Разрешено наследование от типа-указателя |
8. "Строки" можно заключать также в одиночные кавычки: 'строка' |
9. Добавлен тип WCHAR |
10. Добавлена операция конкатенации строковых и символьных констант |
11. Добавлены кодовые процедуры |
------------------------------------------------------------------------------ |
Особенности реализации |
1. Основные типы |
Тип Диапазон значений Размер, байт |
INTEGER -2147483648 .. 2147483647 4 |
REAL 1.17E-38 .. 3.40E+38 4 |
CHAR символ ASCII (0X .. 0FFX) 1 |
BOOLEAN FALSE, TRUE 1 |
SET множество из целых чисел {0 .. 31} 4 |
BYTE 0 .. 255 1 |
WCHAR символ юникода (0X .. 0FFFFX) 2 |
2. Максимальная длина идентификаторов - 1024 символов |
3. Максимальная длина строковых констант - 1024 символов (UTF-8) |
4. Максимальная размерность открытых массивов - 5 |
5. Процедура NEW заполняет нулями выделенный блок памяти |
6. Локальные переменные инициализируются нулями |
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая |
модульность отсутствуют |
8. Тип BYTE в выражениях всегда приводится к INTEGER |
9. Контроль переполнения значений выражений не производится |
------------------------------------------------------------------------------ |
Псевдомодуль SYSTEM |
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры, |
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к |
повреждению данных времени выполнения и аварийному завершению программы. |
PROCEDURE ADR(v: любой тип): INTEGER |
v - переменная или процедура; |
возвращает адрес v |
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER |
возвращает адрес x |
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER |
возвращает адрес x |
PROCEDURE SIZE(T): INTEGER |
возвращает размер типа T |
PROCEDURE TYPEID(T): INTEGER |
T - тип-запись или тип-указатель, |
возвращает номер типа в таблице типов-записей |
PROCEDURE INF(): REAL |
возвращает специальное вещественное значение "бесконечность" |
PROCEDURE MOVE(Source, Dest, n: INTEGER) |
Копирует n байт памяти из Source в Dest, |
области Source и Dest не могут перекрываться |
PROCEDURE GET(a: INTEGER; |
VAR v: любой основной тип, PROCEDURE, POINTER) |
v := Память[a] |
PROCEDURE GET8(a: INTEGER; |
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1) |
PROCEDURE GET16(a: INTEGER; |
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2) |
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4) |
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER) |
Память[a] := x; |
Если x: BYTE или x: WCHAR, то значение x будет расширено |
до 32 бит, для записи байтов использовать SYSTEM.PUT8, |
для WCHAR -- SYSTEM.PUT16 |
PROCEDURE PUT8(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 8 бит (x) |
PROCEDURE PUT16(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 16 бит (x) |
PROCEDURE PUT32(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 32 бит (x) |
PROCEDURE CODE(hword1, hword2,... : INTEGER) |
Вставка машинного кода, |
hword1, hword2 ... - константы в диапазоне 0..65535, |
например: |
SYSTEM.CODE(0BF30H) (* wfi *) |
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не |
допускаются никакие явные операции, за исключением присваивания. |
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях. |
------------------------------------------------------------------------------ |
Оператор CASE |
Синтаксис оператора CASE: |
CaseStatement = |
CASE Expression OF Сase {"|" Сase} |
[ELSE StatementSequence] END. |
Case = [CaseLabelList ":" StatementSequence]. |
CaseLabelList = CaseLabels {"," CaseLabels}. |
CaseLabels = ConstExpression [".." ConstExpression]. |
Например: |
CASE x OF |
|-1: DoSomething1 |
| 1: DoSomething2 |
| 0: DoSomething3 |
ELSE |
DoSomething4 |
END |
В метках вариантов можно использовать константные выражения, ветка ELSE |
необязательна. Если значение x не соответствует ни одному варианту и ELSE |
отсутствует, то программа прерывается с ошибкой времени выполнения. |
------------------------------------------------------------------------------ |
Тип WCHAR |
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и |
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и |
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает |
только тип CHAR. Для получения значения типа WCHAR, следует использовать |
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять |
исходный код в кодировке UTF-8 c BOM. |
------------------------------------------------------------------------------ |
Конкатенация строковых и символьных констант |
Допускается конкатенация ("+") константных строк и символов типа CHAR: |
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *) |
newline = 0DX + 0AX; |
------------------------------------------------------------------------------ |
Проверка и охрана типа нулевого указателя |
Оригинальное сообщение о языке не определяет поведение программы при |
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих |
Oberon-реализациях выполнение такой операции приводит к ошибке времени |
выполнения. В данной реализации охрана типа нулевого указателя не приводит к |
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет |
значительно сократить частоту применения охраны типа. |
------------------------------------------------------------------------------ |
Дополнительные стандартные процедуры |
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR); |
v := x; |
Если LEN(v) < LEN(x), то строка x будет скопирована |
не полностью |
LSR (x, n: INTEGER): INTEGER |
Логический сдвиг x на n бит вправо. |
MIN (a, b: INTEGER): INTEGER |
Минимум из двух значений. |
MAX (a, b: INTEGER): INTEGER |
Максимум из двух значений. |
BITS (x: INTEGER): SET |
Интерпретирует x как значение типа SET. |
Выполняется на этапе компиляции. |
LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER |
Длина 0X-завершенной строки s, без учета символа 0X. |
Если символ 0X отсутствует, функция возвращает длину |
массива s. s не может быть константой. |
WCHR (n: INTEGER): WCHAR |
Преобразование типа, аналогично CHR(n: INTEGER): CHAR |
------------------------------------------------------------------------------ |
Использование регистров общего назначения R0 - R12 |
R0 - R3: регистровый стэк (промежуточные значения выражений) |
R4 - R12: не используются |
------------------------------------------------------------------------------ |
Вызов процедур и кадр стэка |
Правила вызова похожи на соглашение cdecl (x86): |
- параметры передаются через стэк справа налево |
- результат, если есть, передается через регистр R0 |
- вызывающая процедура очищает стэк |
Состояние стэка при выполнении процедуры: |
меньшие адреса <- |var3|var2|var1|LR|arg1|arg2|arg3| -> бОльшие адреса |
LR - сохраненный регистр LR (адрес возврата) |
argX - параметры в порядке объявления (слева направо) |
varX - локальные переменные в порядке использования в процедуре |
Размер каждого элемента в стэке (кроме локальных переменных структурных |
типов) - 1 машинное слово (4 байта). Структурные переменные (массивы и |
записи) занимают место в стэке в соответствии с их размером (с учетом |
выравнивания). |
Размещение локальных переменных зависит от их размеров и порядка |
использования, и в общем случае неопределенно. Если переменная не |
используется явно, то компилятор не выделяет для нее место в стэке. |
------------------------------------------------------------------------------ |
Скрытые параметры процедур |
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке |
формальных параметров, но учитываются компилятором при трансляции вызовов. |
Это возможно в следующих случаях: |
1. Процедура имеет формальный параметр открытый массив: |
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL); |
Вызов транслируется так: |
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x)) |
2. Процедура имеет формальный параметр-переменную типа RECORD: |
PROCEDURE Proc (VAR x: Rec); |
Вызов транслируется так: |
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x)) |
------------------------------------------------------------------------------ |
Кодовые процедуры |
Компилятор поддерживает процедуры, написаные в машинных кодах. |
Синтаксис: |
PROCEDURE "[code]" имя [ (параметры): ТипРезультата ] |
МашКом, МашКом,... МашКом; |
";" после заголовка и END "имя" в конце процедуры не ставятся. |
МашКом - целочисленная константа [0..65535] (в том числе и константное |
выражение). |
Например: |
PROCEDURE [code] WFI |
0BF30H; (* wfi *) |
Компилятор автоматически добавляет к такой процедуре команду возврата |
(bx LR). Способ передачи параметров и результата не изменяется. Регистр LR, |
при входе в процедуру не сохраняется. |
Чтобы использовать кодовые процедуры, необходимо импортировать псевдомодуль |
SYSTEM. |
------------------------------------------------------------------------------ |
Обработка прерываний |
При возникновении прерывания, будет вызван обработчик (если он объявлен). |
Объявление обработчика: |
PROCEDURE handler_name [iv]; (* процедура без параметров *) |
iv - целочисленная константа (константное выражение), номер вектора прерывания |
в таблице векторов, iv >= 2: |
0 начальное значение SP |
1 сброс |
... |
15 SysTick |
... |
59 TIM6 |
60 TIM7 |
... |
например: |
(* обработчик прерываний от TIM6 *) |
PROCEDURE tim6 [59]; |
BEGIN |
(* код обработки *) |
END tim6; |
Также, можно объявить общий обработчик (iv = 0), который будет вызван, если |
не назначен индивидуальный. Общий обработчик получает параметр - номер вектора |
прерывания. По значению этого параметра, обработчик должен определить источник |
прерывания и выполнить соответствующие действия: |
PROCEDURE handler (iv: INTEGER) [0]; |
BEGIN |
IF iv = 59 THEN |
(* TIM6 *) |
ELSIF iv = 60 THEN |
(* TIM7 *) |
ELSIF .... |
.... |
END |
END handler; |
В конец программы компилятор добавляет команду ожидания прерывания. |
------------------------------------------------------------------------------ |
Обработка ошибок |
В случае возникновения ошибки при выполнении программы, будет вызван |
пользовательский обработчик (если он объявлен). |
Объявление обработчика ошибок: |
PROCEDURE trap (modNum, modName, err, line: INTEGER) [1]; |
BEGIN |
END trap; |
где, |
modNum - номер модуля (в отчете о компиляции: |
compiling (modNum) "modName" ) |
modName - адрес имени модуля |
err - код ошибки |
line - номер строки |
Коды ошибок: |
1 ASSERT(x), при x = FALSE |
2 разыменование нулевого указателя |
3 целочисленное деление на неположительное число |
4 вызов процедуры через процедурную переменную с нулевым значением |
5 ошибка охраны типа |
6 нарушение границ массива |
7 непредусмотренное значение выражения в операторе CASE |
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x) |
9 CHR(x), если (x < 0) OR (x > 255) |
10 WCHR(x), если (x < 0) OR (x > 65535) |
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255) |
После возврата из обработчика программа будет перезапущена. |
------------------------------------------------------------------------------ |
/programs/develop/oberon07/doc/WinLib.txt |
---|
0,0 → 1,312 |
============================================================================== |
Библиотека (Windows) |
------------------------------------------------------------------------------ |
MODULE Out - консольный вывод |
PROCEDURE Open |
открывает консольный вывод |
PROCEDURE Int(x, width: INTEGER) |
вывод целого числа x; |
width - количество знакомест, используемых для вывода |
PROCEDURE Real(x: REAL; width: INTEGER) |
вывод вещественного числа x в плавающем формате; |
width - количество знакомест, используемых для вывода |
PROCEDURE Char(x: CHAR) |
вывод символа x |
PROCEDURE FixReal(x: REAL; width, p: INTEGER) |
вывод вещественного числа x в фиксированном формате; |
width - количество знакомест, используемых для вывода; |
p - количество знаков после десятичной точки |
PROCEDURE Ln |
переход на следующую строку |
PROCEDURE String(s: ARRAY OF CHAR) |
вывод строки s (ASCII) |
PROCEDURE StringW(s: ARRAY OF WCHAR) |
вывод строки s (UTF-16) |
------------------------------------------------------------------------------ |
MODULE In - консольный ввод |
VAR Done: BOOLEAN |
принимает значение TRUE в случае успешного выполнения |
операции ввода и FALSE в противном случае |
PROCEDURE Open |
открывает консольный ввод, |
также присваивает переменной Done значение TRUE |
PROCEDURE Int(VAR x: INTEGER) |
ввод числа типа INTEGER |
PROCEDURE Char(VAR x: CHAR) |
ввод символа |
PROCEDURE Real(VAR x: REAL) |
ввод числа типа REAL |
PROCEDURE String(VAR s: ARRAY OF CHAR) |
ввод строки |
PROCEDURE Ln |
ожидание нажатия ENTER |
------------------------------------------------------------------------------ |
MODULE Console - дополнительные процедуры консольного вывода |
CONST |
Следующие константы определяют цвет консольного вывода |
Black = 0 Blue = 1 Green = 2 |
Cyan = 3 Red = 4 Magenta = 5 |
Brown = 6 LightGray = 7 DarkGray = 8 |
LightBlue = 9 LightGreen = 10 LightCyan = 11 |
LightRed = 12 LightMagenta = 13 Yellow = 14 |
White = 15 |
PROCEDURE Cls |
очистка окна консоли |
PROCEDURE SetColor(FColor, BColor: INTEGER) |
установка цвета консольного вывода: FColor - цвет текста, |
BColor - цвет фона, возможные значения - вышеперечисленные |
константы |
PROCEDURE SetCursor(x, y: INTEGER) |
установка курсора консоли в позицию (x, y) |
PROCEDURE GetCursor(VAR x, y: INTEGER) |
записывает в параметры текущие координаты курсора консоли |
PROCEDURE GetCursorX(): INTEGER |
возвращает текущую x-координату курсора консоли |
PROCEDURE GetCursorY(): INTEGER |
возвращает текущую y-координату курсора консоли |
------------------------------------------------------------------------------ |
MODULE Math - математические функции |
CONST |
pi = 3.141592653589793E+00 |
e = 2.718281828459045E+00 |
PROCEDURE IsNan(x: REAL): BOOLEAN |
возвращает TRUE, если x - не число |
PROCEDURE IsInf(x: REAL): BOOLEAN |
возвращает TRUE, если x - бесконечность |
PROCEDURE sqrt(x: REAL): REAL |
квадратный корень x |
PROCEDURE exp(x: REAL): REAL |
экспонента x |
PROCEDURE ln(x: REAL): REAL |
натуральный логарифм x |
PROCEDURE sin(x: REAL): REAL |
синус x |
PROCEDURE cos(x: REAL): REAL |
косинус x |
PROCEDURE tan(x: REAL): REAL |
тангенс x |
PROCEDURE arcsin(x: REAL): REAL |
арксинус x |
PROCEDURE arccos(x: REAL): REAL |
арккосинус x |
PROCEDURE arctan(x: REAL): REAL |
арктангенс x |
PROCEDURE arctan2(y, x: REAL): REAL |
арктангенс y/x |
PROCEDURE power(base, exponent: REAL): REAL |
возведение числа base в степень exponent |
PROCEDURE log(base, x: REAL): REAL |
логарифм x по основанию base |
PROCEDURE sinh(x: REAL): REAL |
гиперболический синус x |
PROCEDURE cosh(x: REAL): REAL |
гиперболический косинус x |
PROCEDURE tanh(x: REAL): REAL |
гиперболический тангенс x |
PROCEDURE arsinh(x: REAL): REAL |
обратный гиперболический синус x |
PROCEDURE arcosh(x: REAL): REAL |
обратный гиперболический косинус x |
PROCEDURE artanh(x: REAL): REAL |
обратный гиперболический тангенс x |
PROCEDURE round(x: REAL): REAL |
округление x до ближайшего целого |
PROCEDURE frac(x: REAL): REAL; |
дробная часть числа x |
PROCEDURE floor(x: REAL): REAL |
наибольшее целое число (представление как REAL), |
не больше x: floor(1.2) = 1.0 |
PROCEDURE ceil(x: REAL): REAL |
наименьшее целое число (представление как REAL), |
не меньше x: ceil(1.2) = 2.0 |
PROCEDURE sgn(x: REAL): INTEGER |
если x > 0 возвращает 1 |
если x < 0 возвращает -1 |
если x = 0 возвращает 0 |
PROCEDURE fact(n: INTEGER): REAL |
факториал n |
------------------------------------------------------------------------------ |
MODULE File - работа с файловой системой |
CONST |
OPEN_R = 0 |
OPEN_W = 1 |
OPEN_RW = 2 |
SEEK_BEG = 0 |
SEEK_CUR = 1 |
SEEK_END = 2 |
PROCEDURE Create(FName: ARRAY OF CHAR): INTEGER |
создает новый файл с именем FName (полное имя с путем), |
открывет файл для записи и возвращает идентификатор файла |
(целое число), в случае ошибки, возвращает -1 |
PROCEDURE Open(FName: ARRAY OF CHAR; Mode: INTEGER): INTEGER |
открывает существующий файл с именем FName (полное имя с |
путем) в режиме Mode = (OPEN_R (только чтение), OPEN_W |
(только запись), OPEN_RW (чтение и запись)), возвращает |
идентификатор файла (целое число), в случае ошибки, |
возвращает -1 |
PROCEDURE Read(F, Buffer, Count: INTEGER): INTEGER |
Читает данные из файла в память. F - числовой идентификатор |
файла, Buffer - адрес области памяти, Count - количество байт, |
которое требуется прочитать из файла; возвращает количество |
байт, которое было прочитано из файла |
PROCEDURE Write(F, Buffer, Count: INTEGER): INTEGER |
Записывает данные из памяти в файл. F - числовой идентификатор |
файла, Buffer - адрес области памяти, Count - количество байт, |
которое требуется записать в файл; возвращает количество байт, |
которое было записано в файл |
PROCEDURE Seek(F, Offset, Origin: INTEGER): INTEGER |
устанавливает позицию чтения-записи файла с идентификатором F |
на Offset, относительно Origin = (SEEK_BEG - начало файла, |
SEEK_CUR - текущая позиция, SEEK_END - конец файла), |
возвращает позицию относительно начала файла, например: |
Seek(F, 0, 2) - устанавливает позицию на конец файла и |
возвращает длину файла; при ошибке возвращает -1 |
PROCEDURE Close(F: INTEGER) |
закрывает ранее открытый файл с идентификатором F |
PROCEDURE Delete(FName: ARRAY OF CHAR): BOOLEAN |
удаляет файл с именем FName (полное имя с путем), |
возвращает TRUE, если файл успешно удален |
PROCEDURE Exists(FName: ARRAY OF CHAR): BOOLEAN |
возвращает TRUE, если файл с именем FName (полное имя) |
существует |
PROCEDURE Load(FName: ARRAY OF CHAR; VAR Size: INTEGER): INTEGER |
загружает в память существующий файл с именем FName (полное имя с |
путем), возвращает адрес памяти, куда был загружен файл, |
записывает размер файла в параметр Size; |
при ошибке возвращает 0 |
PROCEDURE CreateDir(DirName: ARRAY OF CHAR): BOOLEAN |
создает папку с именем DirName, все промежуточные папки |
должны существовать. В случае ошибки, возвращает FALSE |
PROCEDURE RemoveDir(DirName: ARRAY OF CHAR): BOOLEAN |
удаляет пустую папку с именем DirName. В случае ошибки, |
возвращает FALSE |
PROCEDURE ExistsDir(DirName: ARRAY OF CHAR): BOOLEAN |
возвращает TRUE, если папка с именем DirName существует |
------------------------------------------------------------------------------ |
MODULE DateTime - дата, время |
CONST ERR = -7.0E5 |
PROCEDURE Now(VAR Year, Month, Day, Hour, Min, Sec, MSec: INTEGER) |
возвращает в параметрах компоненты текущей системной даты и |
времени |
PROCEDURE NowEncode(): REAL; |
возвращает текущую системную дату и |
время (представление REAL) |
PROCEDURE Encode(Year, Month, Day, |
Hour, Min, Sec, MSec: INTEGER): REAL |
возвращает дату, полученную из компонентов |
Year, Month, Day, Hour, Min, Sec, MSec; |
при ошибке возвращает константу ERR = -7.0E5 |
PROCEDURE Decode(Date: REAL; VAR Year, Month, Day, |
Hour, Min, Sec, MSec: INTEGER): BOOLEAN |
извлекает компоненты |
Year, Month, Day, Hour, Min, Sec, MSec из даты Date; |
при ошибке возвращает FALSE |
------------------------------------------------------------------------------ |
MODULE Args - параметры программы |
VAR argc: INTEGER |
количество параметров программы, включая имя |
исполняемого файла |
PROCEDURE GetArg(n: INTEGER; VAR s: ARRAY OF CHAR) |
записывает в строку s n-й параметр программы, |
нумерация параметров от 0 до argc - 1, |
нулевой параметр -- имя исполняемого файла |
------------------------------------------------------------------------------ |
MODULE Utils - разное |
PROCEDURE Utf8To16(source: ARRAY OF CHAR; |
VAR dest: ARRAY OF CHAR): INTEGER; |
преобразует символы строки source из кодировки UTF-8 в |
кодировку UTF-16, результат записывает в строку dest, |
возвращает количество 16-битных символов, записанных в dest |
PROCEDURE PutSeed(seed: INTEGER) |
Инициализация генератора случайных чисел целым числом seed |
PROCEDURE Rnd(range: INTEGER): INTEGER |
Целые случайные числа в диапазоне 0 <= x < range |
------------------------------------------------------------------------------ |
MODULE WINAPI - привязки к некоторым API-функциям Windows |
/programs/develop/oberon07/doc/x86.txt |
---|
0,0 → 1,401 |
Компилятор языка программирования Oberon-07/16 для i486 |
Windows/Linux/KolibriOS. |
------------------------------------------------------------------------------ |
Параметры командной строки |
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или |
UTF-8 с BOM-сигнатурой. |
Выход - испоняемый файл формата PE32, ELF или MENUET01/MSCOFF. |
Параметры: |
1) имя главного модуля |
2) тип приложения |
"win32con" - Windows console |
"win32gui" - Windows GUI |
"win32dll" - Windows DLL |
"linux32exe" - Linux ELF-EXEC |
"linux32so" - Linux ELF-SO |
"kosexe" - KolibriOS |
"kosdll" - KolibriOS DLL |
3) необязательные параметры-ключи |
-out <file_name> имя результирующего файла; по умолчанию, |
совпадает с именем главного модуля, но с другим расширением |
(соответствует типу исполняемого файла) |
-stk <size> размер стэка в мегабайтах (по умолчанию 2 Мб, |
допустимо от 1 до 32 Мб) |
-nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже) |
-lower разрешить ключевые слова и встроенные идентификаторы в |
нижнем регистре |
-def <имя> задать символ условной компиляции |
-ver <major.minor> версия программы (только для kosdll) |
параметр -nochk задается в виде строки из символов: |
"p" - указатели |
"t" - типы |
"i" - индексы |
"b" - неявное приведение INTEGER к BYTE |
"c" - диапазон аргумента функции CHR |
"w" - диапазон аргумента функции WCHR |
"r" - эквивалентно "bcw" |
"a" - все проверки |
Порядок символов может быть любым. Наличие в строке того или иного |
символа отключает соответствующую проверку. |
Например: -nochk it - отключить проверку индексов и охрану типа. |
-nochk a - отключить все отключаемые проверки. |
Например: |
Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -stk 1 |
Compiler.exe "C:\example.ob07" win32dll -out "C:\example.dll" |
Compiler.exe "C:\example.ob07" win32gui -out "C:\example.exe" -stk 4 |
Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -nochk pti |
Compiler.kex "/tmp0/1/example.ob07" kosexe -out "/tmp0/1/example.kex" -stk 4 |
Compiler.kex "/tmp0/1/example.ob07" kosdll -out "/tmp0/1/mydll.obj" -ver 2.7 |
Compiler.exe "C:\example.ob07" linux32exe -out "C:\example" -stk 1 -nochk a |
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1. |
При работе компилятора в KolibriOS, код завершения не передается. |
------------------------------------------------------------------------------ |
Отличия от оригинала |
1. Расширен псевдомодуль SYSTEM |
2. В идентификаторах допускается символ "_" |
3. Добавлены системные флаги |
4. Усовершенствован оператор CASE (добавлены константные выражения в |
метках вариантов и необязательная ветка ELSE) |
5. Расширен набор стандартных процедур |
6. Семантика охраны/проверки типа уточнена для нулевого указателя |
7. Добавлены однострочные комментарии (начинаются с пары символов "//") |
8. Разрешено наследование от типа-указателя |
9. Добавлен синтаксис для импорта процедур из внешних библиотек |
10. "Строки" можно заключать также в одиночные кавычки: 'строка' |
11. Добавлен тип WCHAR |
12. Добавлена операция конкатенации строковых и символьных констант |
------------------------------------------------------------------------------ |
Особенности реализации |
1. Основные типы |
Тип Диапазон значений Размер, байт |
INTEGER -2147483648 .. 2147483647 4 |
REAL 4.94E-324 .. 1.70E+308 8 |
CHAR символ ASCII (0X .. 0FFX) 1 |
BOOLEAN FALSE, TRUE 1 |
SET множество из целых чисел {0 .. 31} 4 |
BYTE 0 .. 255 1 |
WCHAR символ юникода (0X .. 0FFFFX) 2 |
2. Максимальная длина идентификаторов - 1024 символов |
3. Максимальная длина строковых констант - 1024 символов (UTF-8) |
4. Максимальная размерность открытых массивов - 5 |
5. Процедура NEW заполняет нулями выделенный блок памяти |
6. Глобальные и локальные переменные инициализируются нулями |
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая |
модульность отсутствуют |
8. Тип BYTE в выражениях всегда приводится к INTEGER |
9. Контроль переполнения значений выражений не производится |
10. Ошибки времени выполнения: |
1 ASSERT(x), при x = FALSE |
2 разыменование нулевого указателя |
3 целочисленное деление на неположительное число |
4 вызов процедуры через процедурную переменную с нулевым значением |
5 ошибка охраны типа |
6 нарушение границ массива |
7 непредусмотренное значение выражения в операторе CASE |
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x) |
9 CHR(x), если (x < 0) OR (x > 255) |
10 WCHR(x), если (x < 0) OR (x > 65535) |
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255) |
------------------------------------------------------------------------------ |
Псевдомодуль SYSTEM |
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры, |
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к |
повреждению данных времени выполнения и аварийному завершению программы. |
PROCEDURE ADR(v: любой тип): INTEGER |
v - переменная или процедура; |
возвращает адрес v |
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER |
возвращает адрес x |
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER |
возвращает адрес x |
PROCEDURE SIZE(T): INTEGER |
возвращает размер типа T |
PROCEDURE TYPEID(T): INTEGER |
T - тип-запись или тип-указатель, |
возвращает номер типа в таблице типов-записей |
PROCEDURE INF(): REAL |
возвращает специальное вещественное значение "бесконечность" |
PROCEDURE MOVE(Source, Dest, n: INTEGER) |
Копирует n байт памяти из Source в Dest, |
области Source и Dest не могут перекрываться |
PROCEDURE GET(a: INTEGER; |
VAR v: любой основной тип, PROCEDURE, POINTER) |
v := Память[a] |
PROCEDURE GET8(a: INTEGER; |
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1) |
PROCEDURE GET16(a: INTEGER; |
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2) |
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4) |
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER) |
Память[a] := x; |
Если x: BYTE или x: WCHAR, то значение x будет расширено |
до 32 бит, для записи байтов использовать SYSTEM.PUT8, |
для WCHAR -- SYSTEM.PUT16 |
PROCEDURE PUT8(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 8 бит (x) |
PROCEDURE PUT16(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 16 бит (x) |
PROCEDURE PUT32(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 32 бит (x) |
PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER) |
Копирует n байт памяти из Source в Dest. |
Эквивалентно |
SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n) |
PROCEDURE CODE(byte1, byte2,... : INTEGER) |
Вставка машинного кода, |
byte1, byte2 ... - константы в диапазоне 0..255, |
например: |
SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *) |
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не |
допускаются никакие явные операции, за исключением присваивания. |
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях. |
------------------------------------------------------------------------------ |
Системные флаги |
При объявлении процедурных типов и глобальных процедур, после ключевого |
слова PROCEDURE может быть указан флаг соглашения о вызове: [stdcall], |
[ccall], [ccall16], [windows], [linux], [oberon]. Например: |
PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER; |
Если указан флаг [ccall16], то принимается соглашение ccall, но перед |
вызовом указатель стэка будет выравнен по границе 16 байт. |
Флаг [windows] - синоним для [stdcall], [linux] - синоним для [ccall16]. |
Знак "-" после имени флага ([stdcall-], [linux-], ...) означает, что |
результат процедуры можно игнорировать (не допускается для типа REAL). |
Если флаг не указан или указан флаг [oberon], то принимается внутреннее |
соглашение о вызове. |
При объявлении типов-записей, после ключевого слова RECORD может быть |
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей |
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть |
базовыми типами для других записей. |
Для использования системных флагов, требуется импортировать SYSTEM. |
------------------------------------------------------------------------------ |
Оператор CASE |
Синтаксис оператора CASE: |
CaseStatement = |
CASE Expression OF Сase {"|" Сase} |
[ELSE StatementSequence] END. |
Case = [CaseLabelList ":" StatementSequence]. |
CaseLabelList = CaseLabels {"," CaseLabels}. |
CaseLabels = ConstExpression [".." ConstExpression]. |
Например: |
CASE x OF |
|-1: DoSomething1 |
| 1: DoSomething2 |
| 0: DoSomething3 |
ELSE |
DoSomething4 |
END |
В метках вариантов можно использовать константные выражения, ветка ELSE |
необязательна. Если значение x не соответствует ни одному варианту и ELSE |
отсутствует, то программа прерывается с ошибкой времени выполнения. |
------------------------------------------------------------------------------ |
Тип WCHAR |
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и |
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и |
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает |
только тип CHAR. Для получения значения типа WCHAR, следует использовать |
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять |
исходный код в кодировке UTF-8 c BOM. |
------------------------------------------------------------------------------ |
Конкатенация строковых и символьных констант |
Допускается конкатенация ("+") константных строк и символов типа CHAR: |
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *) |
newline = 0DX + 0AX; |
------------------------------------------------------------------------------ |
Проверка и охрана типа нулевого указателя |
Оригинальное сообщение о языке не определяет поведение программы при |
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих |
Oberon-реализациях выполнение такой операции приводит к ошибке времени |
выполнения. В данной реализации охрана типа нулевого указателя не приводит к |
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет |
значительно сократить частоту применения охраны типа. |
------------------------------------------------------------------------------ |
Дополнительные стандартные процедуры |
DISPOSE (VAR v: любой_указатель) |
Освобождает память, выделенную процедурой NEW для |
динамической переменной v^, и присваивает переменной v |
значение NIL. |
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR); |
v := x; |
Если LEN(v) < LEN(x), то строка x будет скопирована |
не полностью |
LSR (x, n: INTEGER): INTEGER |
Логический сдвиг x на n бит вправо. |
MIN (a, b: INTEGER): INTEGER |
Минимум из двух значений. |
MAX (a, b: INTEGER): INTEGER |
Максимум из двух значений. |
BITS (x: INTEGER): SET |
Интерпретирует x как значение типа SET. |
Выполняется на этапе компиляции. |
LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER |
Длина 0X-завершенной строки s, без учета символа 0X. |
Если символ 0X отсутствует, функция возвращает длину |
массива s. s не может быть константой. |
WCHR (n: INTEGER): WCHAR |
Преобразование типа, аналогично CHR(n: INTEGER): CHAR |
------------------------------------------------------------------------------ |
Импортированные процедуры |
Синтаксис импорта: |
PROCEDURE [callconv, library, function] proc_name (FormalParam): Type; |
- callconv -- соглашение о вызове |
- library -- имя файла динамической библиотеки (строковая константа) |
- function -- имя импортируемой процедуры (строковая константа), если |
указана пустая строка, то имя процедуры = proc_name |
например: |
PROCEDURE [windows, "kernel32.dll", ""] ExitProcess (code: INTEGER); |
PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN); |
В конце объявления может быть добавлено (необязательно) "END proc_name;" |
Объявления импортированных процедур должны располагаться в глобальной |
области видимости модуля после объявления переменных, вместе с объявлением |
"обычных" процедур, от которых импортированные отличаются только отсутствием |
тела процедуры. В остальном, к таким процедурам применимы те же правила: |
их можно вызвать, присвоить процедурной переменной или получить адрес. |
Так как импортированная процедура всегда имеет явное указание соглашения о |
вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием |
соглашения о вызове: |
VAR |
ExitProcess: PROCEDURE [windows] (code: INTEGER); |
con_exit: PROCEDURE [stdcall] (bCloseWindow: BOOLEAN); |
В KolibriOS импортировать процедуры можно только из библиотек, размещенных |
в /rd/1/lib. Импортировать и вызывать функции инициализации библиотек |
(lib_init, START) при этом не нужно. |
Для Linux, импортированные процедуры не реализованы. |
------------------------------------------------------------------------------ |
Скрытые параметры процедур |
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке |
формальных параметров, но учитываются компилятором при трансляции вызовов. |
Это возможно в следующих случаях: |
1. Процедура имеет формальный параметр открытый массив: |
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL); |
Вызов транслируется так: |
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x)) |
2. Процедура имеет формальный параметр-переменную типа RECORD: |
PROCEDURE Proc (VAR x: Rec); |
Вызов транслируется так: |
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x)) |
Скрытые параметры необходимо учитывать при связи с внешними приложениями. |
------------------------------------------------------------------------------ |
Модуль RTL |
Все программы неявно используют модуль RTL. Компилятор транслирует |
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об |
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не |
следует вызывать эти процедуры явно. |
Сообщения об ошибках времени выполнения выводятся в диалоговых окнах |
(Windows), в терминал (Linux), на доску отладки (KolibriOS). |
------------------------------------------------------------------------------ |
Модуль API |
Существуют несколько реализаций модуля API (для различных ОС). |
Как и модуль RTL, модуль API не предназначен для прямого использования. |
Он обеспечивает связь RTL с ОС. |
------------------------------------------------------------------------------ |
Генерация исполняемых файлов DLL |
Разрешается экспортировать только процедуры. Для этого, процедура должна |
находиться в главном модуле программы, и ее имя должно быть отмечено символом |
экспорта ("*"). Нельзя экспортировать процедуры, которые импортированы из |
других dll-библиотек. |
KolibriOS DLL всегда экспортируют идентификаторы "version" (версия |
программы) и "lib_init" - адрес процедуры инициализации DLL: |
PROCEDURE [stdcall] lib_init (): INTEGER |
Эта процедура должна быть вызвана перед использованием DLL. |
Процедура всегда возвращает 1. |
/programs/develop/oberon07/doc/x86_64.txt |
---|
0,0 → 1,381 |
Компилятор языка программирования Oberon-07/16 для x86_64 |
Windows/Linux |
------------------------------------------------------------------------------ |
Параметры командной строки |
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или |
UTF-8 с BOM-сигнатурой. |
Выход - испоняемый файл формата PE32+ или ELF64. |
Параметры: |
1) имя главного модуля |
2) тип приложения |
"win64con" - Windows64 console |
"win64gui" - Windows64 GUI |
"win64dll" - Windows64 DLL |
"linux64exe" - Linux ELF64-EXEC |
"linux64so" - Linux ELF64-SO |
3) необязательные параметры-ключи |
-out <file_name> имя результирующего файла; по умолчанию, |
совпадает с именем главного модуля, но с другим расширением |
(соответствует типу исполняемого файла) |
-stk <size> размер стэка в мегабайтах (по умолчанию 2 Мб, |
допустимо от 1 до 32 Мб) |
-nochk <"ptibcwra"> отключить проверки при выполнении |
-lower разрешить ключевые слова и встроенные идентификаторы в |
нижнем регистре |
-def <имя> задать символ условной компиляции |
параметр -nochk задается в виде строки из символов: |
"p" - указатели |
"t" - типы |
"i" - индексы |
"b" - неявное приведение INTEGER к BYTE |
"c" - диапазон аргумента функции CHR |
"w" - диапазон аргумента функции WCHR |
"r" - эквивалентно "bcw" |
"a" - все проверки |
Порядок символов может быть любым. Наличие в строке того или иного |
символа отключает соответствующую проверку. |
Например: -nochk it - отключить проверку индексов и охрану типа. |
-nochk a - отключить все отключаемые проверки. |
Например: |
Compiler.exe "C:\example.ob07" win64con -out "C:\example.exe" -stk 1 |
Compiler.exe "C:\example.ob07" win64dll -out "C:\example.dll" -nochk pti |
Compiler "source/Compiler.ob07" linux64exe -out "source/Compiler" -nochk a |
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1. |
------------------------------------------------------------------------------ |
Отличия от оригинала |
1. Расширен псевдомодуль SYSTEM |
2. В идентификаторах допускается символ "_" |
3. Добавлены системные флаги |
4. Усовершенствован оператор CASE (добавлены константные выражения в |
метках вариантов и необязательная ветка ELSE) |
5. Расширен набор стандартных процедур |
6. Семантика охраны/проверки типа уточнена для нулевого указателя |
7. Добавлены однострочные комментарии (начинаются с пары символов "//") |
8. Разрешено наследование от типа-указателя |
9. Добавлен синтаксис для импорта процедур из внешних библиотек |
10. "Строки" можно заключать также в одиночные кавычки: 'строка' |
11. Добавлен тип WCHAR |
12. Добавлена операция конкатенации строковых и символьных констант |
------------------------------------------------------------------------------ |
Особенности реализации |
1. Основные типы |
Тип Диапазон значений Размер, байт |
INTEGER -9223372036854775808 .. 9223372036854775807 8 |
REAL 4.94E-324 .. 1.70E+308 8 |
CHAR символ ASCII (0X .. 0FFX) 1 |
BOOLEAN FALSE, TRUE 1 |
SET множество из целых чисел {0 .. 63} 8 |
BYTE 0 .. 255 1 |
WCHAR символ юникода (0X .. 0FFFFX) 2 |
2. Максимальная длина идентификаторов - 1024 символов |
3. Максимальная длина строковых констант - 1024 символов (UTF-8) |
4. Максимальная размерность открытых массивов - 5 |
5. Процедура NEW заполняет нулями выделенный блок памяти |
6. Глобальные и локальные переменные инициализируются нулями |
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая |
модульность отсутствуют |
8. Тип BYTE в выражениях всегда приводится к INTEGER |
9. Контроль переполнения значений выражений не производится |
10. Ошибки времени выполнения: |
1 ASSERT(x), при x = FALSE |
2 разыменование нулевого указателя |
3 целочисленное деление на неположительное число |
4 вызов процедуры через процедурную переменную с нулевым значением |
5 ошибка охраны типа |
6 нарушение границ массива |
7 непредусмотренное значение выражения в операторе CASE |
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x) |
9 CHR(x), если (x < 0) OR (x > 255) |
10 WCHR(x), если (x < 0) OR (x > 65535) |
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255) |
------------------------------------------------------------------------------ |
Псевдомодуль SYSTEM |
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры, |
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к |
повреждению данных времени выполнения и аварийному завершению программы. |
PROCEDURE ADR(v: любой тип): INTEGER |
v - переменная или процедура; |
возвращает адрес v |
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER |
возвращает адрес x |
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER |
возвращает адрес x |
PROCEDURE SIZE(T): INTEGER |
возвращает размер типа T |
PROCEDURE TYPEID(T): INTEGER |
T - тип-запись или тип-указатель, |
возвращает номер типа в таблице типов-записей |
PROCEDURE INF(): REAL |
возвращает специальное вещественное значение "бесконечность" |
PROCEDURE MOVE(Source, Dest, n: INTEGER) |
Копирует n байт памяти из Source в Dest, |
области Source и Dest не могут перекрываться |
PROCEDURE GET(a: INTEGER; |
VAR v: любой основной тип, PROCEDURE, POINTER) |
v := Память[a] |
PROCEDURE GET8(a: INTEGER; |
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1) |
PROCEDURE GET16(a: INTEGER; |
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2) |
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32) |
Эквивалентно |
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4) |
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER) |
Память[a] := x; |
Если x: BYTE или x: WCHAR, то значение x будет расширено |
до 64 бит, для записи байтов использовать SYSTEM.PUT8, |
для WCHAR -- SYSTEM.PUT16 |
PROCEDURE PUT8(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 8 бит (x) |
PROCEDURE PUT16(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 16 бит (x) |
PROCEDURE PUT32(a: INTEGER; |
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32) |
Память[a] := младшие 32 бит (x) |
PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER) |
Копирует n байт памяти из Source в Dest. |
Эквивалентно |
SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n) |
PROCEDURE CODE(byte1, byte2,... : BYTE) |
Вставка машинного кода, |
byte1, byte2 ... - константы в диапазоне 0..255, |
например: |
SYSTEM.CODE(048H,08BH,045H,010H) (* mov rax,qword[rbp+16] *) |
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не |
допускаются никакие явные операции, за исключением присваивания. |
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях. |
------------------------------------------------------------------------------ |
Системные флаги |
При объявлении процедурных типов и глобальных процедур, после ключевого |
слова PROCEDURE может быть указан флаг соглашения о вызове: |
[win64], [systemv], [windows], [linux], [oberon]. |
Например: |
PROCEDURE [win64] MyProc (x, y, z: INTEGER): INTEGER; |
Флаг [windows] - синоним для [win64], [linux] - синоним для [systemv]. |
Знак "-" после имени флага ([win64-], [linux-], ...) означает, что |
результат процедуры можно игнорировать (не допускается для типа REAL). |
Если флаг не указан или указан флаг [oberon], то принимается внутреннее |
соглашение о вызове. [win64] и [systemv] используются для связи с |
операционной системой и внешними приложениями. |
При объявлении типов-записей, после ключевого слова RECORD может быть |
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей |
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть |
базовыми типами для других записей. |
Для использования системных флагов, требуется импортировать SYSTEM. |
------------------------------------------------------------------------------ |
Оператор CASE |
Синтаксис оператора CASE: |
CaseStatement = |
CASE Expression OF Сase {"|" Сase} |
[ELSE StatementSequence] END. |
Case = [CaseLabelList ":" StatementSequence]. |
CaseLabelList = CaseLabels {"," CaseLabels}. |
CaseLabels = ConstExpression [".." ConstExpression]. |
Например: |
CASE x OF |
|-1: DoSomething1 |
| 1: DoSomething2 |
| 0: DoSomething3 |
ELSE |
DoSomething4 |
END |
В метках вариантов можно использовать константные выражения, ветка ELSE |
необязательна. Если значение x не соответствует ни одному варианту и ELSE |
отсутствует, то программа прерывается с ошибкой времени выполнения. |
------------------------------------------------------------------------------ |
Тип WCHAR |
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и |
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и |
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает |
только тип CHAR. Для получения значения типа WCHAR, следует использовать |
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять |
исходный код в кодировке UTF-8 c BOM. |
------------------------------------------------------------------------------ |
Конкатенация строковых и символьных констант |
Допускается конкатенация ("+") константных строк и символов типа CHAR: |
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *) |
newline = 0DX + 0AX; |
------------------------------------------------------------------------------ |
Проверка и охрана типа нулевого указателя |
Оригинальное сообщение о языке не определяет поведение программы при |
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих |
Oberon-реализациях выполнение такой операции приводит к ошибке времени |
выполнения. В данной реализации охрана типа нулевого указателя не приводит к |
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет |
значительно сократить частоту применения охраны типа. |
------------------------------------------------------------------------------ |
Дополнительные стандартные процедуры |
DISPOSE (VAR v: любой_указатель) |
Освобождает память, выделенную процедурой NEW для |
динамической переменной v^, и присваивает переменной v |
значение NIL. |
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR); |
v := x; |
Если LEN(v) < LEN(x), то строка x будет скопирована |
не полностью |
LSR (x, n: INTEGER): INTEGER |
Логический сдвиг x на n бит вправо. |
MIN (a, b: INTEGER): INTEGER |
Минимум из двух значений. |
MAX (a, b: INTEGER): INTEGER |
Максимум из двух значений. |
BITS (x: INTEGER): SET |
Интерпретирует x как значение типа SET. |
Выполняется на этапе компиляции. |
LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER |
Длина 0X-завершенной строки s, без учета символа 0X. |
Если символ 0X отсутствует, функция возвращает длину |
массива s. s не может быть константой. |
WCHR (n: INTEGER): WCHAR |
Преобразование типа, аналогично CHR(n: INTEGER): CHAR |
------------------------------------------------------------------------------ |
Импортированные процедуры |
Синтаксис импорта: |
PROCEDURE [callconv, library, function] proc_name (FormalParam): Type; |
- callconv -- соглашение о вызове |
- library -- имя файла динамической библиотеки (строковая константа) |
- function -- имя импортируемой процедуры (строковая константа), если |
указана пустая строка, то имя процедуры = proc_name |
например: |
PROCEDURE [windows, "kernel32.dll", "ExitProcess"] exit (code: INTEGER); |
PROCEDURE [windows, "kernel32.dll", ""] GetTickCount (): INTEGER; |
В конце объявления может быть добавлено (необязательно) "END proc_name;" |
Объявления импортированных процедур должны располагаться в глобальной |
области видимости модуля после объявления переменных, вместе с объявлением |
"обычных" процедур, от которых импортированные отличаются только отсутствием |
тела процедуры. В остальном, к таким процедурам применимы те же правила: |
их можно вызвать, присвоить процедурной переменной или получить адрес. |
Так как импортированная процедура всегда имеет явное указание соглашения о |
вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием |
соглашения о вызове: |
VAR |
ExitProcess: PROCEDURE [windows] (code: INTEGER); |
Для Linux, импортированные процедуры не реализованы. |
------------------------------------------------------------------------------ |
Скрытые параметры процедур |
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке |
формальных параметров, но учитываются компилятором при трансляции вызовов. |
Это возможно в следующих случаях: |
1. Процедура имеет формальный параметр открытый массив: |
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL); |
Вызов транслируется так: |
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x)) |
2. Процедура имеет формальный параметр-переменную типа RECORD: |
PROCEDURE Proc (VAR x: Rec); |
Вызов транслируется так: |
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x)) |
Скрытые параметры необходимо учитывать при связи с внешними приложениями. |
------------------------------------------------------------------------------ |
Модуль RTL |
Все программы неявно используют модуль RTL. Компилятор транслирует |
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об |
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не |
следует вызывать эти процедуры явно. |
Сообщения об ошибках времени выполнения выводятся в диалоговых окнах |
(Windows), в терминал (Linux). |
------------------------------------------------------------------------------ |
Модуль API |
Существуют несколько реализаций модуля API (для различных ОС). |
Как и модуль RTL, модуль API не предназначен для прямого использования. |
Он обеспечивает связь RTL с ОС. |
------------------------------------------------------------------------------ |
Генерация исполняемых файлов DLL |
Разрешается экспортировать только процедуры. Для этого, процедура должна |
находиться в главном модуле программы, ее имя должно быть отмечено символом |
экспорта ("*") и должно быть указано соглашение о вызове. Нельзя |
экспортировать процедуры, которые импортированы из других dll-библиотек. |