JVM指令集理解

1.凡是帶const的表示將什麼數據壓操作數棧。

  如:iconst_2 將int型數據2壓入到操作數棧

  aconst_null  將null值壓入棧。

2.bipush和sipush  表示將單字節或者短整形的常量值壓入操作數棧。

3.帶ldc的表示將什麼類型數據從常量池中壓入到操作數棧。

  如:ldc_w  將int或者flat或者string類型的數據壓入到操作數棧。(寬索引)

        ldc2_w  將long或者double類型的數據壓入到操作數棧。(寬索引)

4.凡是帶load的指令表示將某類型的局部變量數據壓入到操作數棧的棧頂。

   如:iload   表示將int類型的局部變量壓入到操作數棧的棧頂。

         aload  以a開頭的表示將引用類型的局部變量壓入到操作數棧的棧頂。

         iload_1 將局部變量數組裏面下標爲1的int類型的數據壓入到操作數棧。

         iaload   將int型數組的指定索引的值壓入到操作數棧。

5.凡是帶有store指令的表示將操作數棧頂的某類型的值存入指定的局部變量中。

   如:istore  表示將棧頂int類型的數據存入到指定的局部變量中。

         istore_3  表示將棧int類型的數據存入到局部變量數組的下標爲3的元素中。

6.pop  將棧頂數據彈出。pop2將棧頂的一個long或者double數據從棧頂彈出來。

7.dup  複製棧頂的數據並將複製的值也壓入到棧頂。

   dup2  複製棧頂一個long或者是double的數據並將複製的值也壓入到棧頂。

8.swap  將棧最頂端的兩個值互換。

9.iadd 將棧頂兩個int型的數據相加然後將結果再次的壓入到棧頂。

   isub 將棧頂兩個int型的數據相減然後將結果再次的壓入到棧頂。

   imul 將棧頂兩個int型的數據相乘然後將結果再次的壓入到棧頂。

   idiv  將棧頂兩個int型的數據相除然後將結果再次的壓入到棧頂。

   irem 將棧頂兩個int型的數據取模運算然後將結果再次的壓入到棧頂。.

   ineg 將棧頂的int數據取負將結果壓入到棧頂。

 

   iinc  將指定的int變量增加指定值(i++,i--,i+=2)

   i2l   將棧頂int類型數據強制轉換成long型將結果壓入到棧頂。

   lcmp  將棧頂兩long型數據的大小進行比較,並將結果(1,0,-1)壓入棧頂。

10。以if開頭的指令都是跳轉指令。

11。tableswitch、lookupswitch  表示用switch條件跳轉。

12。ireturn  從當前方法返回int型數據。

13。getstatic  獲取指定類的靜態域,將將結果壓入到棧頂。

       putstatic 爲指定的類的靜態域賦值。

       getfield   獲取指定類的實例變量,將結果壓入到棧頂。

       putfield   爲指定類的實例變量賦值。

       invokevirtual  調用實例方法。

       invokespacial  調用超類構造方法,實例初始化方法,私有方法。

       invokestatic  調用靜態方法。

       invokeinterface  調用接口方法。

       new 創建一個對象,並將其引用壓入到棧頂。

       newarray  創建一個原始類型的數組,並將其引用壓入到棧頂。

       arraylength   獲得一個數組的長度,將將結果壓入到棧頂。

       athrow   將棧頂的異常拋出。

       checkcast  檢驗類型轉換,轉換未通過,將拋出ClassCastException.

       instanceof 檢驗對象是否是指定的類的實例,如果是將1壓入棧頂,否則將0壓入棧頂

       monitorenter   獲得對象的鎖,用於同步方法或同步塊  

       monitorexit    釋放對象的鎖,用於同步方法或同步塊

       ifnull    爲null時跳轉

       ifnonnull   不爲null時跳轉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章