Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76...

66
J. Xue COMP3131/9102: Programming Languages and Compilers Jingling Xue School of Computer Science and Engineering The University of New South Wales Sydney, NSW 2052, Australia http://www.cse.unsw.edu.au/~cs3131 http://www.cse.unsw.edu.au/~cs9102 Copyright @2018, Jingling Xue COMP3131/9102 Page 464 May 6, 2018

Transcript of Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76...

Page 1: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

COMP3131/9102: Programming Languages and Compilers

Jingling Xue

School of Computer Science and Engineering

The University of New South Wales

Sydney, NSW 2052, Australia

http://www.cse.unsw.edu.au/~cs3131

http://www.cse.unsw.edu.au/~cs9102

Copyright @2018, Jingling Xue

COMP3131/9102 Page 464 May 6, 2018

Page 2: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Lecture 9: JVM

1. Our code generation

2. JVM:

• Data types

• Operand stack

• Local variable array (indices)

• Instructions ( ⇐⇒ Jasmin instructions)

• Parameter-passing ( ⇐⇒ Jasmin method invocations)

COMP3131/9102 Page 465 May 6, 2018

Page 3: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

An Example

void whileInt() {int i = 0;while (i < 100) {

i++;}

}

is compiled to

Method void whileInt()0 iconst_01 istore_1 // i’s index is 12 goto 85 iinc 1 1 // i++8 iload_19 bipush 100

11 if_icmplt 514 return

COMP3131/9102 Page 466 May 6, 2018

Page 4: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

The VC Compiler

Source Code (gcd.vc)

Assignment 1: Scanner

Assignment 2 & 3: Parser

Assignment 4: Semantic Analyser

Assignment 5: Code Generator

Jasmin Assembly Code (gcd.j)

Jasmin Assembler

Java Virtual Machine

Results

VC

.lan

g.S

yst

em.c

lass

Tokens

AST

Decorated AST

Java Byte Code (gcd.class)

COMP3131/9102 Page 467 May 6, 2018

Page 5: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Standard Environment: Built-in Functions/** System.java*/

package VC.lang;

import java.io.*;import java.util.StringTokenizer;

public class System {

private static BufferedReader reader =new BufferedReader(new InputStreamReader(java.lang.System.in));

public final static int getInt() {try {

java.lang.System.out.print("Enter an integer: ");String s = reader.readLine();StringTokenizer st = new StringTokenizer(s);int i = Integer.parseInt(st.nextToken());java.lang.System.out.println("You have entered " + i + ".");return i;

} catch (java.io.IOException e) {java.lang.System.out.println("Caught IOException: " + e.getMessage());java.lang.System.exit(1);return -1;

}}

public final static void putBool(boolean b) {java.lang.System.out.print(b);

}

COMP3131/9102 Page 468 May 6, 2018

Page 6: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

public final static void putBoolLn(boolean b) {java.lang.System.out.println(b);

}

public final static void putInt(int i) {java.lang.System.out.print(i);

}

public final static void putIntLn(int i) {java.lang.System.out.println(i);

}

public final static float getFloat() {try {

java.lang.System.out.print("Enter a float: ");String s = reader.readLine();StringTokenizer st = new StringTokenizer(s);float f = Float.parseFloat(st.nextToken());java.lang.System.out.println("You have entered " + f + ".");return f;

} catch (java.io.IOException e) {java.lang.System.out.println("Caught IOException: " + e.getMessage());java.lang.System.exit(1);return -1.0F;

}}

public final static void putFloat(float f) {java.lang.System.out.print(f);

}

public final static void putFloatLn(float f) {java.lang.System.out.println(f);

}

COMP3131/9102 Page 469 May 6, 2018

Page 7: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

public final static void putString(String s) {java.lang.System.out.print(s);

}

public final static void putStringLn(String s) {java.lang.System.out.println(s);

}

public final static void putLn() {java.lang.System.out.println();

}

}

COMP3131/9102 Page 470 May 6, 2018

Page 8: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

References

• Jasmin home page: http://jasmin.sourceforge.net/

• Tim Lindholm and Frank Yellin, The Java Virtual

Machine Specification, 2nd Edition, Addison-Wesley,

1999. (The entire book is available on-line; see the subject Resource Page.)

• Vill Venners, Inside the Java 2 Virtual Machine, 2nd

Edition, McGraw-Hill, 1999.

(Some chapters available on-line; see the subject Resource Page.)

COMP3131/9102 Page 471 May 6, 2018

