0xcafebabe (java byte codes)
TRANSCRIPT
David Evanshttp://www.cs.virginia.edu/evans
CS201j: Engineering SoftwareUniversity of VirginiaComputer Science
Lecture 18: 0xCAFEBABE (Java Byte Codes)
4 November 2003 CS 201J Fall 2003 2
Menu
• Running Programs– Crash Course in Architecture (CS333) – Crash Course in Compilers (CS571)
• Java Virtual Machine• Byte Codes
4 November 2003 CS 201J Fall 2003 3
Computer Architecture
Processor does computationMemory
stores bitsInput Devices (mouse, keyboard, accelerometer)
get input from user and environmentOutput Devices (display, speakers)
present output to user
4 November 2003 CS 201J Fall 2003 4
Central Processing Unit (CPU)
4 November 2003 CS 201J Fall 2003 5
Intel 4004
• First general purpose microprocessor, 1971
• 4-bit data• 46 instructions
– 8-bit instructions!
4 November 2003 CS 201J Fall 2003 6
PC Motherboard
From http://www.cyberiapc.com/hardwarebeg.htm
Memory
CPU
4 November 2003 CS 201J Fall 2003 7
Inside the CPU
• Registers• Loads and decodes instructions from
memory• ALU: Arithmetic Logic Unit
– Does arithmetic– Can only operate on values in registers– Must load values from memory into registers
before computing with them
4 November 2003 CS 201J Fall 2003 8
Compiler
• Translates a program in a high-level language into machine instructions
• Calling convention– How are parameters passed to functions– How is the stack managed to return
• Register allocation– Figure out how to use registers efficiently
4 November 2003 CS 201J Fall 2003 9
6: int max (int a, int b) {00401010 push ebp00401011 mov ebp,esp00401013 sub esp,40h00401016 push ebx00401017 push esi00401018 push edi00401019 lea edi,[ebp-40h]0040101C mov ecx,10h00401021 mov eax,0CCCCCCCCh00401026 rep stos dword ptr [edi]7: if (a > b) {00401028 mov eax,dword ptr [ebp+8]0040102B cmp eax,dword ptr [ebp+0Ch]0040102E jle max+25h (00401035)8: return b;00401030 mov eax,dword ptr [ebp+0Ch]00401033 jmp max+28h (00401038)9: } else {10: return a;00401035 mov eax,dword ptr [ebp+8]00401038 pop edi00401039 pop esi0040103A pop ebx0040103B mov esp,ebp0040103D pop ebp0040103E ret
int max (int a, int b) { if (a > b) { return b; } else { return a; }}
push instruction is 1 byte
In Visual C++, see assemblycode by running Debug, thenWindow | Disassembly
mov instruction is 2 bytes Dealing withfunction call:updating stack,moving arguments
Cleanup and return
4 November 2003 CS 201J Fall 2003 10
Java Virtual Machine
4 November 2003 CS 201J Fall 2003 11
Java Ring (1998)
4 November 2003 CS 201J Fall 2003 12
Java Card
4 November 2003 CS 201J Fall 2003 13
Java Virtual Machine
• Small and simple to implement• All VMs will run all programs the same
way• Secure
4 November 2003 CS 201J Fall 2003 14
Implementing the JavaVM
load class into memoryset the instruction pointer to point to the beginning of maindo { fetch the next instruction execute that instruction } while (there is more to do);
Some other issues we will talk about Thursday and next week:Verification – need to check byte codes satisfy security policyGarbage collection – need to reclaim unused storage
4 November 2003 CS 201J Fall 2003 15
Java Byte Codes
• Stack-based virtual machine• Small instruction set: 202 instructions (all
are 1 byte opcode + operands)– Intel x86: ~280 instructions (1 to 17 bytes
long!)• Memory is typed• Every Java class file begins with magic
number 3405691582 = 0xCAFEBABE in base 16
4 November 2003 CS 201J Fall 2003 16
Stack-Based Computation
• push – put something on the top of the stack
• pop – get and remove the top of the stack
Stackpush 2 2
push 3 3
addDoes 2 pops, pushes sum
5
4 November 2003 CS 201J Fall 2003 17
Some Java InstructionsOpcode Mnemonic Description
0 nop Does nothing
1 aconst_null Push null on the stack
3 iconst_0 Push int 0 on the stack
4 iconst_1 Push int 1 on the stack
…
4 November 2003 CS 201J Fall 2003 18
Some Java InstructionsOpcode Mnemonic Description
18 ldc <value> Push a one-word (4 bytes) constant onto the stack
ldc “Hello”ldc 201
Constant may be an int, float or String
The String is really a reference to an entry in the string constant table!
4 November 2003 CS 201J Fall 2003 19
ArithmeticOpcode Mnemonic Description
96 iadd Pops two integers from the stack and pushes their sum
iconst_2iconst_3iadd
4 November 2003 CS 201J Fall 2003 20
ArithmeticOpcode Mnemonic Description
96 iadd Pops two integers from the stack and pushes their sum
97 ladd Pops two long integers from the stack and pushes their sum
…106 fmul Pops two floats from the stack and
pushes their product
…119 dneg Pops a double from the stack, and
pushes its negation
4 November 2003 CS 201J Fall 2003 21
Java Byte Code Instructions
• 0: nop• 1-20: putting constants on the stack• 96-119: arithmetic on ints, longs, floats,
doubles
• What other kinds of instructions do we need?
4 November 2003 CS 201J Fall 2003 22
Other Instruction Classes• Control Flow (~20 instructions)
– if, goto, return• Method Calls (4 instructions)• Loading and Storing Variables (65
instructions)• Creating objects (1 instruction)• Using object fields (4 instructions)• Arrays (3 instructions)
4 November 2003 CS 201J Fall 2003 23
Control Flow
• ifeq <label>Pop an int off the stack. If it is zero, jump to the label. Otherwise, continue normally.
• if_icmple <label>Pop two ints off the stack. If the second one is <= the first one, jump to the label. Otherwise, continue normally.
4 November 2003 CS 201J Fall 2003 24
Method Calls• invokevirtual <method>
– Invokes the method <method> on the parameters and object on the top of the stack.
– Finds the appropriate method at run-time based on the actual type of the this object.
invokevirtual <Method void println(java.lang.String)>
4 November 2003 CS 201J Fall 2003 25
Method Calls• invokestatic <method>
– Invokes a static (class) method <method> on the parameters on the top of the stack.
– Finds the appropriate method at run-time based on the actual type of the this object.
4 November 2003 CS 201J Fall 2003 26
Example
public class Sample1 { static public void main (String args[]) { System.err.println ("Hello!"); System.exit (1); }}
4 November 2003 CS 201J Fall 2003 27
> javap -c Sample1Compiled from Sample1.javapublic class Sample1 extends java.lang.Object { public Sample1(); public static void main(java.lang.String[]);}
Method Sample1() 0 aload_0 1 invokespecial #1 <Method java.lang.Object()> 4 return
Method void main(java.lang.String[]) 0 getstatic #2 <Field java.io.PrintStream err> 3 ldc #3 <String "Hello!"> 5 invokevirtual #4 <Method void println(java.lang.String)> 8 iconst_1 9 invokestatic #5 <Method void exit(int)> 12 return
public class Sample1 { static public void main (String args[]) { System.err.println ("Hello!"); System.exit (1); } }
4 November 2003 CS 201J Fall 2003 28
Referencing Memory
• iload <varnum>– Pushes the int in local variable <varnum> (1
bytes) on the stack• istore <varnum>
– Pops the int on the top of the stack and stores it in local variable <varnum>
4 November 2003 CS 201J Fall 2003 29
Referencing ExampleMethod void main(java.lang.String[]) 0 iconst_2 1 istore_1 2 iconst_3 3 istore_2 4 iload_1 5 iload_2 6 iadd 7 istore_3 8 getstatic #2 <Field java.io.PrintStream err> 11 new #3 <Class java.lang.StringBuffer> 14 dup 15 invokespecial #4 <Method java.lang.StringBuffer()> 18 ldc #5 <String "c: "> 20 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)> 23 iload_3 24 invokevirtual #7 <Method java.lang.StringBuffer append(int)> 27 invokevirtual #8 <Method java.lang.String toString()> 30 invokevirtual #9 <Method void println(java.lang.String)> 33 return
public class Locals1 { static public void main (String args[]) { int a = 2; int b = 3; int c = a + b;
System.err.println ("c: " + c); } }
4 November 2003 CS 201J Fall 2003 30
Charge• PS6 will involve reading and writing Java
byte codes• Use javap –c <classname> to look at
what the javac compiler produces for your code
• Thursday: what would this program do?Method void main(java.lang.String[]) 0 iconst_2 1 iadd 2 return