asm学习(2)--运算与逻辑

想通过asm的代码生成来写.class文件至少得了解下面的东西。

  1.ICONST_x相当于常量,前面的I是指int型,还有其它型的CONST,这个量为比如ICONST_1就是指1,对于后面不同的操作,它会再指定实际的类型。使用visitInsn(ICONST_1)就是说定义了一个为1的临时量压到栈里面,但不会定义一个变量。-1<=ICONST<=5;如果要定义大点的数就使用visitVarInsn(BIPUSH, 10)

  2.ISTORE是把栈顶的临时量保存成变量如visitVarInsn(ISTORE, 1)保存在位置1,如果想把变量值拿出来用如下进行,把位置1的值拿出来放到栈顶visitVarInsn(ILOAD, 1);

  3.visitIincInsn(1, 1);对位置是1的变量进行自增,自增幅度为后面参数所定义的1。

  4.对于栈的操作还有DUP,POP,SWAP等命令。需要理解栈的存取。

  5.for循环例子代码,使用了两个label来完成,开始初学对字节码不明白,所以先从.class文件反译成字节码来进行。相当于实现:

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

  for(int i = 1; i >= 10;) {

     i++;

     byte byte0 = 2;

  }

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

  Label forLabel = new Label();

  Label endLabel = new Label();

  mw.visitInsn(ICONST_1);

  mw.visitVarInsn(ISTORE, 1);

  mw.visitLabel(forLabel);

  mw.visitVarInsn(ILOAD, 1);

  mw.visitVarInsn(BIPUSH, 10);

  mw.visitJumpInsn(IF_ICMPLT, endLabel);

  mw.visitIincInsn(1, 1);// ++操作

  mw.visitInsn(ICONST_2);

  mw.visitVarInsn(ISTORE, 2); //这循环体内进做了 int c = 2的操作

  mw.visitJumpInsn(GOTO, forLabel);

  mw.visitLabel(endLabel);

  5.条件语句例子:没用使用GOTO,相当于实现

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

  int i = 3;

  if(i >= 0)

     i = 1 + i;

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

  Label label = new Label();

  mw.visitInsn(ICONST_3);

  mw.visitVarInsn(ISTORE, 1);

  mw.visitVarInsn(ILOAD, 1);

  mw.visitJumpInsn(IFLT, label);

  mw.visitInsn(ICONST_1);

  mw.visitIntInsn(ILOAD, 1);

  mw.visitInsn(IADD);

  mw.visitVarInsn(ISTORE, 1);

  mw.visitLabel(label);

 

你可能感兴趣的:(ASM)