生活随笔
收集整理的這篇文章主要介紹了
基于栈和基于寄存器的Java虚拟机
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
基于棧和基于寄存器的虛擬機(jī)區(qū)別:存放操作數(shù)的位置(操作數(shù)棧/寄存器)----操作數(shù)棧即求值棧
JVM通常將操作數(shù)棧放到方法調(diào)用棧幀,Dalvik則將部分操作數(shù)放入虛擬寄存器。
字節(jié)碼只能看到操作數(shù)棧/虛擬寄存器,局部變量和參數(shù),這三者都是平臺(tái)無關(guān)的。
字節(jié)碼能夠操縱局部變量、參數(shù)在操作數(shù)棧/寄存器中完成各種運(yùn)算。
經(jīng)過javac編譯以后,字節(jié)碼就知道局部變量、參數(shù)和操作數(shù)棧/寄存器的類型和位置---由javac編譯器識(shí)別虛擬機(jī)結(jié)構(gòu)
-------------------------------------------------------------------------------------------------------
JVM字節(jié)碼指令集
指令碼?助記符????說明??0x00?nop??????什么都不做??0x01?aconst_null?將null推送至棧頂??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推送至棧頂??0x08?iconst_5???將int型5推送至棧頂??0x09?lconst_0???將long型0推送至棧頂??0x0a?lconst_1???將long型1推送至棧頂??0x0b?fconst_0???將float型0推送至棧頂??0x0c?fconst_1???將float型1推送至棧頂??0x0d?fconst_2???將float型2推送至棧頂??0x0e?dconst_0???將double型0推送至棧頂??0x0f?dconst_1???將double型1推送至棧頂??0x10?bipush????將單字節(jié)的常量值(-128~127)推送至棧頂??0x11?sipush????將一個(gè)短整型常量值(-32768~32767)推送至棧頂??0x12?ldc??????將int,?float或String型常量值從常量池中推送至棧頂??0x13?ldc_w?????將int,?float或String型常量值從常量池中推送至棧頂(寬索引)??0x14?ldc2_w????將long或double型常量值從常量池中推送至棧頂(寬索引)??0x15?iload?????將指定的int型本地變量推送至棧頂??0x16?lload?????將指定的long型本地變量推送至棧頂??0x17?fload?????將指定的float型本地變量推送至棧頂??0x18?dload?????將指定的double型本地變量推送至棧頂??0x19?aload?????將指定的引用類型本地變量推送至棧頂??0x1a?iload_0????將第一個(gè)int型本地變量推送至棧頂??0x1b?iload_1????將第二個(gè)int型本地變量推送至棧頂??0x1c?iload_2????將第三個(gè)int型本地變量推送至棧頂??0x1d?iload_3????將第四個(gè)int型本地變量推送至棧頂??0x1e?lload_0????將第一個(gè)long型本地變量推送至棧頂??0x1f?lload_1????將第二個(gè)long型本地變量推送至棧頂??0x20?lload_2????將第三個(gè)long型本地變量推送至棧頂??0x21?lload_3????將第四個(gè)long型本地變量推送至棧頂??0x22?fload_0????將第一個(gè)float型本地變量推送至棧頂??0x23?fload_1????將第二個(gè)float型本地變量推送至棧頂??0x24?fload_2????將第三個(gè)float型本地變量推送至棧頂??0x25?fload_3????將第四個(gè)float型本地變量推送至棧頂??0x26?dload_0????將第一個(gè)double型本地變量推送至棧頂??0x27?dload_1????將第二個(gè)double型本地變量推送至棧頂??0x28?dload_2????將第三個(gè)double型本地變量推送至棧頂??0x29?dload_3????將第四個(gè)double型本地變量推送至棧頂??0x2a?aload_0????將第一個(gè)引用類型本地變量推送至棧頂??0x2b?aload_1????將第二個(gè)引用類型本地變量推送至棧頂??0x2c?aload_2????將第三個(gè)引用類型本地變量推送至棧頂??0x2d?aload_3????將第四個(gè)引用類型本地變量推送至棧頂??0x2e?iaload????將int型數(shù)組指定索引的值推送至棧頂??0x2f?laload????將long型數(shù)組指定索引的值推送至棧頂??0x30?faload????將float型數(shù)組指定索引的值推送至棧頂??0x31?daload????將double型數(shù)組指定索引的值推送至棧頂??0x32?aaload????將引用型數(shù)組指定索引的值推送至棧頂??0x33?baload????將boolean或byte型數(shù)組指定索引的值推送至棧頂??0x34?caload????將char型數(shù)組指定索引的值推送至棧頂??0x35?saload????將short型數(shù)組指定索引的值推送至棧頂??0x36?istore????將棧頂int型數(shù)值存入指定本地變量??0x37?lstore????將棧頂long型數(shù)值存入指定本地變量??0x38?fstore????將棧頂float型數(shù)值存入指定本地變量??0x39?dstore????將棧頂double型數(shù)值存入指定本地變量??0x3a?astore????將棧頂引用型數(shù)值存入指定本地變量??0x3b?istore_0???將棧頂int型數(shù)值存入第一個(gè)本地變量??0x3c?istore_1???將棧頂int型數(shù)值存入第二個(gè)本地變量??0x3d?istore_2???將棧頂int型數(shù)值存入第三個(gè)本地變量??0x3e?istore_3???將棧頂int型數(shù)值存入第四個(gè)本地變量??0x3f?lstore_0???將棧頂long型數(shù)值存入第一個(gè)本地變量??0x40?lstore_1???將棧頂long型數(shù)值存入第二個(gè)本地變量??0x41?lstore_2???將棧頂long型數(shù)值存入第三個(gè)本地變量??0x42?lstore_3???將棧頂long型數(shù)值存入第四個(gè)本地變量??0x43?fstore_0???將棧頂float型數(shù)值存入第一個(gè)本地變量??0x44?fstore_1???將棧頂float型數(shù)值存入第二個(gè)本地變量??0x45?fstore_2???將棧頂float型數(shù)值存入第三個(gè)本地變量??0x46?fstore_3???將棧頂float型數(shù)值存入第四個(gè)本地變量??0x47?dstore_0???將棧頂double型數(shù)值存入第一個(gè)本地變量??0x48?dstore_1???將棧頂double型數(shù)值存入第二個(gè)本地變量??0x49?dstore_2???將棧頂double型數(shù)值存入第三個(gè)本地變量??0x4a?dstore_3???將棧頂double型數(shù)值存入第四個(gè)本地變量??0x4b?astore_0???將棧頂引用型數(shù)值存入第一個(gè)本地變量??0x4c?astore_1???將棧頂引用型數(shù)值存入第二個(gè)本地變量??0x4d?astore_2???將棧頂引用型數(shù)值存入第三個(gè)本地變量??0x4e?astore_3???將棧頂引用型數(shù)值存入第四個(gè)本地變量??0x4f?iastore????將棧頂int型數(shù)值存入指定數(shù)組的指定索引位置??0x50?lastore????將棧頂long型數(shù)值存入指定數(shù)組的指定索引位置??0x51?fastore????將棧頂float型數(shù)值存入指定數(shù)組的指定索引位置??0x52?dastore????將棧頂double型數(shù)值存入指定數(shù)組的指定索引位置??0x53?aastore????將棧頂引用型數(shù)值存入指定數(shù)組的指定索引位置??0x54?bastore????將棧頂boolean或byte型數(shù)值存入指定數(shù)組的指定索引位置??0x55?castore????將棧頂char型數(shù)值存入指定數(shù)組的指定索引位置??0x56?sastore????將棧頂short型數(shù)值存入指定數(shù)組的指定索引位置??0x57?pop??????將棧頂數(shù)值彈出?(數(shù)值不能是long或double類型的)??0x58?pop2?????將棧頂?shù)囊粋€(gè)(long或double類型的)或兩個(gè)數(shù)值彈出(其它)??0x59?dup??????復(fù)制棧頂數(shù)值并將復(fù)制值壓入棧頂??0x5a?dup_x1????復(fù)制棧頂數(shù)值并將兩個(gè)復(fù)制值壓入棧頂??0x5b?dup_x2????復(fù)制棧頂數(shù)值并將三個(gè)(或兩個(gè))復(fù)制值壓入棧頂??0x5c?dup2?????復(fù)制棧頂一個(gè)(long或double類型的)或兩個(gè)(其它)數(shù)值并將復(fù)制值壓入棧頂??0x5d?dup2_x1????<待補(bǔ)充>??0x5e?dup2_x2????<待補(bǔ)充>??0x5f?swap?????將棧最頂端的兩個(gè)數(shù)值互換(數(shù)值不能是long或double類型的)??0x60?iadd?????將棧頂兩int型數(shù)值相加并將結(jié)果壓入棧頂??0x61?ladd?????將棧頂兩long型數(shù)值相加并將結(jié)果壓入棧頂??0x62?fadd?????將棧頂兩float型數(shù)值相加并將結(jié)果壓入棧頂??0x63?dadd?????將棧頂兩double型數(shù)值相加并將結(jié)果壓入棧頂??0x64?isub?????將棧頂兩int型數(shù)值相減并將結(jié)果壓入棧頂??0x65?lsub?????將棧頂兩long型數(shù)值相減并將結(jié)果壓入棧頂??0x66?fsub?????將棧頂兩float型數(shù)值相減并將結(jié)果壓入棧頂??0x67?dsub?????將棧頂兩double型數(shù)值相減并將結(jié)果壓入棧頂??0x68?imul?????將棧頂兩int型數(shù)值相乘并將結(jié)果壓入棧頂??0x69?lmul?????將棧頂兩long型數(shù)值相乘并將結(jié)果壓入棧頂??0x6a?fmul?????將棧頂兩float型數(shù)值相乘并將結(jié)果壓入棧頂??0x6b?dmul?????將棧頂兩double型數(shù)值相乘并將結(jié)果壓入棧頂??0x6c?idiv?????將棧頂兩int型數(shù)值相除并將結(jié)果壓入棧頂??0x6d?ldiv?????將棧頂兩long型數(shù)值相除并將結(jié)果壓入棧頂??0x6e?fdiv?????將棧頂兩float型數(shù)值相除并將結(jié)果壓入棧頂??0x6f?ddiv?????將棧頂兩double型數(shù)值相除并將結(jié)果壓入棧頂??0x70?irem?????將棧頂兩int型數(shù)值作取模運(yùn)算并將結(jié)果壓入棧頂??0x71?lrem?????將棧頂兩long型數(shù)值作取模運(yùn)算并將結(jié)果壓入棧頂??0x72?frem?????將棧頂兩float型數(shù)值作取模運(yùn)算并將結(jié)果壓入棧頂??0x73?drem?????將棧頂兩double型數(shù)值作取模運(yùn)算并將結(jié)果壓入棧頂??0x74?ineg?????將棧頂int型數(shù)值取負(fù)并將結(jié)果壓入棧頂??0x75?lneg?????將棧頂long型數(shù)值取負(fù)并將結(jié)果壓入棧頂??0x76?fneg?????將棧頂float型數(shù)值取負(fù)并將結(jié)果壓入棧頂??0x77?dneg?????將棧頂double型數(shù)值取負(fù)并將結(jié)果壓入棧頂??0x78?ishl?????將int型數(shù)值左移位指定位數(shù)并將結(jié)果壓入棧頂??0x79?lshl?????將long型數(shù)值左移位指定位數(shù)并將結(jié)果壓入棧頂??0x7a?ishr?????將int型數(shù)值右(符號(hào))移位指定位數(shù)并將結(jié)果壓入棧頂??0x7b?lshr?????將long型數(shù)值右(符號(hào))移位指定位數(shù)并將結(jié)果壓入棧頂??0x7c?iushr?????將int型數(shù)值右(無符號(hào))移位指定位數(shù)并將結(jié)果壓入棧頂??0x7d?lushr?????將long型數(shù)值右(無符號(hào))移位指定位數(shù)并將結(jié)果壓入棧頂??0x7e?iand?????將棧頂兩int型數(shù)值作“按位與”并將結(jié)果壓入棧頂??0x7f?land?????將棧頂兩long型數(shù)值作“按位與”并將結(jié)果壓入棧頂??0x80?ior??????將棧頂兩int型數(shù)值作“按位或”并將結(jié)果壓入棧頂??0x81?lor??????將棧頂兩long型數(shù)值作“按位或”并將結(jié)果壓入棧頂??0x82?ixor?????將棧頂兩int型數(shù)值作“按位異或”并將結(jié)果壓入棧頂??0x83?lxor?????將棧頂兩long型數(shù)值作“按位異或”并將結(jié)果壓入棧頂??0x84?iinc?????將指定int型變量增加指定值(i++,?i--,?i+=2)??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é)果壓入棧頂??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壓入棧頂??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)??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ù)(可變長(zhǎng)度指令)??0xab?lookupswitch???用于switch條件跳轉(zhuǎn),case值不連續(xù)(可變長(zhǎng)度指令)??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??0xb2?getstatic???獲取指定類的靜態(tài)域,并將其值壓入棧頂??0xb3?putstatic???為指定的類的靜態(tài)域賦值??0xb4?getfield???獲取指定類的實(shí)例域,并將其值壓入棧頂??0xb5?putfield???為指定的類的實(shí)例域賦值??0xb6?invokevirtual???調(diào)用實(shí)例方法??0xb7?invokespecial???調(diào)用超類構(gòu)造方法,實(shí)例初始化方法,私有方法??0xb8?invokestatic???調(diào)用靜態(tài)方法??0xb9?invokeinterface?調(diào)用接口方法??0xba?--??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)度值并壓入棧頂??0xbf?athrow????將棧頂?shù)漠惓伋??0xc0?checkcast???檢驗(yàn)類型轉(zhuǎn)換,檢驗(yàn)未通過將拋出ClassCastException??0xc1?instanceof?檢驗(yàn)對(duì)象是否是指定的類的實(shí)例,如果是將1壓入棧頂,否則將0壓入棧頂??0xc2?monitorenter???獲得對(duì)象的鎖,用于同步方法或同步塊??0xc3?monitorexit????釋放對(duì)象的鎖,用于同步方法或同步塊??0xc4?wide?????<待補(bǔ)充>??0xc5?multianewarray?創(chuàng)建指定類型和指定維度的多維數(shù)組(執(zhí)行該指令時(shí),操作棧中必須包含各維度的長(zhǎng)度值),并將其引用值壓入棧頂??0xc6?ifnull????為null時(shí)跳轉(zhuǎn)??0xc7?ifnonnull???不為null時(shí)跳轉(zhuǎn)??0xc8?goto_w????無條件跳轉(zhuǎn)(寬索引)??0xc9?jsr_w?????跳轉(zhuǎn)至指定32位offset位置,并將jsr_w下一條指令地址壓入棧頂 ?
?
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的基于栈和基于寄存器的Java虚拟机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。