2012-08-04 10 views
15

Soy un newbee en Java Bytecode. Estaba entendiendo el bytecode a través de algunos ejemplos, pero me quedé atrapado en un ejemplo.
Estos son mi código de bytes de Java y el archivo deComportamiento diferente de bytecode java

class SimpleAdd{ 
    public static void main(char args[]){ 
     int a,b,c,d; 
     a = 9; 
     b = 4; 
     c = 3; 
     d = a + b + c; 
     System.out.println(d); 
    } 
} 
Compiled from "SimpleAdd.java" 
class SimpleAdd extends java.lang.Object{ 
SimpleAdd(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(char[]); 
    Code: 
    0: bipush 9 
    2: istore_1 
    3: iconst_4 
    4: istore_2 
    5: iconst_3 
    6: istore_3 
    7: iload_1 
    8: iload_2 
    9: iadd 
    10: iload_3 
    11: iadd 
    12: istore 4 
    14: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 
    17: iload 4 
    19: invokevirtual #3; //Method java/io/PrintStream.println:(I)V 
    22: return 

} 

Sólo quiero saber por qué hay bipush 9 cuando tenemos la instrucción a = 9
Y en todo otro caso existe iconst.

+3

'bipush 9' empuja el entero literal 9 en la pila. 'istore_1' almacena ese valor en la variable local # 1. 'iconst_4' empuja un literal 4 en la pila, y lo hace en un byte contra dos para el' bipush', pero solo están los códigos de byte 'iconst_1' a' iconst_5' - no 'iconst_9'. –

Respuesta

20

iconst puede empujar los valores constantes -1 a 5. Es una instrucción de un solo byte.

bipush puede empujar valores constantes entre -128 y 127. Es una instrucción de dos bytes.

Para presionar 9, no puede usar iconst. No hay instrucción iconst_9.

0

no hay instrucción iconst_9

6

iconst_n is defined for n from 0 to 5

no hay iconst_9, así que hay que utilizar el equivalente (pero menos eficiente) bipush

+1

'iconst' admite valores [de menos uno a cinco] (http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.iconst_i) ... – Holger

0

la instrucción i_const solamente van de 0 a 5, por lo debe escupir la instilación presionando y almacenando

Cuestiones relacionadas