使用jvm指令解析局部变量的加减乘除

基础指令说明

  • iconst类指令说明 (部分志指令):
该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈顶时,才使用如下的命令。比如对应int型才该方式只能把-1,0,1,2,3,4,5(分别采用iconst_m1,iconst_0, iconst_1, iconst_2, iconst_3,iconst_4, iconst_5)送到栈顶。对于int型,其他的数值请使用push系列命令(比如bipush)

 | 指令码  | 助记符 |      说明         |
 | ------------- | ------------- |------------- |
 | 0x02  | iconst_m1  | 将int型(-1)推送至栈顶  |
 | 0x03  | iconst_0  | 将int型(0)推送至栈顶  |
 | 0x04  | iconst_1  | 将int型(1)推送至栈顶  |
 | 0x05  | iconst_2  | 将int型(2)推送至栈顶  |
 | 0x06  | iconst_3  | 将int型(3)推送至栈顶  |
 | 0x07  | iconst_4  | 将int型(4)推送至栈顶  |
  • store系列
该系列命令负责把栈顶的值存入本地变量。这里的本地变量不仅可以是数值类型,还可以是引用类型。如果是把栈顶的值存入到前四个本地变量的话,采用的是istore_0,istore_1,istore_2,istore_3(它们分别表示第0,1,2,3个本地整形变量)这种不到参数的简化命令形式。如果是把栈顶的值存入到第四个以上本地变量的话,将使用istore命令这种形式,在它后面给一参数,以表示是把栈顶的值存入到第几个(从0开始)本地变量中。对本地变量所进行的编号,是对所有类型的本地变量进行的(并不按照类型分类)。对于非静态函数,第一变量是this,它是只读的.还有函数传入参数也算本地变量,在进行编号时,它是先于函数体的本地变量的。
  • push系列
该系列命令负责把一个整形数字(长度比较小)送到到栈顶。该系列命令有一个参数,用于指定要送到栈顶的数字。注意该系列命令只能操作一定范围内的整形数值,超出该范围的使用将使用ldc命令系列。
  • load系列(部分志指令)
 | 指令码  | 助记符 |      说明         |
 | ------------- | ------------- |------------- |
|0x15 |iload |将指定的int型本地变量推送至栈顶|
|0x16 |lload |将指定的long型本地变量推送至栈顶|
|0x17 |fload |将指定的float型本地变量推送至栈顶|
|0x18 |dload |将指定的double型本地变量推送至栈顶|
|0x19 |aload |将指定的引用类型本地变量推送至栈顶|
|0x1a |iload_0 |将第一个int型本地变量推送至栈顶|
|0x1b |iload_1 |将第二个int型本地变量推送至栈顶|
|0x1c |iload_2 |将第三个int型本地变量推送至栈顶|
|0x1d |iload_3 |将第四个int型本地变量推送至栈顶|
| ------------- | ------------- |------------- |
|0x2e |iaload |将int型数组指定索引的值推送至栈顶|
|0x2f |laload |将long型数组指定索引的值推送至栈顶|
|0x30 |faload |将float型数组指定索引的值推送至栈顶|
|0x31 |daload |将double型数组指定索引的值推送至栈顶|
  • 栈顶元素数学操作及移位操作系列(部分志指令)
| 指令码  | 助记符 |      说明         |
 | ------------- | ------------- |------------- |
 |0x5f  |swap  |将栈最顶端的两个数值互换(数值不能是long或
 double类型的)
 |0x60  |iadd  |将栈顶两int型数值相加并将结果压入栈顶
 |0x61  |ladd  |将栈顶两long型数值相加并将结果压入栈顶
 |0x62  |fadd  |将栈顶两float型数值相加并将结果压入栈顶
 |0x63  |dadd  |将栈顶两double型数值相加并将结果压入栈顶
 |0x64  |isub  |将栈顶两int型数值相减并将结果压入栈顶
 |0x65  |lsub  |将栈顶两long型数值相减并将结果压入栈顶
 |0x66  |fsub  |将栈顶两float型数值相减并将结果压入栈顶
 |0x67  |dsub  |将栈顶两double型数值相减并将结果压入栈顶

基础类

class Test{
  public static void main(String args[]){
   int a=1;
   int b=2;
   int c=(a+b)*101;
   int d = c-20;
   System.out.print(d);
  }
}
  • 反编译
javac Test.java
javap -c Test.class > Test.txt # 得到反编译后的代码
  • 得到编译后的结果:
Compiled from "Test.java"
class Test {
  Test();
    Code:
       0: aload_0  第一变量是this,
       1: invokespecial #1   调用超类构造方法,实例初始化方法,私
有方法                // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1    第一个变量压入栈顶
       1: istore_1    将栈顶值存入第一个本地变量
       2: iconst_2    第二个变量压入栈顶
       3: istore_2    将栈顶值存入第二个本地变量
       4: iload_1     第一个本地变量送到栈顶
       5: iload_2     第二个本地变量送到栈顶
       6: iadd        add顾名思义 加法运算 (a+b)
       7: bipush        101  将101送到栈顶
       9: imul       将栈顶两int型数值相乘并将结果压入栈顶 即(a+b)* 101
      10: istore_3    将第三个变量存入本地变量 ---c的值
      11: iload_3     第三个本地变量入栈顶
      12: bipush        20  将20压入栈顶
      14: isub            将栈顶两int型数值相减并将结果压入栈顶  减法运算
      15: istore        4   将栈顶int型数值存入指定本地变量 即d的值
      17: getstatic     #2      获取指定类的静态域,并将其值压入栈顶             // Field java/lang/System.out:Ljava/io/PrintStream;
      20: iload         4   将指定的int型本地变量推送至栈顶 即d的值
      22: invokevirtual #3         调用实例方法         // Method java/io/PrintStream.print:(I)V
      25: return  从当前方法返回void
} 

来源:苏克分享公众号

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容