скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыКурсовая работа: Ассемблер для платформы Java

·     команды вызова методов:

o       invokevirtual - обычный вызов метода экземпляра с использованием механизма позднего связывания;

o       invokestatic - вызов статического метода;

o       invokeinterface  - вызов метода интерфейса у объекта, реализующего данный интерфейс;

o       invokespecial - вызов метода экземпляра без использования механизма позднего связывания. Используется для вызова конструкторов, методов суперкласса и private-методов;

·     команды возврата из метода:

o       return - возврат из метода, возвращающего void;

o       ireturn, lreturn, freturn , dreturn, areturn - возврат значения соответствующего типа;

·     команда генерации исключений: athrow;

·     команды синхронизации (механизм блокировок):

o       monitorenter - установить блокировку (войти в критическую секцию);

o       monitorexit - освободить блокировку (выйти из критической секции).


Синтаксис языка ассемблера для платформы Java (языка JASM).

Файл исходного текста на языке ассемблера для платформы Java (языке JASM) представляет собой текстовый файл, строки которого разделены последовательностью символов с кодами 13 и 10. Имя файла исходного текста и его расширение могут быть любыми, однако рекомендуется, чтобы имя совпадало с именем описанного в файле класса, а расширением было .jasm либо .jsm. Файл исходного текста состоит из предложений, разделенных точкой с запятой. Последнее предложение может не иметь в конце точки с запятой. Комментарии отделяются знаком процента и распространяются до конца строки. Точки с запятой и знаки процента внутри строковых констант, ограниченных двойными кавычками, не имеют своего специального значения. Две идущие подряд двойные кавычки внутри строковой константы интерпретируются как одна двойная кавычка в строке. Любые последовательности пробельных символов (пробелов, табуляций, переводов строки и т. д.) интерпретируются как один пробел, если с обеих сторон от них находятся символы следующих видов: буквы латинского алфавита, цифры, знак подчеркивания, либо, в противном случае, игнорируются. Исключение составляют пробельные символы в строковых константах и комментариях. Верхний и нижний регистр букв в идентификаторах, именах команд и других лексемах различается.

Каждый файл исходного текста компилируется в один файл класса. Файл исходного текста должен иметь следующую структуру:

[модификаторы_доступа] class <имя_класса>;

[extends <базовый класс>;]

[implements <интерфейс_1>, <интерфейс_2>, ... , <интерфейс_n>;]

[fields;

         <описания_полей>

]

[methods;

         <описания_методов>

]

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

Модификаторы_доступа - это слова public, final, abstract, super, соответствующие флагам прав доступа ACC_PUBLIC, ACC_FINAL, ACC_ABSTRACT, ACC_STATIC. Эти флаги устанавливаются в единицу тогда и только тогда, когда в объявлении класса присутствует соответствующее ключевое слово. Класс может иметь несколько различных модификаторов доступа, разделенных пробелом (или любой другой последовательностью пробельных символов). Повторение одинаковых модификаторов в заголовке одного класса не допускается. Когда класс не имеет флага ACC_INTERFACE, в его объявлении используется слово class, иначе используется ключевое слово interface. Все имена классов и интерфейсов записываются с указанием полного пути (пакетов, в которых эти классы содержатся). Имена пакетов и класса отделяются точкой, например, java.lang.String. В аргументах команд, там, где это необходимо, вместо полного имени текущего класса можно использовать символ «@». Если базовый класс не указан (предложение extends отсутствует), то по умолчанию используется java.lang.Object. Интерфейсы - предки описываемого интерфейса записываются в секции implements.

Для идентификаторов - имен пакетов, классов, полей и методов, а также меток, используются следующие правила: они должны состоять из букв латинского алфавита любого регистра (регистр имеет значение), знаков подчеркивания и цифр, причем не должны начинаться с цифры. Настоятельно не рекомендуется использование идентификаторов, совпадающих с ключевыми словами языка Java, что может привести к некорректной компиляции, либо интерпретации файлов классов JVM. Два специальных имени <init> и <clinit> также рассматриваются как идентификаторы.

Простейший пример описания класса, не имеющего полей и методов:

public abstract class some_package.SomeClass;

% это комментарий

extends

         some_package.nested_package1.BaseClass;

implements % и это комментарий

         some_package.Interface1, some_package.nested_package2.Interface2;

         Описание поля имеет следующий вид:

        

[модификаторы_доступа] <имя_поля>:<тип_поля> [=<начальное значение>];

