Рефераты. Ассемблер для платформы Java

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

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

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

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

· newarray double;

· 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 целое число, содержащееся в строке,

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

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

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

public <init>(java.lang.String):void;

maxstack 4;

maxlocals 2;

aload_0; %this

dup;

invokespecial java.lang.Object::<init>():void;

aload_1; %arg1

begin_try:

invokestatic java.lang.Integer::parseInt(java.lang.String):int;

dup;

iconst_0;

if_icmpge end_try;

new java.lang.Exception;

dup;

invokespecial java.lang.Exception::<init>():void;

athrow;

end_try:

putfield @::m_i:int;

return;

exception:

pop;

getstatic java.lang.System::out:java.io.PrintStream;

ldc string "Invalid argument";

invokevirtual java.io.PrintStream::println(java.lang.String):void;

return;

protected_blocks;

java.lang.Exception

begin_try : end_try > exception;

end;

%возвращает сумму натуральных чисел от 1 до m_i.

public getSum():int;

maxstack 3;

maxlocals 2;

iconst_0;

istore_1;

aload_0; %this

getfield @::m_i:int;

loop:

dup;

iload_1; %result

iadd;

istore_1; %result

iconst_1;

isub;

dup;

iconst_0;

if_icmpgt loop;

pop;

iload_1; %result

ireturn;

end;

%возвращает значение поля m_i

public getI():int;

maxstack 1;

maxlocals 1;

aload_0; %this

getfield @::m_i:int;

ireturn;

end;

2.

%файл Switches.jsm

public class Switches;

fields;

methods;

%оба метода функционально эквивалентны следующей функции, написанной на Java.

% static int function(int i) {

% switch(i) {

% case 1: return 2;

% case 2: return -1;

% default: return 0;

% }

% }

public static lookup(int):int;

maxstack 1;

maxlocals 1;

iload_0;

lookupswitch

default : l_def

1 : l_1

2 : l_2;

l_def:

iconst_0;

ireturn;

l_1:

iconst_2;

ireturn;

l_2:

iconst_m1;

ireturn;

end;

public static table(int):int;

maxstack 1;

maxlocals 1;

iload_0;

tableswitch 1:2

default : l_def

1 : l_1

2 : l_2;

l_def:

iconst_0;

ireturn;

l_1:

iconst_2;

ireturn;

l_2:

iconst_m1;

ireturn;

end;

3.

Следующий пример представляет собой программу, состоящую из 5 классов.

%-------------------------------------------------------------%

%файл Figure.jsm

public interface Figure;

methods;

public abstract getArea():double;

%-------------------------------------------------------------%

%-------------------------------------------------------------%

%файл Circle.jsm

public class Circle;

implements Figure;

fields;

private m_radius:double;

methods;

public <init>(double):void;

maxstack 4;

maxlocals 3;

aload_0;

invokespecial java.lang.Object::<init>():void;

dload_1;

dconst_0;

dcmpg;

ifge l_endif;

new java.lang.IllegalArgumentException;

dup;

invokespecial java.lang.IllegalArgumentException::<init>():void;

athrow;

l_endif:

aload_0;

dload_1;

putfield @::m_radius:double;

return;

end;

public getArea():double;

maxstack 4;

maxlocals 1;

aload_0;

getfield @::m_radius:double;

aload_0;

getfield @::m_radius:double;

dmul;

ldc2_w double 3.14159265;

dmul;

dreturn;

end;

%-------------------------------------------------------------%

%-------------------------------------------------------------%

%файл Rectangle.jsm

public class Rectangle;

implements Figure;

fields;

private m_a:double;

private m_b:double;

methods;

public <init>(double, double):void;

maxstack 4;

maxlocals 5;

aload_0;

invokespecial java.lang.Object::<init>():void;

dload_1;

dconst_0;

dcmpl;

iflt l_error;

dload_3;

dconst_0;

dcmpl;

ifge l_endif;

l_error:

new java.lang.IllegalArgumentException;

dup;

invokespecial java.lang.IllegalArgumentException::<init>():void;

athrow;

l_endif:

aload_0;

dload_1;

putfield @::m_a:double;

aload_0;

dload_3;

putfield @::m_b:double;

return;

end;

public getArea():double;

maxstack 4;

maxlocals 1;

aload_0;

getfield @::m_a:double;

aload_0;

getfield @::m_b:double;

dmul;

dreturn;

end;

%-------------------------------------------------------------%

%-------------------------------------------------------------%

%файл Square.jsm

public class Square;

extends Rectangle;

methods;

public <init>(double):void;

maxstack 5;

maxlocals 3;

aload_0;

dload_1;

dload_1;

invokespecial Rectangle::<init>(double, double):void;

return;

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



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.