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

Используемые в коде мнемонические имена команд совпадают с принятыми в The Java Virtual Machine Specification. Однако, как исключение, префикс wide

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

Курсовой проект

Компьютеры, программирование

Другие курсовые по предмету

Компьютеры, программирование

Сдать работу со 100% гаранией
м две двойные кавычки внутри строки интерпретируются как одна двойная кавычка в строке);
  • invokeinterface <имя_интерфейса>::<имя_метода>(<тип_аргумента_1>, ... , <тип_аргумента_2>):<тип_возвращаемого_значения> <целое_число>; - типы - аналогично другим командам вызова методов;
  • multianewarray <полное_имя_класса> <число_измерений>;
  • newarray {boolean|char|float|double|byte|short|int|long};
  • 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 целое число, содержащееся в строке,

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

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

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

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

    maxstack 4;

    maxlocals 2;

    aload_0; %this

    dup;

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

    aload_1; %arg1

    begin_try:

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

    dup;

    iconst_0;

    if_icmpgeend_try;

    newjava.lang.Exception;

    dup;

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

    athrow;

    end_try:

    putfield@::m_i:int;

    return;

    exception:

    pop;

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

    ldc string "Invalid argument";

    invokevirtualjava.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_icmpgtloop;

    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():void;">java.lang.Object::<init>():void;

    dload_1;

    dconst_0;

    dcmpg;

    ifge l_endif;

    new java.lang.IllegalArgumentException;

    dup;

    ():void;">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;

    ():void;">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;

    ():void;">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;

    end;

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

     

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

    %файл MainClass.jsm

    public class MainClass;

     

    methods;

     

    public <init>():void;

    maxstack 1;

    maxlocals 1;

    aload_0;

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

    return;

    end;

     

    public static main(java.lang.String[]):void;

    maxstack 8;

    maxlocals 7;

    iconst_3;

    anewarray Figure;

    astore_1;

    aload_1;

    iconst_0;

    new Circle;

    dup;

    ldc2_w double 10;

    invokespecial Circle::<init>(double):void;

    aastore;

    aload_1;

    iconst_1;

    new Rectangle;

    dup;

    dconst_1;

    ldc2_w double 2;

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

    aastore;

    aload_1;

    iconst_2;

    new Square;

    dup;

    ldc2_w double 3;

    invokespecial Square::<init>(double):void;

    aastore;

    dconst_0;

    dstore_2;

    iconst_0;

    istore 4;

    l_50:

    iload 4;

    aload_1;

    arraylength;

    if_icmpge l_75;

    dload_2;

    aload_1;

    iload 4;

    aaload;

    invokeinterface Figure::getArea():double, 1;

    dadd;

    dstore_2;

    iinc 4, 1;

    goto l_50;

    l_75:

    new java.io.BufferedReader;

    dup;

    new java.io.InputStreamReader;

    dup;

    getstatic java.lang.System::in:java.io.InputStream;

    (java.io.InputStream):void;">invokespecial java.io.InputStreamReader::<init>(java.io.InputStream):void;

    (java.io.Reader):void;">invokespecial java.io.BufferedReader::<init>(java.io.Reader):void;

    astore 4;<

    Похожие работы

    << < 1 2 3 4 5 6 7 > >>