Page 9: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Jasmin Assembly Language

• Sun has not defined an assembler format

• Jasmin is a Java assembler, which has been installed in the

class account and can be invoked as follows:

% 3131

% jasmin gcd.j --> the output is gcd.class

% java gcd

• Install from http://jasmin.sourceforge.net/ on

your own computer

• Read also the Jasmin User Guide there:

http://jasmin.sourceforge.net/guide.html

• Jasmin page contains pointers to other assembly languages

COMP3131/9102 Page 472 May 6, 2018

Page 10: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Jasmin Assembly Language v.s Java Byte Code

• 1-to-1 correspondence

– Operation codes (opcodes) represented by mnemonics

– Name indices written in symbolic form

– Local variables are encoded by indices (integers)

• Examples:

Jasmin Instructions Java Byte Code---------------------------------------------iload 0x60bipush 20 0x1614getstatic Test.i 0xb2????--------------------------------------------- where ????is an index into the constant pool entry for Test.i

• Constant pool will be discussed in Lecture 11 but its

understanding unnecessary for Assignment 5

COMP3131/9102 Page 473 May 6, 2018

Page 11: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

gcd.java

// find the greatest common divisor of two integers

public class gcd {

static int gcd(int a, int b) {

if (b == 0)

return a;

else

return gcd(b, a - (a/b) *b);

}

public static void main(String argv[]) {

int i = 2;

int j = 4;

System.out.println(gcd(i, j));

}

}

COMP3131/9102 Page 474 May 6, 2018

Page 12: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

gcd.j;; Produced by JasminVisitor (BCEL);; http://www.inf.fu-berlin.de/~dahm/BCEL/

.source gcd.java

.class public gcd

.super java/lang/Object

.method public <init>()V

.limit stack 1

.limit locals 1

.var 0 is this Lgcd; from Label0 to Label1

Label0:.line 3

aload_0invokespecial java/lang/Object/<init>()V

Label1:return

.end method

.method static gcd(II)I

.limit stack 4

.limit locals 2

.var 0 is a I from Label1 to Label2

.var 1 is b I from Label1 to Label2

Label1:.line 5

iload_1ifne Label0

.line 6iload_0

COMP3131/9102 Page 475 May 6, 2018

Page 13: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

ireturnLabel0:.line 8

iload_1iload_0iload_0iload_1idiviload_1imulisubinvokestatic gcd/gcd(II)I

Label2:ireturn

.end method

