道常無名

          玄之又玄,眾眇之門

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            16 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks
          該指令用于對本地(局部)變量進行自增減操作。該指令第一參數(shù)為本地變量的編號,第二個參數(shù)為自增減的數(shù)量。
          比如對于代碼
                          int d=10;
          d++;
          d+=2;
          d--;
          其指令為
             2:  bipush 10
             4:  istore_2//在我的程序中是其所在非靜態(tài)函數(shù)的第2個變量(從0開始計數(shù)).
             5:  iinc 2, 1//在我的程序中是其所在非靜態(tài)函數(shù)的第2個變量(從0開始計數(shù)).
             8:  iinc 2, 2
             11: iinc 2, -1
          對本地變量所進行的編號,是對所有類型的本地變量進行的(并不按照類型分類)。
          對于非靜態(tài)函數(shù),第一變量是this,它是只讀的.還有函數(shù)傳入?yún)?shù)也算本地變量,在進行編號時,它是先于函數(shù)體的本地變量的。
          指令碼         助記符                                            說明
          0x84                  iinc                將指定int型變量增加指定值(i++, i--, i+=2)
          十、類型轉(zhuǎn)化系列
          該系列指令負責對棧頂數(shù)值類型進行類型轉(zhuǎn)化,并把結(jié)果壓入棧頂。
          指令碼         助記符                                           說明
          0x85                 i2l                      將棧頂int型數(shù)值強制轉(zhuǎn)換成long型數(shù)值并將結(jié)果壓入棧頂
          0x86                 i2f                      將棧頂int型數(shù)值強制轉(zhuǎn)換成float型數(shù)值并將結(jié)果壓入棧頂
          0x87                 i2d                     將棧頂int型數(shù)值強制轉(zhuǎn)換成double型數(shù)值并將結(jié)果壓入棧頂
          0x88                 l2i                      將棧頂long型數(shù)值強制轉(zhuǎn)換成int型數(shù)值并將結(jié)果壓入棧頂
          0x89                 l2f                      將棧頂long型數(shù)值強制轉(zhuǎn)換成float型數(shù)值并將結(jié)果壓入棧頂
          0x8a                 l2d                     將棧頂long型數(shù)值強制轉(zhuǎn)換成double型數(shù)值并將結(jié)果壓入棧頂
          0x8b                 f2i                      將棧頂float型數(shù)值強制轉(zhuǎn)換成int型數(shù)值并將結(jié)果壓入棧頂
          0x8c                 f2l                      將棧頂float型數(shù)值強制轉(zhuǎn)換成long型數(shù)值并將結(jié)果壓入棧頂
          0x8d                 f2d                     將棧頂float型數(shù)值強制轉(zhuǎn)換成double型數(shù)值并將結(jié)果壓入棧頂
          0x8e                 d2i                     將棧頂double型數(shù)值強制轉(zhuǎn)換成int型數(shù)值并將結(jié)果壓入棧頂
          0x8f                  d2l                     將棧頂double型數(shù)值強制轉(zhuǎn)換成long型數(shù)值并將結(jié)果壓入棧頂
          0x90                 d2f                     將棧頂double型數(shù)值強制轉(zhuǎn)換成float型數(shù)值并將結(jié)果壓入棧頂
          0x91                 i2b                     將棧頂int型數(shù)值強制轉(zhuǎn)換成byte型數(shù)值并將結(jié)果壓入棧頂
          0x92                 i2c                     將棧頂int型數(shù)值強制轉(zhuǎn)換成char型數(shù)值并將結(jié)果壓入棧頂
          0x93                 i2s                     將棧頂int型數(shù)值強制轉(zhuǎn)換成short型數(shù)值并將結(jié)果壓入棧頂
          十二、比較指令系列A
          該系列指令用于對棧頂非int型元素進行比較,并把結(jié)果壓入棧頂。
          比如,代碼:
          void test()
          {
          long a=11;
          long b=10;
          boolean result=(a>b);
          }
          其指令為:
          void test();
            Code:
             0: ldc2_w #16; //long 11l
             3: lstore_1
             4: ldc2_w #18; //long 10l
             7: lstore_3
             8: lload_1
             9: lload_3
             10: lcmp
             11: ifle 18
             14: iconst_1
             15: goto 19
             18: iconst_0
             19: istore 5
             21: return
          指令碼         助記符                                           說明
          0x94                 lcmp            比較棧頂兩long型數(shù)值大小,并將結(jié)果(1,0,-1)壓入棧頂
          0x95                 fcmpl           比較棧頂兩float型數(shù)值大小,并將結(jié)果(1,0,-1)壓入棧頂;當其中一個數(shù)值為NaN時,將-1壓入棧頂
          0x96                 fcmpg         比較棧頂兩float型數(shù)值大小,并將結(jié)果(1,0,-1)壓入棧頂;當其中一個數(shù)值為NaN時,將1壓入棧頂
          0x97                 dcmpl      比較棧頂兩double型數(shù)值大小,并將結(jié)果(1,0,-1)壓入棧頂;當其中一個數(shù)值為NaN時,將-1壓入棧頂
          0x98                 dcmpg       比較棧頂兩double型數(shù)值大小,并將結(jié)果(1,0,-1)壓入棧頂;當其中一個數(shù)值為NaN時,將1壓入棧頂
          十三、有條件跳轉(zhuǎn)指令系列A
          該系列指令用于對棧頂int型元素進行比較,根據(jù)結(jié)果進行跳轉(zhuǎn)。第一個參數(shù)為要跳轉(zhuǎn)到的代碼的地址(這里的地址是指其指令在函數(shù)內(nèi)是第幾個指令)。注意對于boolean型,其實是把它當做int型來處理的。另外對于引用比較使用的時,其實是對存儲的對象的地址進行比較。
          比如代碼:
          void test()
          {
          int a=11;
          int b=10;
          boolean result=(a>b);
          if(result)
          a+=2;
          if(!result)
          a+=2;
          if(a>0)
          a--;
          }
          其對應的指令為:
          void test();
            Code:
             0: bipush 11
             2: istore_1
             3: bipush 10
             5: istore_2
             6: iload_1
             7: iload_2
             8: if_icmple 15//如果比較結(jié)果小于0,就跳到第15個指令繼續(xù)執(zhí)行
             11: iconst_1
             12: goto 16
             15: iconst_0
             16: istore_3
             17: iload_3
             18: ifeq 24//如果結(jié)果為0時(即為false),就跳轉(zhuǎn)到第24個指令繼續(xù)執(zhí)行
             21: iinc 1, 2
             24: iload_3
             25: ifne 31//如果結(jié)果不為0時(即為true),就跳轉(zhuǎn)到第31個指令繼續(xù)執(zhí)行
             28: iinc 1, 2
             31: iload_1
             32: ifle 38
             35: iinc 1, -1//如果結(jié)果小于0時,就跳轉(zhuǎn)到第38個指令繼續(xù)執(zhí)行
             38: return
          指令碼         助記符                                           說明
          0x99                 ifeq                              當棧頂int型數(shù)值等于0時跳轉(zhuǎn)
          0x9a                 ifne                              當棧頂int型數(shù)值不等于0時跳轉(zhuǎn)
          0x9b                 iflt                                當棧頂int型數(shù)值小于0時跳轉(zhuǎn)
          0x9c                 ifge                              當棧頂int型數(shù)值大于等于0時跳轉(zhuǎn)
          0x9d                ifgt     當棧頂int型數(shù)值大于0時跳轉(zhuǎn)
          0x9e                ifle     當棧頂int型數(shù)值小于等于0時跳轉(zhuǎn)
          0x9f               if_icmpeq   比較棧頂兩int型數(shù)值大小,當結(jié)果等于0時跳轉(zhuǎn)
          0xa0              if_icmpne   比較棧頂兩int型數(shù)值大小,當結(jié)果不等于0時跳轉(zhuǎn)
          0xa1              if_icmplt   比較棧頂兩int型數(shù)值大小,當結(jié)果小于0時跳轉(zhuǎn)
          0xa2              if_icmpge   比較棧頂兩int型數(shù)值大小,當結(jié)果大于等于0時跳轉(zhuǎn)
          0xa3              if_icmpgt   比較棧頂兩int型數(shù)值大小,當結(jié)果大于0時跳轉(zhuǎn)
          0xa4              if_icmple   比較棧頂兩int型數(shù)值大小,當結(jié)果小于等于0時跳轉(zhuǎn)
          0xa5              if_acmpeq   比較棧頂兩引用型數(shù)值,當結(jié)果相等時跳轉(zhuǎn)
          0xa6               if_acmpne   比較棧頂兩引用型數(shù)值,當結(jié)果不相等時跳轉(zhuǎn)
          十四、無條件跳轉(zhuǎn)指令系列A
          該系列指令用于指令的跳轉(zhuǎn)。
          指令碼         助記符                                           說明
          0xa7                goto                                           無條件跳轉(zhuǎn)
          0xa8                  jsr                   跳轉(zhuǎn)至指定16位offset位置,并將jsr下一條指令地址壓入棧頂
          0xa9                 ret                   返回至本地變量指定的index的指令位置(一般與jsr, jsr_w聯(lián)合使用)
          0xaa              tableswitch         用于switch條件跳轉(zhuǎn),case值連續(xù)(可變長度指令)
          0xab              lookupswitch      用于switch條件跳轉(zhuǎn),case值不連續(xù)(可變長度指令)
          十五、返回指令系列
          該系列指令用于從函數(shù)中返回。如果有返回值的話,都把函數(shù)的返回值放在棧道中,以便它的調(diào)用方法取得它。
          return 10;這個語句其實對應的指令是兩條:   
          9: bipush 10
          11: ireturn
          指令碼         助記符                                           說明
          0xac                ireturn                                從當前方法返回int
          0xad                lreturn                                從當前方法返回long
          0xae                freturn                               從當前方法返回float
          0xaf                 dreturn                                從當前方法返回double
          0xb0                areturn                               從當前方法返回對象引用
          0xb1                return                                從當前方法返回void
          十六、域操作指令系列
          該系列指令用于對靜態(tài)域和非靜態(tài)域進行讀寫。該系列命令需要跟一個表明域編號的參數(shù),
          比如,在函數(shù)中對成員變量m進行;m++
          其指令為:
             0: aload_0
             1: dup
             2: getfield #2; //Field m:I
             5: iconst_1
             6: iadd
             7: putfield #2; //Field m:I
          指令碼         助記符                                           說明
          0xb2               getstatic                    獲取指定類的靜態(tài)域,并將其值壓入棧頂
          0xb3               putstatic                    用棧頂?shù)闹禐橹付ǖ念惖撵o態(tài)域賦值
          0xb4               getfield                      獲取指定類的實例域,并將其值壓入棧頂
          0xb5               putfield                       用棧頂?shù)闹禐橹付ǖ念惖膶嵗蛸x值
          十七、方法操作命令系列
          該系列指令用于對靜態(tài)方法和非靜方法進行調(diào)用。該系列命令需要跟一個表明方法編號的參數(shù)。
          如果方法有傳入?yún)?shù)的話,則需要先壓棧到棧頂。另外,方法的返回參數(shù)是保存到棧頂?shù)模虼宋覀兛梢酝ㄟ^棧道值取得方法的返回值。
          比如對于代碼
          void test() {int k=add(12,45);}
          其指令為
          void test();
            Code:
             0: aload_0
             1: bipush 12
             3: bipush 45
             5: invokevirtual #2; //Method add:(II)I
             8: istore_1
             9: return
          指令碼         助記符                                           說明
          0xb6              invokevirtual                              調(diào)用實例方法
          0xb7              invokespecial            調(diào)用超類構(gòu)造方法,實例初始化方法,私有方法
          0xb8              invokestatic                               調(diào)用靜態(tài)方法
          0xb9              invokeinterface                          調(diào)用接口方法
          十八、未歸類系列B
          此系列暫未歸類。
          指令碼         助記符                                           說明
          0xba -- 
          十九、new及數(shù)組系列
          該系列用于創(chuàng)建一個對象和數(shù)組。
          比如代碼:
          void test()
          {
          int ids[]=new int[5];
          Object objs[]=new Object[5];
          Object obj=new Object();
          Hello hello=new Hello();
          int len=objs.length;
          }
          其指令為:
          void test();
            Code:
             0: iconst_5
             1: newarray int
             3: astore_1
             4: iconst_5
             5: anewarray #2; //class java/lang/Object
             8: astore_2
             9: new #2; //class java/lang/Object
             12: dup
             13: invokespecial #1; //Method java/lang/Object."<init>":()V
             16: astore_3
             17: new #3; //class Hello
             20: dup
             21: invokespecial #4; //Method "<init>":()V
             24: astore 4
             26: aload_2
             27: arraylength
             28: istore 5
             30: return
          指令碼         助記符                                           說明
          0xbb                new                        創(chuàng)建一個對象,并將其引用值壓入棧頂
          0xbc              newarray                  創(chuàng)建一個指定原始類型(如int, float, char…)的數(shù)組,并將其引用值壓入棧頂
          0xbd              anewarray               創(chuàng)建一個引用型(如類,接口,數(shù)組)的數(shù)組,并將其引用值壓入棧頂
          0xbe              arraylength              獲得數(shù)組的長度值并壓入棧頂
          二十、異常拋出指令
          用于拋出異常。
          指令碼         助記符                                           說明
          0xbf                athrow                                將棧頂?shù)漠惓伋?/div>
          二十一、對象操作指令
          該系列指令用于操作對象。
          指令碼         助記符                                           說明
          0xc0              checkcast                   檢驗類型轉(zhuǎn)換,檢驗未通過將拋出ClassCastException
          0xc1              instanceof                  檢驗對象是否是指定的類的實例,如果是將1壓入棧頂,否則將0壓入棧頂
          0xc2              monitorenter               獲得對象的鎖,用于同步方法或同步塊
          0xc3              monitorexit                  釋放對象的鎖,用于同步方法或同步塊
          二十二、未歸類系列C
          此系列暫未歸類。
          指令碼         助記符                                           說明
          0xc4                wide                                               <待補充>
          二十三、new多維數(shù)組系列
          指令碼      助記符                                           說明
          0xc5       multianewarray 創(chuàng)建指定類型和指定維度的多維數(shù)組(執(zhí)行該指令時,操作棧中必須包含各維度的長度值),并將其引用值壓入棧頂
          二十四、有條件跳轉(zhuǎn)指令系列B
          該系列用于根據(jù)引用是否為空,來進行相應的指令跳轉(zhuǎn)。
          比如代碼:
          void test()
          {
          int i=0;
          Object obj=new Object();
          if(obj==null){ i=0; }
          if(obj!=null){ i=1; }
          }
          其對應的指令為:
          void test();
            Code:
             0: iconst_0
             1: istore_1
             2: new #2; //class java/lang/Object
             5: dup
             6: invokespecial #1; //Method java/lang/Object."<init>":()V
             9: astore_2
             10: aload_2
             11: ifnonnull 16
             14: iconst_0
             15: istore_1
             16: aload_2
             17: ifnull 22
             20: iconst_1
             21: istore_1
             22: return
          指令碼      助記符                                           說明
          0xc6            ifnull                                           為null時跳轉(zhuǎn)
          0xc7           ifnonnull                                      不為null時跳轉(zhuǎn)
          二十五、無條件跳轉(zhuǎn)指令系列B
          該系列指令用于進行無條件指令跳轉(zhuǎn)。
          指令碼      助記符                                           說明
          0xc8           goto_w                                 無條件跳轉(zhuǎn)(寬索引)
          0xc9           jsr_w                         跳轉(zhuǎn)至指定32位offset位置,并將jsr_w下一條指令地址壓入棧頂
          posted on 2016-09-23 18:54 Linuxmouse 閱讀(151) 評論(0)  編輯  收藏 所屬分類: Java

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 靖远县| 彩票| 尉犁县| 江阴市| 永城市| 余江县| 西和县| 佛冈县| 镇平县| 武清区| 盐城市| 济宁市| 姜堰市| 灌南县| 赣榆县| 周口市| 鹤峰县| 进贤县| 辽宁省| 嵊州市| 柏乡县| 个旧市| 衡阳市| 西丰县| 商洛市| 义马市| 玉田县| 威海市| 宁波市| 安顺市| 泰来县| 通江县| 廊坊市| 乳山市| 万盛区| 洛南县| 新竹市| 登封市| 莱州市| 获嘉县| 吉水县|