Reverse Engineering for Beginners

(avery) #1

CHAPTER 54. JAVA CHAPTER 54. JAVA


25: invokevirtual #4 // Method java/io/PrintStream.print:(Ljava/lang/⤦
ÇString;)V
28: iload_0
29: bipush 100
31: if_icmple 42
34: getstatic #2 // Field java/lang/System.out:Ljava/io/⤦
ÇPrintStream;
37: ldc #6 // String >100
39: invokevirtual #4 // Method java/io/PrintStream.print:(Ljava/lang/⤦
ÇString;)V
42: iload_0
43: ifne 54
46: getstatic #2 // Field java/lang/System.out:Ljava/io/⤦
ÇPrintStream;
49: ldc #7 // String ==0
51: invokevirtual #4 // Method java/io/PrintStream.print:(Ljava/lang/⤦
ÇString;)V
54: return

if_icmpgepops two values and compares them. If the second one is larger than the first, a jump to offset 14 is performed.
if_icmpneandif_icmplework just the same, but impement different conditions.


There is also aifneinstruction at offset 43. Its name is misnomer, it would’ve be better to name itifnz(jump if the value
atTOSis not zero). And that is what it does: it jumps to offset 54 if the input value is not zero. If zero,the execution flow
proceeds to offset 46, where the “==0” string is printed.


N.B.:JVMhas no unsigned data types, so the comparison instructions operate only on signed integer values.


54.9 Passing arguments.


Let’s extend ourmin()/max()example:


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


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

public static void main(String[] args)
{
int a=123, b=456;
int max_value=max(a, b);
int min_value=min(a, b);
System.out.println(min_value);
System.out.println(max_value);
}
}


Here ismain()function code:


public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=5, args_size=1
0: bipush 123
2: istore_1
3: sipush 456
6: istore_2
Free download pdf