.method public static main([Ljava/lang/String;)V

.limit stack 3

.limit locals 3

.var 0 is argv [Ljava/lang/String; from Label0 to Label1

.var 1 is i I from Label2 to Label1

.var 2 is j I from Label4 to Label1

Label0:.line 12

iconst_2istore_1

Label2:.line 13

iconst_4istore_2

Label4:.line 14

getstatic java.lang.System.out Ljava/io/PrintStream;

COMP3131/9102 Page 476 May 6, 2018

Page 14: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

iload_1iload_2invokestatic gcd/gcd(II)Iinvokevirtual java/io/PrintStream/println(I)V

Label1:.line 15

return

.end method

COMP3131/9102 Page 477 May 6, 2018

Page 15: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Java Class File: gcd.class (Output of od -An -tx1 gcd.class)ca fe ba be 00 03 00 2d 00 1e 0a 00 06 00 11 0a

00 05 00 12 09 00 13 00 14 0a 00 15 00 16 07 00

0b 07 00 17 01 00 06 3c 69 6e 69 74 3e 01 00 03

28 29 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e

65 4e 75 6d 62 65 72 54 61 62 6c 65 01 00 03 67

63 64 01 00 05 28 49 49 29 49 01 00 04 6d 61 69

6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67

2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75

72 63 65 46 69 6c 65 01 00 08 67 63 64 2e 6a 61

76 61 0c 00 07 00 08 0c 00 0b 00 0c 07 00 18 0c

00 19 00 1a 07 00 1b 0c 00 1c 00 1d 01 00 10 6a

61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74 01

00 10 6a 61 76 61 2f 6c 61 6e 67 2f 53 79 73 74

65 6d 01 00 03 6f 75 74 01 00 15 4c 6a 61 76 61

2f 69 6f 2f 50 72 69 6e 74 53 74 72 65 61 6d 3b

01 00 13 6a 61 76 61 2f 69 6f 2f 50 72 69 6e 74

53 74 72 65 61 6d 01 00 07 70 72 69 6e 74 6c 6e

01 00 04 28 49 29 56 00 21 00 05 00 06 00 00 00

00 00 03 00 01 00 07 00 08 00 01 00 09 00 00 00

1d 00 01 00 01 00 00 00 05 2a b7 00 01 b1 00 00

00 01 00 0a 00 00 00 06 00 01 00 00 00 03 00 08

00 0b 00 0c 00 01 00 09 00 00 00 32 00 04 00 02

00 00 00 12 1b 9a 00 05 1a ac 1b 1a 1a 1b 6c 1b

68 64 b8 00 02 ac 00 00 00 01 00 0a 00 00 00 0e

00 03 00 00 00 05 00 04 00 06 00 06 00 08 00 09

00 0d 00 0e 00 01 00 09 00 00 00 34 00 03 00 03

00 00 00 10 05 3c 07 3d b2 00 03 1b 1c b8 00 02

b6 00 04 b1 00 00 00 01 00 0a 00 00 00 12 00 04

00 00 00 0c 00 02 00 0d 00 04 00 0e 00 0f 00 0f

00 01 00 0f 00 00 00 02 00 10

COMP3131/9102 Page 478 May 6, 2018

Page 16: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

BCEL (Byte Code Engineering Library)

• Home page: http://jakarta.apache.org/bcel/

• Formerly known as JavaClass

• BCEL comes with a Jasmin disassembler, which has been installed inthe class account and can be invoked as follows:

% 3131

% jasmind gcd.class --> this produces gcd.j

• jasmind is a shell command:#!/bin/csh

#

# jasmind - runs the Jasmin disassembler

#

# Usage:

# jasmind classname.class

#

setenv CLASSPATH ~cs3131/JavaTools/JavaClass

exec java JasminVisitor $*

• Install from the BCEL home page on your own computer.

COMP3131/9102 Page 479 May 6, 2018

Page 17: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Multi-Level Machine Model

JVM

Jasmin

VC

Java C

• There is a virtual machine and a language at each level

• Each level builds on the functionality of the level below

and provides the functionality to the level above

COMP3131/9102 Page 480 May 6, 2018

Page 18: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Lecture 9: JVM

1. Our code generation√

2. JVM:

• Data types

• Operand stack

• Local variable array (indices)

• Instructions ( ⇐⇒ Jasmin instructions)

• Parameter-passing ( ⇐⇒ Jasmin method invocations)

COMP3131/9102 Page 481 May 6, 2018

Page 19: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

JVM Data Types

TYPE RANGE FIELD DESC

boolean {0, 1} Z

byte 8 bit signed 2’s complement (−27 to 27 − 1) B

short 16 bit signed 2’s complement (−215 to 215−1) S

int 32 bit signed 2’s complement (−231 to 231−1) I

long 64 bit signed 2’s complement (−263 to 263−1) L

char 16 bit unsigned Unicode (0 to 216 − 1) C

float 32-bit IEEE 754 single-precision F

double 64-bit IEEE 754 double-precision D

reference 32 bit unsigned reference (0 to 232 − 1) Slide 483

returnAddress 32 bit unsigned reference (0 to 232 − 1) N/A

• All (except returnAddress) mapped 1-to-1 to Java’s primitive types

• returnAddress used with jsr/jsr w/ret for handling exceptions

• boolean, byte, char and short are all implemented as int, but arrays ofthese types may be stored in arrays of less than 32 bits

COMP3131/9102 Page 482 May 6, 2018

Page 20: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

JVM Data Types (Cont’d)

TYPE FIELD DESCRIPTOR

class reference Lclass-name;

interface reference Linterface-name;

array reference [[· · · [ component-type

void V

• class and interface names are qualified names with ”.” replaced by ”/”

• The no. of [ is equal to the no. of dimensions of the array

Type Field Descriptor-------------------------------------

Object Ljava/lang/Object;String Ljava/lang/String;String[] [Ljava/lang/String;int [] [Ifloat [][] [[F

-------------------------------------

• See $4.3.2, The JVM Spec for a formal definition

COMP3131/9102 Page 483 May 6, 2018

Page 21: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Boolean, Byte, Short and Char Represented as Intpublic class IntTypes {

public static void main(String argv[]) {boolean z = true;byte b = 1;short s = 2;char c = ’a’;

}}.method public static main([Ljava/lang/String;)V...

.line 3iconst_1istore_1

.line 4iconst_1istore_2

.line 5iconst_2istore_3

.line 6bipush 97istore 4

Label0:.line 8

return.end method

COMP3131/9102 Page 484 May 6, 2018

Page 22: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

An Example for Printing Data Type Descriptorspublic class Desc {

public static void main(String argv[]) {

Object o = new Object();

int [] i = new int[10];

float [][] f = new float[10][10];

String s1 = "Hello World!";

String [] s2 = { "Hello", "World!"};

System.out.println("Th class name of Object is: " + o.getClass());

System.out.println("Th class name of int[] is: " + i.getClass());

System.out.println("Th class name of float[][] is: " + f.getClass());

System.out.println("Th class name of String: " + s1.getClass());

System.out.println("Th class name of String[]: " + s2.getClass());

}

}

COMP3131/9102 Page 485 May 6, 2018

Page 23: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Method Descriptors

• (ParameterType∗) ReturnType

• Examples:

Method Declaration Method Descriptor

------------ -------------------------------------

int gcd(int i, int j) (II)I

void main(String argv[]) ([Ljava/lang/String;)V

char foo(float f, String) (FLjava/lang/String;)C

------------ -------------------------------------

• See $4.3.3, The JVM Spec for a formal definition

COMP3131/9102 Page 486 May 6, 2018

Page 24: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Operand Stack

• Accessed by pushing and popping values

– storing operands and receiving the operations’ results

– passing arguments and receiving method results

– This unified view is one of the main reasons why code generationfor stack-based machines is easier than registers-based machines

• A new op stack is created every time a method is called

• Integral expression:

1 + 2 * 3 + 4

• Jasmin code (without being optimised):

iconst_1iconst_2iconst_3imuliaddiconst_4iadd

COMP3131/9102 Page 487 May 6, 2018

Page 25: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Local Variable Array

1. A new local variable array is created each time a method is called

2. Local variables addressed by indexing, starting from 0

3. Instance methods:

• slot 0 given to this

• Parameters (if any) given consecutive indices, starting from 1

• The indices allocated to the other variables in any order

4. Class methods:

• Parameters (if any) given consecutive indices, starting from 0

• The indices allocated to the other variables in any order

5. One slot can hold a value of boolean, byte, char, short, int, float,reference and returnAdrress

6. One pair of slots can hold a value of long and double

COMP3131/9102 Page 488 May 6, 2018

Page 26: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Local Variable Indices: Class Methods

1. Class method:public static void foo() {

int i1 = 1; // index 0

int i2 = 2; // index 1

int i3 = 3; // index 2

int i = i1 + i2 * i3; // index 3

}

2. Jasmin code:iconst_1

istore_0

iconst_2

istore_1

iconst_3

istore_2

iload_0

iload_1

iload_2

imul

iadd

istore_3

COMP3131/9102 Page 489 May 6, 2018

Page 27: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Local Variable Indices: Instance Methods

1. Instance method:public void foo() { // "this" given index 0

int i1 = 1; // index 1

int i2 = 2; // index 2

int i3 = 3; // index 3

int i = i1 + i2 * i3; // index 4

}

2. Jasmin code:iconst_1

istore_1

iconst_2

istore_2

iconst_3

istore_3

iload_1

iload_2

iload_3

imul

iadd

istore_4

COMP3131/9102 Page 490 May 6, 2018

Page 28: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Local Variable Indices: Double Word variables1. The Long type:

public static void foo() {int i1 = 1; // index 0long i2 = 2; // indices 1 and 2int i3 = 3; // index 3long i = i1 + i2 * i3; // indices 4 and 5

}

2. Jasmin code:iconst_1istore_0ldc2_w 2lstore_1iconst_3istore_3iload_0i2llload_1iload_3i2llmulladdlstore 4

3. Accessing index 2 or 5 is disallowed

COMP3131/9102 Page 491 May 6, 2018

Page 29: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Lecture 9: JVM

1. Our code generation√

2. JVM:

• Data types√

• Operand stack√

• Local variable array (indices)√

• Instructions ( ⇐⇒ Jasmin instructions)

• Parameter-passing ( ⇐⇒ Jasmin method invocations)

COMP3131/9102 Page 492 May 6, 2018

Page 30: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Jasmin (or JVM) Instructions

1. Arithmetic Instructions

2. Load and store instructions

3. Control transfer instructions

4. Type conversion instructions

5. Operand stack management instructions

6. Object creation and manipulation

7. Method invocation instructions

8. Throwing instructions (not used)

9. Implementing finally (not used)

10. Synchronisation (not used)

COMP3131/9102 Page 493 May 6, 2018

Page 31: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Arithmetic Instructions ($3.11.3, JVM Spec)

• add: iadd, fadd,

• subtract: isub, fsub

• multiply: imul, fmul

• divide: idiv, fdiv

• negative: ineg, fneg

• comparison: fcmpg, fcmpl

• ...

COMP3131/9102 Page 494 May 6, 2018

Page 32: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Load and Store Instructions

• Loading a local variable into the operand stack:

iload iload_0, ..., iload_3

fload fload_0, ..., fload_3

aload aload_0, ..., aload_3 // for array and object refs

iaload // load from an int array

faload // load from a float array

• Storing a value from the operand stack into a local variable:

istore istore_0, ..., istore_3

fstore fstore_0, ..., fstore_3

astore astore_0, ..., astore_3 // for array and object refs

iastore // store into an int array

fastore // store into a float array

• Load a constant into the operand stack:

bipush, sipush, ldc, iconst_m1, iconst_0, ..., iconst_5,

fconst_0, ..., fconst_2

COMP3131/9102 Page 495 May 6, 2018

Page 33: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example: Load and Stored (Slide 487 Repeated)

1. Integral expression:

1 + 2 * 3 + 4

2. Jasmin code:

iconst_1

iconst_2

iconst_3

imul

iadd

iconst_4

iadd

COMP3131/9102 Page 496 May 6, 2018

Page 34: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example: Load and Store (Cont’d)

1. Integral expression:

1 + 100 * 200 + 40000

2. Jasmin code:

iconst_1

bipush 100

sipush 200

imul

iadd

ldc 40000

iadd

3. bipush: −27 – 27 − 1

4. sipush: −215 – 215 − 1

5. ldc val, where val is an int, float or string

COMP3131/9102 Page 497 May 6, 2018

Page 35: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example: Load and Store (Cont’d)

1. Floating-point expression:

1.0F + 2.0F * 3.0F + 4.0F

2. Jasmin code:

fconst_1

fconst_2

ldc 3.0

fmul

fadd

ldc 4.0

fadd

COMP3131/9102 Page 498 May 6, 2018

Page 36: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example: Load and Store for Arrays

1. Array operations:

a[0] = 100;

i = a[0]

2. Jasmin code – (assuming a and i have the indices 1 and 2, resp.)

// a[0] = 100;

aload_1

iconst_0

bipush 100

iastore

// i = a[0];

aload_1

iconst_0

iaload

istore_2

COMP3131/9102 Page 499 May 6, 2018

Page 37: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Control Transfer Instructions

1. Unconditional: goto

2. Instructions on int:

ifeq ifne ifle iflt ifne ifge

if_icmpeq if_icmpne if_icmple

if_icmplt if_icmpge if_icmpgt

3. For floating-point operands, use first

fcmpg or fcmpl

and then

ifeq ifne ifle iflt ifne ifge

COMP3131/9102 Page 500 May 6, 2018

Page 38: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

if icmge label

op stack (before)

+--------------------

| ... value1 value2

+--------------------

op stack (after)

+-----

| ...

+-----

1. Pop off the two ints off and compare them

2. If value1 >= value2, jump to label. Otherwise, execution

continues at the next instruction

Other if icmpxx instructions are similar.

COMP3131/9102 Page 501 May 6, 2018

Page 39: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example 1: Control Transfer Instructions

1. Ctrl1.javapublic class Ctrl1 {

public static void main(String argv[]) {

int i = 1, int j = 2, int k;

if (i < j)

k = 0;

else

k = 1;

}

}

2. Ctrl1.j (irrelevant lines removed).method public static main([Ljava/lang/String;)V

iconst_1

istore_1

iconst_2

istore_2

iload_1

iload_2

if_icmpge Label0

iconst_0

istore_3

goto Label1

Label0:

iconst_1

istore_3

Label1:

return

.end method

COMP3131/9102 Page 502 May 6, 2018

Page 40: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example 2: Control Transfer Instructions

1. Ctrl2.javapublic class Ctrl1 {

public static void main(String argv[]) {

float i = 1, float j = 2, float k;

if (i < j)

k = 0.0F;

else

k = 1.0F;

}

}

2. Ctrl2.j (irrelevant lines removed).method public static main([Ljava/lang/String;)V

fconst_1

fstore_1

fconst_2

fstore_2

fload_1

fload_2

fcmpg

ifge Label0

fconst_0

fstore_3

goto Label1

Label0:

fconst_1

fstore_3

Label1:

return

.end method

COMP3131/9102 Page 503 May 6, 2018

Page 41: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

fcmpg and fcmpl

op stack (before):

+--------------------

| ... value1 value2

+--------------------

op stack (after):

+-------- +--------- +----------

| ... 0 | ... -1 | ... 1

+-------- +--------- +---------

value1 = value2 value1 < value2 value1 > value2

• If either is NaN, fcmpg pushes 1 and fcmpl pushes -1.

• See JVM SPEC $7.5 for an explanation why the two

instructions are provided (https://docs.oracle.com/

javase/specs/jvms/se7/html/jvms-3.html#

jvms-3.5)

COMP3131/9102 Page 504 May 6, 2018

Page 42: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Type Conversion Instructions

1. Source:

int i = 1; // index 1

float f = i; // index 2

2. Jasmin code:

iconst_1

istore_1

iload_1

i2f

fstore 2

3. Only i2f is used in the VC compiler

4. i2c, i2b, f2i, etc. not used

COMP3131/9102 Page 505 May 6, 2018

Page 43: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Operand Stack Management Instructions

• Instructions:

– dup: duplicate the stack top operand

– pop: remove the stack top operand

– swap: swap the top two operands

– others: pop2, dup2, etc.

• Only the first two will be used in the VC compiler:

– dup: for translating a = b = ...

– pop: for translating expression statements such as 1;

COMP3131/9102 Page 506 May 6, 2018

Page 44: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example: dup in Translating Compound Assignments

1. Assignment expressions:

int i; \\ index 1

int j; \\ index 2

int k; \\ index 3

i = j = k = 1;

2. Jasmin code:

iconst_1

dup

istore_3

dup

istore_2

istore_1

COMP3131/9102 Page 507 May 6, 2018

Page 45: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example: pop in Translating VC Expression Statements

1. Assignment expressions:

int i; // index 1

1 + (i = 2);

2. Jasmin code:

iconst_1

iconst_2

dup

istore_1

iadd

pop

COMP3131/9102 Page 508 May 6, 2018

Page 46: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Object Creation and Manipulation

• Create a new class instance: new

• Access fields of classes: getstatic, putstatic, getfield, putfield

• Create a new array: newarray, anewarray, multianewarray(only the first is used)

• Load an array component onto the operand stack: iaload, faload,baload, caload, ...

• Store a value from the operand stack as an array component: iastore,fastore, bastore, castore, ...

• ...

COMP3131/9102 Page 509 May 6, 2018

Page 47: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example: Object Creation and Manipulation• Static and field variables:

public class StaticField {

static int i = 1;

int j = 1;

public static void main(String argv[]) {

StaticField o = new StaticField();

System.out.println(i);

System.out.println(o.j);

}

}

• Jasmin code (irrelevant lines removed)

.field static i I

.field j I

.method public static main([Ljava/lang/String;)V

.line 5

new StaticField

dup

invokespecial StaticField/<init>()V

COMP3131/9102 Page 510 May 6, 2018

Page 48: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

astore_1

.line 6

getstatic java.lang.System.out Ljava/io/PrintStream;

getstatic StaticField.i I

invokevirtual java/io/PrintStream/println(I)V

.line 7

getstatic java.lang.System.out Ljava/io/PrintStream;

aload_1

getfield StaticField.j I

invokevirtual java/io/PrintStream/println(I)V

Label0:

.line 8

return

.end method

COMP3131/9102 Page 511 May 6, 2018

Page 49: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

The Syntax for Field Instructions

• Syntax:

getstatic field-spec type-descriptor

where field-spec consists of a classname followed by a

field name.

• Examples:

getstatic java/lang/System/out Ljava/io/PrintStream;

getstatic StaticField/i I

getfield and putfield not used in the VC compiler

COMP3131/9102 Page 512 May 6, 2018

Page 50: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Arrays

• Java Statements // assuming a is at slot 1 (by compiler)

int a[] = new int[10];

a[1] = a[2] + 1;

• Bytecode:

bipush 10

newarray int

astore_1

aload_1

iconst_1

aload_1

iconst_2

iaload

iconst_1

iadd

iastore

COMP3131/9102 Page 513 May 6, 2018

Page 51: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Method Invocation Instructions

• Method calls:

invokestatic

invokevirtual

invokespecial // also known as invokenonvirtual

-- the instance initialisation method <init>

-- a private method of "this"

-- a method in a super class of "this"

invokeinterface

(why invokeinterface?

stackoverflow.com/questions/1504633/what-is-the-point-of-invokeinterface)

• Method returns:

return

ireturn

freturn

...

COMP3131/9102 Page 514 May 6, 2018

Page 52: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

The Syntax for Method Invocation Instructions

• The syntax for invokestatic/virtual/special

invokexx method-spec

where method-spec consists of a classname, a method

name and a descriptor.

• invokeinterface not used in the VC compiler

COMP3131/9102 Page 515 May 6, 2018

Page 53: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Method Invocation Instructions (Cont’d)

• invokestatic

op stack after

+----------------------- +--------------------

| ... arg1 arg2 ... argn | ... result (if any)

+----------------------- +-------------------

before

• invokevirtual and invokespecial

op stack after

+-------------------------- +--------------------

| ... objref arg1 ... argn | ... result (if any)

+-------------------------- +-------------------

before

• invokevirtual: on the dynamic type of objref• invokespecial: based on the static class of objref

• Note that programmer-defined operators (methods) are treatedexactly the same as the built-in operators (e.g., + and −)

COMP3131/9102 Page 516 May 6, 2018

Page 54: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example: Static Method Invocation

1. Met1.java:public class Met1 {

static int add(int i1, int i2) {return i1 + i2;

}public static void main(String argv[]) {

add(1, 2);}

}

2. Met1.j (irrelevant lines removed):.method static add(II)I .limit stack 2 .limit locals 2

iload_0iload_1iaddireturn

.end method

.method public static main([Ljava/lang/String;)V .limit stack 2 .limit locals 1iconst_1iconst_2invokestatic Met1/add(II)Ipopreturn

.end method

COMP3131/9102 Page 517 May 6, 2018

Page 55: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Example 9: Instance Method Invocation

1. Met2.java:public class Met2 {

int add(int i1, int i2) {

return i1 + i2;

}

public static void main(String argv[]) {

Met2 m = new Met2();

m.add(1, 2);

}

}

2. Met2.j (irrelevant lines removed):.method add(II)I .limit stack 2 .limit locals 3

iload_1

iload_2

iadd

ireturn

.end method

.method public static main([Ljava/lang/String;)V .limit stack 3 .limit locals 2

new Met2

dup

invokespecial Met2/<init>()V

astore_1

aload_1

iconst_1

iconst_2

invokevirtual Met2/add(II)I

return

.end method

COMP3131/9102 Page 518 May 6, 2018

Page 56: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Polymorphism: invokevirtual and invokespecial

public class Fruit {

public static void main(String argv[]) {

Apple apple = new Apple();

Fruit fruit = apple;

fruit.whoAmI();

}

void whoAmI() {

System.out.println("This is a fruit.");

}

}

class Apple extends Fruit {

void whoAmI() {

System.out.println("This is an apple.");

super.whoAmI();

}

}

COMP3131/9102 Page 519 May 6, 2018

Page 57: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Fruit.j;; Produced by JasminVisitor (BCEL package)

;; http://www.inf.fu-berlin.de/~dahm/JavaClass/

;; Mon Oct 09 16:09:47 GMT+10:00 2000

.source Fruit.java

.class public Fruit

.super java/lang/Object

.method public <init>()V

.limit stack 1

.limit locals 1

.var 0 is this LFruit; from Label0 to Label1

Label0:

.line 1

aload_0

invokespecial java/lang/Object/<init>()V

Label1:

return

.end method

.method public static main([Ljava/lang/String;)V

.limit stack 2

.limit locals 3

.var 0 is arg0 [Ljava/lang/String; from Label0 to Label1

Label0:

.line 4

new Apple

dup

invokespecial Apple/<init>()V

astore_1

.line 6

aload_1

COMP3131/9102 Page 520 May 6, 2018

Page 58: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

astore_2

.line 7

aload_2

invokevirtual Fruit/whoAmI()V <=== a virtual call

Label1:

.line 3

return

.end method

.method whoAmI()V

.limit stack 2

.limit locals 1

.var 0 is this LFruit; from Label0 to Label1

Label0:

.line 11

getstatic java.lang.System.out Ljava/io/PrintStream;

ldc "This is a fruit."

invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V

Label1:

.line 10

return

.end method

COMP3131/9102 Page 521 May 6, 2018

Page 59: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Apple.j.source Fruit.java

.class Apple

.super Fruit

.method <init>()V

.limit stack 1

.limit locals 1

.var 0 is this LApple; from Label0 to Label1

Label0:

.line 16

aload_0

invokespecial Fruit/<init>()V

Label1:

return

.end method

.method whoAmI()V

.limit stack 2

.limit locals 1

.var 0 is this LApple; from Label0 to Label1

Label0:

.line 18

getstatic java.lang.System.out Ljava/io/PrintStream;

ldc "This is an apple."

invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V

.line 19

aload_0

invokespecial Fruit/whoAmI()V <=== a static call

Label1:

.line 17

return

.end method

COMP3131/9102 Page 522 May 6, 2018

Page 60: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Jasmin Directives

• Jasmin home page

.source .class .super .limit .method

.field static .end .var .line

• Example: gcd.j (Slide 475)

COMP3131/9102 Page 523 May 6, 2018

Page 61: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Jasmin File Structure (syntax.bnf)Jasmin Syntax Jonathan Meyer, April 1996

This file contains a simplified BNF version of the Jasmin syntax.

jasmin_file ::=

’.class’ [ <access> ] <name> <break>

’.super’ <name> <break>

[ <fields> ]

[ <methods> ]

<fields> ::= <field> [ <field> ... ]

<field> ::=

’.field’ <access> <name> <signature> [ = <default> ] <break>

<default> ::= <int> | <quoted_string> | <float>

<methods> ::= <method> [ <method> ... ]

COMP3131/9102 Page 524 May 6, 2018

Page 62: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

<method> ::=

’.method’ <access> <name> <break>

[ <statements> ]

’.end’ ’method’ <break>

<statements> ::= <statement> [ <statement> ... ]

<statement> ::=

<directive> <break>

|

<instruction> <break>

|

<label> ’:’ <break>

<directive> ::=

’.limit’ ’stack’ <val>

|

’.limit’ ’locals’ <val>

|

’.throws’ <classname>

|

’.catch’ <classname> ’from’ <label1> ’to’ <label2> ’using’ <label3>

COMP3131/9102 Page 525 May 6, 2018

Page 63: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

<instruction> ::= <simple_instruction> | <complex_instruction>

<simple_instruction> ::=

<insn>

|

<insn> <int> <int>

|

<insn> <int>

|

<insn> <num>

|

<insn> <word>

|

<insn> <word> <int>

|

<insn> <word> <word>

|

<insn> <quoted_string>

<complex_instruction> ::=

<lookupswitch>

|

<tableswitch>

COMP3131/9102 Page 526 May 6, 2018

Page 64: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

<lookupswitch> ::=

lookupswitch <nl>

<int> : <label> <nl>

<int> : <label> <nl>

...

default : <label>

<tableswitch> ::=

tableswitch <low> <nl>

<label> <nl>

<label> <nl>

...

default : <label>

<access> ::= <access_item> [ <access_item> ... ]

<access_item> ::=

’public’ | ’private’ | ’protected’ | ’static’ | ’final’ |

’synchronized’ | ’volatile’ | ’transient’ | ’native’ |

’interface’ | ’abstract’

COMP3131/9102 Page 527 May 6, 2018

Page 65: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Understanding Jasmin Assembly Language

1. Read syntax.bnf to understand Jasmin’s syntax

2. Read Jasmin User Guide to Jasmin’s syntax

3. Read Jasmin instruction reference manual to understand itsinstructions (1-to-1 mapped to JVM instructions)

4. To under a particular feature, do the following:

(a) Design a Java program Test.java

(b) Run javac -g Test.java (-g turns on all debugging info)

(c) Run jasmind Test.class (jasmind runs java JasminVisitor Test.class)or javap -c Test

(d) Read Jasmin code in Test.j

COMP3131/9102 Page 528 May 6, 2018

Page 66: Jingling Xue - Computer Science and Engineeringcs3131/Lectures/lec9.pdf6e 01 00 16 28 5b 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 56 01 00 0a 53 6f 75 72 63 65 46 69

J. Xue✬

Reading (in Order of Increasing Importance)

• on-line JVM instructions

http://cs.au.dk/~mis/dOvs/jvmspec/ref-Java.html

• Play around the tools mentioned in this lecture:

– All available in the class account

– Install them on your PC if you have one

• The JVM Spec Book

– Chapter 3 (instructions)

– Chapter 7 (more examples on compiling Java)

• “Inside the JVM” book (Chapter 5)

Next Class: Java Bytecode Generation (Assignment 5)

COMP3131/9102 Page 529 May 6, 2018