Assembly Language for Beginners

(nextflipdebug2) #1

4.1. JAVA


public int my_rand();
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #2 // Field rand_state:I
3: getstatic #3 // Field RNG_a:I
6: imul
7: putstatic #2 // Field rand_state:I
10: getstatic #2 // Field rand_state:I
13: getstatic #4 // Field RNG_c:I
16: iadd
17: putstatic #2 // Field rand_state:I
20: getstatic #2 // Field rand_state:I
23: sipush 32767
26: iand
27: ireturn

It just loads all the values from the object’s fields, does the operations and updatesrand_state’s value
using theputstaticinstruction.


At offset 20,rand_stateis reloaded again (because it has been dropped from the stack before, by
putstatic).


This looks like non-efficient code, but be sure, theJVMis usually good enough to optimize such things
really well.


4.1.8 Conditional jumps


Now let’s proceed to conditional jumps.


public class abs
{
public static int abs(int a)
{
if (a<0)
return -a;
return a;
}
}


public static int abs(int);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: iload_0
1: ifge 7
4: iload_0
5: ineg
6: ireturn
7: iload_0
8: ireturn

ifgejumps to offset 7 if the value atTOSis greater or equal to 0.


Don’t forget, anyifXXinstruction pops the value (to be compared) from the stack.


inegjust negates value atTOS.


Another example:


public static int min (int a, int b)
{
if (a>b)
return b;
return a;
}

We get:

Free download pdf