日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

基于栈和基于寄存器的Java虚拟机

發(fā)布時(shí)間:2024/4/15 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于栈和基于寄存器的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???將int0推送至棧頂??
  • 0x04?iconst_1???將int1推送至棧頂??
  • 0x05?iconst_2???將int2推送至棧頂??
  • 0x06?iconst_3???將int3推送至棧頂??
  • 0x07?iconst_4???將int4推送至棧頂??
  • 0x08?iconst_5???將int5推送至棧頂??
  • 0x09?lconst_0???將long0推送至棧頂??
  • 0x0a?lconst_1???將long1推送至棧頂??
  • 0x0b?fconst_0???將float0推送至棧頂??
  • 0x0c?fconst_1???將float1推送至棧頂??
  • 0x0d?fconst_2???將float2推送至棧頂??
  • 0x0e?dconst_0???將double0推送至棧頂??
  • 0x0f?dconst_1???將double1推送至棧頂??
  • 0x10?bipush????將單字節(jié)的常量值(-128~127)推送至棧頂??
  • 0x11?sipush????將一個(gè)短整型常量值(-32768~32767)推送至棧頂??
  • 0x12?ldc??????將int,?float或String型常量值從常量池中推送至棧頂??
  • 0x13?ldc_w?????將int,?float或String型常量值從常量池中推送至棧頂(寬索引)??
  • 0x14?ldc2_w????將longdouble型常量值從常量池中推送至棧頂(寬索引)??
  • 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????將booleanbyte型數(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????將棧頂booleanbyte型數(shù)值存入指定數(shù)組的指定索引位置??
  • 0x55?castore????將棧頂char型數(shù)值存入指定數(shù)組的指定索引位置??
  • 0x56?sastore????將棧頂short型數(shù)值存入指定數(shù)組的指定索引位置??
  • 0x57?pop??????將棧頂數(shù)值彈出?(數(shù)值不能是longdouble類型的)??
  • 0x58?pop2?????將棧頂?shù)囊粋€(gè)(longdouble類型的)或兩個(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è)(longdouble類型的)或兩個(gè)(其它)數(shù)值并將復(fù)制值壓入棧頂??
  • 0x5d?dup2_x1????<待補(bǔ)充>??
  • 0x5e?dup2_x2????<待補(bǔ)充>??
  • 0x5f?swap?????將棧最頂端的兩個(gè)數(shù)值互換(數(shù)值不能是longdouble類型的)??
  • 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é)果(10,-1)壓入棧頂??
  • 0x95?fcmpl?????比較棧頂兩float型數(shù)值大小,并將結(jié)果(10,-1)壓入棧頂;當(dāng)其中一個(gè)數(shù)值為NaN時(shí),將-1壓入棧頂??
  • 0x96?fcmpg?????比較棧頂兩float型數(shù)值大小,并將結(jié)果(10,-1)壓入棧頂;當(dāng)其中一個(gè)數(shù)值為NaN時(shí),將1壓入棧頂??
  • 0x97?dcmpl?????比較棧頂兩double型數(shù)值大小,并將結(jié)果(10,-1)壓入棧頂;當(dāng)其中一個(gè)數(shù)值為NaN時(shí),將-1壓入棧頂??
  • 0x98?dcmpg?????比較棧頂兩double型數(shù)值大小,并將結(jié)果(10,-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ò),歡迎將生活随笔推薦給好友。