<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    道常無(wú)名

    玄之又玄,眾眇之門

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 韩国18福利视频免费观看| 曰批免费视频播放在线看片二| 亚洲精品字幕在线观看| 亚洲av中文无码| 免费人成无码大片在线观看| 免费看国产一级片| 亚洲国产成人久久综合一区77| 久久亚洲国产伦理| 亚洲人成亚洲精品| 亚洲经典在线中文字幕| 亚洲成a人片在线观看中文app| 国产成人精品日本亚洲专一区 | 亚洲精品无码午夜福利中文字幕 | 亚洲伊人久久大香线蕉在观| 亚洲中文字幕乱码熟女在线| 在线aⅴ亚洲中文字幕| 视频免费在线观看| 国内精品久久久久影院免费| 免费人妻无码不卡中文字幕系| 在线看无码的免费网站| 午夜国产精品免费观看| 色视频色露露永久免费观看| 亚洲Av熟妇高潮30p| 色www免费视频| 国产麻豆一精品一AV一免费 | 国产精品V亚洲精品V日韩精品| 亚洲欧洲成人精品香蕉网| 91亚洲国产成人久久精品网站| 亚洲kkk4444在线观看| 欧亚一级毛片免费看| 国产成在线观看免费视频| 国产乱弄免费视频| 亚洲剧情在线观看| 国产在线精品免费aaa片| 免费a在线观看播放| 亚洲а∨天堂久久精品9966| 免费人妻无码不卡中文字幕系| 国产L精品国产亚洲区久久| 亚洲AV色无码乱码在线观看| 特色特黄a毛片高清免费观看| 免费一级毛片无毒不卡|