Здесь модификаторы_доступа - следующие слова: public, protected, private, final, static, transient, volatile, соответствующие флагам доступа поля ACC_PUBLIC, ACC_PROTECTED, ACC_PRIVATE, ACC_FINAL, ACC_STATIC, ACC_TRANSIENT, ACC_VOLATILE. Повторение одинаковых модификаторов доступа в объявлении одного поля и сочетания модификаторов, соответствующие запрещенным сочетаниям флагов доступа (см. The Java Virtual Machine Specification), вызывают ошибку времени компиляции. Поля интерфейса обязательно должны быть объявлены с модификаторами public, static и final. Имя_поля - корректный идентификатор. Тип_поля - имя класса либо имя примитивного типа (имена примитивных типов совпадают с соответствующими ключевыми словами языка Java - byte, short, int, long, char, float, double, boolean). Начальное значение может быть задано только для статического поля, если оно указано, то у поля создается атрибут ConstantValue. Начальное значение может быть целочисленной, вещественной, логической либо символьной константой для полей соответствующих типов. Вещественная константа может быть записана в десятичной либо экспоненциальной форме, в формате вещественных чисел, принятом в Java. Символьные константы заключаются в апострофы. Кроме того, может быть указан код символа как обычное целое число. Логические константы записываются в виде слов true и false. Примеры описаний полей:

public final static COUNT:int = 10;

static c:char = ‘A’;

static c1:char = 13;

private volatile m_flag:boolean;

protected m_list:java.util.ArrayList;

Описание метода в общем случае имеет вид:

[<модификаторы_доступа>] <имя_метода>(<тип_параметра_1>,<тип_параметра_2>, ... ,<тип_параметра_n>):<тип_возвращаемого_значения> [throws <класс_исключения_1>, ... , <класс_исключения_n>];

% для методов с модификатором abstract нижележащая часть описания

% отсутствует

         maxstack <число>;

         maxlocals <число>;

         [<метка_1>:]      

                   <команда_1>;

                   ...

         [<метка_n>:]

                   <команда_n>;

         [

         protected_blocks;

                   <класс_исключения> <метка> : <метка> > <метка>;

                   ...

                   finally <метка> : <метка> > <метка>;

]       

         end;

Здесь модификаторы_доступа - ключевые слова: public, protected, private, static, final, abstract, соответствующие следующим флагам доступа метода: ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_ABSTRACT. Повторение одинаковых модификаторов доступа в заголовке одного метода и сочетания модификаторов, соответствующие запрещенным сочетаниям флагов доступа (см. The Java Virtual Machine Specification), вызывают ошибку времени компиляции. Методы интерфейса обязательно должны быть объявлены с модификаторами public и abstract. Имя_метода - корректный идентификатор, либо <init> или <clinit> для конструкторов и статических  инициализаторов. Типы параметров и тип возвращаемого значения должны быть именами классов, либо именами примитивных типов, принятыми в языке Java (byte, short, int, long, char, float, double, boolean). Кроме того, тип возвращаемого значения может быть указан как void. После ключевого слова throws в заголовке метода могут быть перечислены через запятую имена классов исключений, генерируемых методом. Для методов, не являющихся абстрактными, после заголовка обязательно записываются предложения maxstack и maxlocals, в которых указывается размер стека операндов и области локальных переменных метода (в четырехбайтных ячейках). Затем следует код метода в виде последовательности команд, разделенных точками с запятыми. Каждой команде может предшествовать метка, отделяемая от нее двоеточием. Метка должна быть корректным. Каждая команда может иметь не более одной метки, и каждая метка должна предшествовать той или иной команде. Однако, имеется специальная псевдокоманда none, для которой не генерируется какой-либо код (пустая команда). Ее можно использовать, если необходимо расположить более одной метки у одной команды или поместить метку в конец метода. После ключевого слова protected_blocks могут быть перечислены защищенные блоки (обработчики исключений) метода. Описание каждого защищенного блока состоит из имени класса исключения или ключевого слова finally и трех меток, разделенных символами ‘:’ и ‘>’. Первая из них указывает на начало защищенного блока, вторая на его конец, третья - на место в коде метода, куда переходит управление при возникновении исключения или при выходе из защищенного блока в случае finally.

Используемые в коде мнемонические имена команд совпадают с принятыми в The Java Virtual Machine Specification. Однако, как исключение, префикс wide не рассматривается как отдельная команда, вместо этого команды, его имеющие, записываются как wide_<имя_команды>. Форматы записи команд:

·          <мнемоническое_имя>; Такую форму имеют следующие команды: aaload, aastore, aconst_null, aload_0, aload_1, aload_2, aload_3 ,areturn, arraylength, astore_0, astore_1, astore_2, astore_3, athrow, baload, bastore, caload, castore, d2f, d2i, d2l, dadd, daload, dastore, dcmpg, dcmpl, dconst_0, dconst_1, ddiv, dload_0, dload_1, dload_2, dload_3, dmul, dneg, drem, dreturn, dstore_0, dstore_1, dstore_2, dstore_3, dsub, dup, dup2, dup2_x1, dup2_x2, dup_x1, dup_x2, f2d, f2i, f2l, fadd, faload, fastore, fcmpg, fcmpl, fconst_0, fconst_1, fconst_2, fdiv, fload_0, fload_1, fload_2, fload_3, fmul, fneg, frem, freturn, fstore_0, fstore_1, fstore_2, fstore_3, fsub, i2b, i2c, i2d, i2f, i2l, i2s, iadd, iaload, iand, iastore, iconst_0, iconst_1, iconst_2, iconst_3, iconst_4, iconst_5, iconst_m1, idiv, iload_0, iload_1, iload_2, iload_3, imul, ineg, ior, irem, ireturn, ishl, ishr, istore_0, istore_1, istore_2, istore_3, isub, iushr, ixor, l2d, l2f, l2i, ladd, laload, land, lastore, lcmp, lconst_0, lconst_1, ldiv, lload_0, lload_1, lload_2, lload_3, lmul, lneg, lor, lrem, lreturn, lshl, lshr, lstore_0, lstore_1, lstore_2, lstore_3, lsub, lushr, lxor, monitorenter, monitorexit, nop, pop, pop2, return, saload, sastore, swap;

·          <мнемоническое_имя> <метка>; Такую форму имеют команды перехода: goto, goto_w, if_acmpeq, if_acmpne, if_acmpge, if_acmpgt, if_icmple, if_icmplt, if_icmpne, ifeq, ifge, ifgt, ifle, iflt, ifne, ifnonull, ifnull, jsr, jsr_w;

·          <мнемоническое_имя> <целое число>; Число должно удовлетворять ограничениям конкретной команды: aload, astore, dload, dstore, fload, fstore, iload, istore, lload, lstore, ret, bipush, sipush, wide_aload, wide_astore, wide_dload, wide_dstore, wide_fload, wide_fstore, wide_iload, wide_istore, wide_lload, wide_lstore, wide_ret;

·          <мнемоническое_имя> @::<имя_поля>:<тип_поля>; Тип_поля - имя примитивного типа, принятое в языке Java, либо имя класса. Команды: getfield, putfield, getstatic, putstatic;

·          <мнемоническое_имя> <полное_имя_класса>::<имя_метода>(<тип_параметра_1>, ... , <тип_параметра_n>):<тип_возвращаемого значения>; Здесь типы параметров и возвращаемого значения - имена примитивных типов, принятые в языке Java, имена классов, либо (только для возвращаемого значения) void. Команды: invokespecial, invokestatic, invokevirtual;

·          <мнемоническое_имя> <полное_имя_класса>; Такой формат имеют следующие команды: anewarray, checkcast, instanceof, new;

·          <мнемоническое_имя> <целое_число_индекс_переменной> <целое_число>; Команды: iinc, wide_iinc;

·          <мнемоническое_имя> <тип> <константа>; - команды ldc, ldc_w, ldc_2w. Здесь тип - int, float, string (для ldc, ldc_w), double, long (для ldc_2w). Константа должна иметь соответствующий тип (целые числа записываются обычным способом, вещественные - в десятичной или экспоненциальной форме, в формате, принятом в Java, строки записываются в двойных кавычках, при этом две двойные кавычки внутри строки интерпретируются как одна двойная кавычка в строке);

·          invokeinterface <имя_интерфейса>::<имя_метода>(<тип_аргумента_1>, ... , <тип_аргумента_2>):<тип_возвращаемого_значения> <целое_число>; - типы - аналогично другим командам вызова методов;

·          multianewarray <полное_имя_класса> <число_измерений>;

·          newarray byte;

·          tableswitch <число_1>:<число_n> default: <метка_0> <число_1>:<метка_1> ... <число_n>:<метка_n>; Здесь числа число_1 ... число_n должны быть последовательными целыми числами. При этом числа, указанные сразу после мнемонического имени команды, должны совпадать с границами диапазона чисел, для которых указаны метки перехода. lookupswitch default:<метка_0> <число_1>:<метка_1> ... <число_n>:<метка_n>; Здесь среди чисел, для которых указаны метки перехода, не должно быть одинаковых. Эти числа должны быть целыми, они не обязаны быть упорядочены по возрастанию, сортировка происходит при обработке команды компилятором.


Тестовые примеры.

Для тестирования компилятора использовались, в частности, следующие примеры:

1.

%файл Summator.jsm

public class Summator;

fields;

         private m_i:int;   

methods;

%Конструктор. Заносит в поле m_i целое число, содержащееся в строке,

%передаваемой в качестве параметра. В случае, если строка не содержит

%правильной записи целого числа, либо это число отрицательное,

%то выводится сообщение об ошибке.

Страницы: 1, 2, 3, 4


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.