1. 程式人生 > >JVM指令集及各指令的詳細使用說明

JVM指令集及各指令的詳細使用說明

  1. 指令碼 助記符    說明  
  2. 0x00 nop      什麼都不做  
  3. 0x01 aconst_null 將null推送至棧頂  
  4. 0x02 iconst_m1   將int型-1推送至棧頂  
  5. 0x03 iconst_0   將int型0推送至棧頂  
  6. 0x04 iconst_1   將int型1推送至棧頂  
  7. 0x05 iconst_2   將int型2推送至棧頂  
  8. 0x06 iconst_3   將int型3推送至棧頂  
  9. 0x07 iconst_4   將int型4推送至棧頂  
  10. 0x08 iconst_5   將int型5推送至棧頂  
  11. 0x09 lconst_0   將long型0推送至棧頂  
  12. 0x0a lconst_1   將long型1推送至棧頂  
  13. 0x0b fconst_0   將float型0推送至棧頂  
  14. 0x0c fconst_1   將float型1推送至棧頂  
  15. 0x0d fconst_2   將float型2推送至棧頂  
  16. 0x0e dconst_0   將double型0推送至棧頂  
  17. 0x0f dconst_1   將double型1推送至棧頂  
  18. 0x10 bipush    將單位元組的常量值(-128~127)推送至棧頂  
  19. 0x11 sipush    將一個短整型常量值(-32768~32767)推送至棧頂  
  20. 0x12 ldc      將int, float或String型常量值從常量池中推送至棧頂  
  21. 0x13 ldc_w     將int, float或String型常量值從常量池中推送至棧頂(寬索引)  
  22. 0x14 ldc2_w    將long或double型常量值從常量池中推送至棧頂(寬索引)  
  23. 0x15 iload     將指定的int型本地變數推送至棧頂  
  24. 0x16 lload     將指定的long型本地變數推送至棧頂  
  25. 0x17 fload     將指定的float型本地變數推送至棧頂  
  26. 0x18 dload     將指定的double型本地變數推送至棧頂  
  27. 0x19 aload     將指定的引用型別本地變數推送至棧頂  
  28. 0x1a iload_0    將第一個int型本地變數推送至棧頂  
  29. 0x1b iload_1    將第二個int型本地變數推送至棧頂  
  30. 0x1c iload_2    將第三個int型本地變數推送至棧頂  
  31. 0x1d iload_3    將第四個int型本地變數推送至棧頂  
  32. 0x1e lload_0    將第一個long型本地變數推送至棧頂  
  33. 0x1f lload_1    將第二個long型本地變數推送至棧頂  
  34. 0x20 lload_2    將第三個long型本地變數推送至棧頂  
  35. 0x21 lload_3    將第四個long型本地變數推送至棧頂  
  36. 0x22 fload_0    將第一個float型本地變數推送至棧頂  
  37. 0x23 fload_1    將第二個float型本地變數推送至棧頂  
  38. 0x24 fload_2    將第三個float型本地變數推送至棧頂  
  39. 0x25 fload_3    將第四個float型本地變數推送至棧頂  
  40. 0x26 dload_0    將第一個double型本地變數推送至棧頂  
  41. 0x27 dload_1    將第二個double型本地變數推送至棧頂  
  42. 0x28 dload_2    將第三個double型本地變數推送至棧頂  
  43. 0x29 dload_3    將第四個double型本地變數推送至棧頂  
  44. 0x2a aload_0    將第一個引用型別本地變數推送至棧頂  
  45. 0x2b aload_1    將第二個引用型別本地變數推送至棧頂  
  46. 0x2c aload_2    將第三個引用型別本地變數推送至棧頂  
  47. 0x2d aload_3    將第四個引用型別本地變數推送至棧頂  
  48. 0x2e iaload    將int型陣列指定索引的值推送至棧頂  
  49. 0x2f laload    將long型陣列指定索引的值推送至棧頂  
  50. 0x30 faload    將float型陣列指定索引的值推送至棧頂  
  51. 0x31 daload    將double型陣列指定索引的值推送至棧頂  
  52. 0x32 aaload    將引用型陣列指定索引的值推送至棧頂  
  53. 0x33 baload    將boolean或byte型陣列指定索引的值推送至棧頂  
  54. 0x34 caload    將char型陣列指定索引的值推送至棧頂  
  55. 0x35 saload    將short型陣列指定索引的值推送至棧頂  
  56. 0x36 istore    將棧頂int型數值存入指定本地變數  
  57. 0x37 lstore    將棧頂long型數值存入指定本地變數  
  58. 0x38 fstore    將棧頂float型數值存入指定本地變數  
  59. 0x39 dstore    將棧頂double型數值存入指定本地變數  
  60. 0x3a astore    將棧頂引用型數值存入指定本地變數  
  61. 0x3b istore_0   將棧頂int型數值存入第一個本地變數  
  62. 0x3c istore_1   將棧頂int型數值存入第二個本地變數  
  63. 0x3d istore_2   將棧頂int型數值存入第三個本地變數  
  64. 0x3e istore_3   將棧頂int型數值存入第四個本地變數  
  65. 0x3f lstore_0   將棧頂long型數值存入第一個本地變數  
  66. 0x40 lstore_1   將棧頂long型數值存入第二個本地變數  
  67. 0x41 lstore_2   將棧頂long型數值存入第三個本地變數  
  68. 0x42 lstore_3   將棧頂long型數值存入第四個本地變數  
  69. 0x43 fstore_0   將棧頂float型數值存入第一個本地變數  
  70. 0x44 fstore_1   將棧頂float型數值存入第二個本地變數  
  71. 0x45 fstore_2   將棧頂float型數值存入第三個本地變數  
  72. 0x46 fstore_3   將棧頂float型數值存入第四個本地變數  
  73. 0x47 dstore_0   將棧頂double型數值存入第一個本地變數  
  74. 0x48 dstore_1   將棧頂double型數值存入第二個本地變數  
  75. 0x49 dstore_2   將棧頂double型數值存入第三個本地變數  
  76. 0x4a dstore_3   將棧頂double型數值存入第四個本地變數  
  77. 0x4b astore_0   將棧頂引用型數值存入第一個本地變數  
  78. 0x4c astore_1   將棧頂引用型數值存入第二個本地變數  
  79. 0x4d astore_2   將棧頂引用型數值存入第三個本地變數  
  80. 0x4e astore_3   將棧頂引用型數值存入第四個本地變數  
  81. 0x4f iastore    將棧頂int型數值存入指定陣列的指定索引位置  
  82. 0x50 lastore    將棧頂long型數值存入指定陣列的指定索引位置  
  83. 0x51 fastore    將棧頂float型數值存入指定陣列的指定索引位置  
  84. 0x52 dastore    將棧頂double型數值存入指定陣列的指定索引位置  
  85. 0x53 aastore    將棧頂引用型數值存入指定陣列的指定索引位置  
  86. 0x54 bastore    將棧頂boolean或byte型數值存入指定陣列的指定索引位置  
  87. 0x55 castore    將棧頂char型數值存入指定陣列的指定索引位置  
  88. 0x56 sastore    將棧頂short型數值存入指定陣列的指定索引位置  
  89. 0x57 pop      將棧頂數值彈出 (數值不能是long或double型別的)  
  90. 0x58 pop2     將棧頂的一個(long或double型別的)或兩個數值彈出(其它)  
  91. 0x59 dup      複製棧頂數值並將複製值壓入棧頂  
  92. 0x5a dup_x1    複製棧頂數值並將兩個複製值壓入棧頂  
  93. 0x5b dup_x2    複製棧頂數值並將三個(或兩個)複製值壓入棧頂  
  94. 0x5c dup2     複製棧頂一個(long或double型別的)或兩個(其它)數值並將複製值壓入棧頂  
  95. 0x5d dup2_x1    <待補充>  
  96. 0x5e dup2_x2    <待補充>  
  97. 0x5f swap     將棧最頂端的兩個數值互換(數值不能是long或double型別的)  
  98. 0x60 iadd     將棧頂兩int型數值相加並將結果壓入棧頂  
  99. 0x61 ladd     將棧頂兩long型數值相加並將結果壓入棧頂  
  100. 0x62 fadd     將棧頂兩float型數值相加並將結果壓入棧頂  
  101. 0x63 dadd     將棧頂兩double型數值相加並將結果壓入棧頂  
  102. 0x64 isub     將棧頂兩int型數值相減並將結果壓入棧頂  
  103. 0x65 lsub     將棧頂兩long型數值相減並將結果壓入棧頂  
  104. 0x66 fsub     將棧頂兩float型數值相減並將結果壓入棧頂  
  105. 0x67 dsub     將棧頂兩double型數值相減並將結果壓入棧頂  
  106. 0x68 imul     將棧頂兩int型數值相乘並將結果壓入棧頂  
  107. 0x69 lmul     將棧頂兩long型數值相乘並將結果壓入棧頂  
  108. 0x6a fmul     將棧頂兩float型數值相乘並將結果壓入棧頂  
  109. 0x6b dmul     將棧頂兩double型數值相乘並將結果壓入棧頂  
  110. 0x6c idiv     將棧頂兩int型數值相除並將結果壓入棧頂  
  111. 0x6d ldiv     將棧頂兩long型數值相除並將結果壓入棧頂  
  112. 0x6e fdiv     將棧頂兩float型數值相除並將結果壓入棧頂  
  113. 0x6f ddiv     將棧頂兩double型數值相除並將結果壓入棧頂  
  114. 0x70 irem     將棧頂兩int型數值作取模運算並將結果壓入棧頂  
  115. 0x71 lrem     將棧頂兩long型數值作取模運算並將結果壓入棧頂  
  116. 0x72 frem     將棧頂兩float型數值作取模運算並將結果壓入棧頂  
  117. 0x73 drem     將棧頂兩double型數值作取模運算並將結果壓入棧頂  
  118. 0x74 ineg     將棧頂int型數值取負並將結果壓入棧頂  
  119. 0x75 lneg     將棧頂long型數值取負並將結果壓入棧頂  
  120. 0x76 fneg     將棧頂float型數值取負並將結果壓入棧頂  
  121. 0x77 dneg     將棧頂double型數值取負並將結果壓入棧頂  
  122. 0x78 ishl     將int型數值左移位指定位數並將結果壓入棧頂  
  123. 0x79 lshl     將long型數值左移位指定位數並將結果壓入棧頂  
  124. 0x7a ishr     將int型數值右(符號)移位指定位數並將結果壓入棧頂  
  125. 0x7b lshr     將long型數值右(符號)移位指定位數並將結果壓入棧頂  
  126. 0x7c iushr     將int型數值右(無符號)移位指定位數並將結果壓入棧頂  
  127. 0x7d lushr     將long型數值右(無符號)移位指定位數並將結果壓入棧頂  
  128. 0x7e iand     將棧頂兩int型數值作“按位與”並將結果壓入棧頂  
  129. 0x7f land     將棧頂兩long型數值作“按位與”並將結果壓入棧頂  
  130. 0x80 ior      將棧頂兩int型數值作“按位或”並將結果壓入棧頂  
  131. 0x81 lor      將棧頂兩long型數值作“按位或”並將結果壓入棧頂  
  132. 0x82 ixor     將棧頂兩int型數值作“按位異或”並將結果壓入棧頂  
  133. 0x83 lxor     將棧頂兩long型數值作“按位異或”並將結果壓入棧頂  
  134. 0x84 iinc     將指定int型變數增加指定值(i++, i--, i+=2)  
  135. 0x85 i2l      將棧頂int型數值強制轉換成long型數值並將結果壓入棧頂  
  136. 0x86 i2f      將棧頂int型數值強制轉換成float型數值並將結果壓入棧頂  
  137. 0x87 i2d      將棧頂int型數值強制轉換成double型數值並將結果壓入棧頂  
  138. 0x88 l2i      將棧頂long型數值強制轉換成int型數值並將結果壓入棧頂  
  139. 0x89 l2f      將棧頂long型數值強制轉換成float型數值並將結果壓入棧頂  
  140. 0x8a l2d      將棧頂long型數值強制轉換成double型數值並將結果壓入棧頂  
  141. 0x8b f2i      將棧頂float型數值強制轉換成int型數值並將結果壓入棧頂  
  142. 0x8c f2l      將棧頂float型數值強制轉換成long型數值並將結果壓入棧頂  
  143. 0x8d f2d      將棧頂float型數值強制轉換成double型數值並將結果壓入棧頂  
  144. 0x8e d2i      將棧頂double型數值強制轉換成int型數值並將結果壓入棧頂  
  145. 0x8f d2l      將棧頂double型數值強制轉換成long型數值並將結果壓入棧頂  
  146. 0x90 d2f      將棧頂double型數值強制轉換成float型數值並將結果壓入棧頂  
  147. 0x91 i2b      將棧頂int型數值強制轉換成byte型數值並將結果壓入棧頂  
  148. 0x92 i2c      將棧頂int型數值強制轉換成char型數值並將結果壓入棧頂  
  149. 0x93 i2s      將棧頂int型數值強制轉換成short型數值並將結果壓入棧頂  
  150. 0x94 lcmp     比較棧頂兩long型數值大小,並將結果(1,0,-1)壓入棧頂  
  151. 0x95 fcmpl     比較棧頂兩float型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值為NaN時,將-1壓入棧頂  
  152. 0x96 fcmpg     比較棧頂兩float型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值為NaN時,將1壓入棧頂  
  153. 0x97 dcmpl     比較棧頂兩double型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值為NaN時,將-1壓入棧頂  
  154. 0x98 dcmpg     比較棧頂兩double型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值為NaN時,將1壓入棧頂  
  155. 0x99 ifeq     當棧頂int型數值等於0時跳轉  
  156. 0x9a ifne     當棧頂int型數值不等於0時跳轉  
  157. 0x9b iflt     當棧頂int型數值小於0時跳轉  
  158. 0x9c ifge     當棧頂int型數值大於等於0時跳轉  
  159. 0x9d ifgt     當棧頂int型數值大於0時跳轉  
  160. 0x9e ifle     當棧頂int型數值小於等於0時跳轉  
  161. 0x9f if_icmpeq   比較棧頂兩int型數值大小,當結果等於0時跳轉  
  162. 0xa0 if_icmpne   比較棧頂兩int型數值大小,當結果不等於0時跳轉  
  163. 0xa1 if_icmplt   比較棧頂兩int型數值大小,當結果小於0時跳轉  
  164. 0xa2 if_icmpge   比較棧頂兩int型數值大小,當結果大於等於0時跳轉  
  165. 0xa3 if_icmpgt   比較棧頂兩int型數值大小,當結果大於0時跳轉  
  166. 0xa4 if_icmple   比較棧頂兩int型數值大小,當結果小於等於0時跳轉  
  167. 0xa5 if_acmpeq   比較棧頂兩引用型數值,當結果相等時跳轉  
  168. 0xa6 if_acmpne   比較棧頂兩引用型數值,當結果不相等時跳轉  
  169. 0xa7 goto     無條件跳轉  
  170. 0xa8 jsr      跳轉至指定16位offset位置,並將jsr下一條指令地址壓入棧頂  
  171. 0xa9 ret      返回至本地變數指定的index的指令位置(一般與jsr, jsr_w聯合使用)  
  172. 0xaa tableswitch    用於switch條件跳轉,case值連續(可變長度指令)  
  173. 0xab lookupswitch   用於switch條件跳轉,case值不連續(可變長度指令)  
  174. 0xac ireturn    從當前方法返回int  
  175. 0xad lreturn    從當前方法返回long  
  176. 0xae freturn    從當前方法返回float  
  177. 0xaf dreturn    從當前方法返回double  
  178. 0xb0 areturn    從當前方法返回物件引用  
  179. 0xb1 return    從當前方法返回void  
  180. 0xb2 getstatic   獲取指定類的靜態域,並將其值壓入棧頂  
  181. 0xb3 putstatic   為指定的類的靜態域賦值  
  182. 0xb4 getfield   獲取指定類的例項域,並將其值壓入棧頂  
  183. 0xb5 putfield   為指定的類的例項域賦值  
  184. 0xb6 invokevirtual   呼叫例項方法  
  185. 0xb7 invokespecial   呼叫超類構造方法,例項初始化方法,私有方法  
  186. 0xb8 invokestatic   呼叫靜態方法  
  187. 0xb9 invokeinterface 呼叫介面方法  
  188. 0xba --  
  189. 0xbb new      建立一個物件,並將其引用值壓入棧頂  
  190. 0xbc newarray   建立一個指定原始型別(如int, float, char…)的陣列,並將其引用值壓入棧頂  
  191. 0xbd anewarray   建立一個引用型(如類,介面,陣列)的陣列,並將其引用值壓入棧頂  
  192. 0xbe arraylength 獲得陣列的長度值並壓入棧頂  
  193. 0xbf athrow    將棧頂的異常丟擲  
  194. 0xc0 checkcast   檢驗型別轉換,檢驗未通過將丟擲ClassCastException  
  195. 0xc1 instanceof 檢驗物件是否是指定的類的例項,如果是將1壓入棧頂,否則將0壓入棧頂  
  196. 0xc2 monitorenter   獲得物件的鎖,用於同步方法或同步塊  
  197. 0xc3 monitorexit    釋放物件的鎖,用於同步方法或同步塊  
  198. 0xc4 wide     <待補充>  
  199. 0xc5 multianewarray 建立指定型別和指定維度的多維陣列(執行該指令時,操作棧中必須包含各維度的長度值),並將其引用值壓入棧頂  
  200. 0xc6 ifnull    為null時跳轉  
  201. 0xc7 ifnonnull   不為null時跳轉  
  202. 0xc8 goto_w    無條件跳轉(寬索引)  
  203. 0xc9 jsr_w     跳轉至指定32位offset位置,並將jsr_w下一條指令地址壓入棧頂