1. 程式人生 > >10 位元組碼指令簡介

10 位元組碼指令簡介

《深入理解Java虛擬機器:JVM高階特性與最佳實踐(第2版)》6.4節 長度:1個位元組 總數:<=256 面向:運算元棧,而非暫存器 對齊:運算元長度不對齊 操作碼助記符:i代表int,l代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代表reference arraylength指令,無操作碼助記符,但運算元永遠只能陣列 虛擬機器指令集支援的資料型別:

大部分指令不支援byte、char、short(轉為int處理) 所有指令不支援boolean(轉為int處理)

可按用途分為9類:

1. 載入和儲存指令

將一個區域性變數載入到操作棧:iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n>、aload、aload_<n> 將一個數值從運算元棧儲存到區域性變量表:istore、istore_<n>、lstore、lstore_<n>、fstore、fstore_<n>、dstore、dstore_<n>、astore、astore_<n> 將一個常量載入到運算元棧:bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_<i>、lconst_<l>、fconst_<f>、dconst_<d> 擴充區域性變量表的訪問索引:wide 運算元棧和區域性變量表主要由載入和儲存指令操作

2. 運算指令

加法指令:iadd、ladd、fadd、dadd 減法指令:isub、lsub、fsub、dsub 乘法指令:imul、lmul、fmul、dmul 除法指令:idiv、ldiv、fdiv、ddiv 求餘指令:irem、lrem、frem、drem 取反指令:ineg、lneg、fneg、dneg 位移指令:ishl、ishr、iushr、lshl、lshr、lushr 按位或指令:ior、lor 按位與指令:iand、land 按位異或指令:ixor、lxor 區域性變數自增指令:iinc 比較指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp Java虛擬機器規範僅規定,處理整型資料時只有除法指令(idiv、ldiv)及求餘指令(irem、lrem)中除數為零時虛擬機器丟擲ArithmeticException異常,其餘任何整型數運算都不應丟擲執行時異常

3. 型別轉換指令

i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l、d2f 處理窄化型別轉換(NarrowingNumericConversions)必須顯式使用轉換指令 資料型別窄化轉換可能會發生上限溢位、下限溢位、精度丟失等情況 Java虛擬機器規範規定數值型別窄化轉換指令永遠不可能導致虛擬機器丟擲執行時異常

4. 物件建立與訪問指令

建立類例項的指令:new 建立陣列的指令:newarray、anewarray、multianewarray 訪問類欄位(static欄位)和例項欄位(非static欄位)的指令:getfield、putfield、getstatic、putstatic 把一個數組元素載入到運算元棧的指令:baload、caload、saload、iaload、laload、faload、daload、aaload 將一個運算元棧的值儲存到陣列元素中的指令:bastore、castore、sastore、iastore、fastore、dastore、aastore 取陣列長度的指令:arraylength 檢查類例項型別的指令:instanceof、checkcast

5. 運算元棧管理指令

將運算元棧的棧頂一個或兩個元素出棧:pop、pop2 複製棧頂一個或兩個數值並將複製值或雙份的複製值重新壓入棧頂:dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2 將棧最頂端的兩個數值互換:swap

6. 控制轉移指令

從概念模型理解,有條件或無條件的修改PC暫存器的值 條件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt、if_icmpgt、if_icmple、if_icmpge、if_acmpeq和if_acmpne 複合條件分支:tableswitch、lookupswitch 無條件分支:goto、goto_w、jsr、jsr_w、ret

7. 方法呼叫和返回指令

方法呼叫指令與資料型別無關 invokevirtual,用於呼叫物件的例項方法,根據物件的實際型別進行分派(虛方法分派),Java語言中最常見的方法分派方式 invokeinterface,用於呼叫介面方法,它會在執行時搜尋一個實現了這個介面方法的物件,找出適合的方法進行呼叫 invokespecial,用於呼叫一些需要特殊處理的例項方法,包括例項初始化方法、私有方法和父類方法 invokestatic,用於呼叫類方法(static方法) invokedynamic,用於在執行時動態解析出呼叫點限定符所引用的方法,並執行該方法 前面4條呼叫指令分派邏輯固化在Java虛擬機器內部,invokedynamic指令分派邏輯是由使用者所設定的引導方法決定 方法返回指令是根據返回值型別區分 包括,ireturn(返回值是boolean、byte、char、short和int型別)、lreturn、freturn、dreturn、areturn return,供宣告為void的方法、例項初始化方法及類和介面的類初始化方法使用

8. 異常處理指令

顯示丟擲異常的操作:athrow

9. 同步指令

monitorenter、monitorexit Java虛擬機器支援方法級同步和方法內部一段指令序列同步,兩種同步結構都使用管程(Monitor)支援實現 方法級同步(方法同步的底層實現原理): 隱式的,即無須通過位元組碼指令控制,實現在方法呼叫和返回操作之中 虛擬機器可通過方法常量池中方法表結構的ACC_SYNCHRONIZED訪問標誌得知方法是否被宣告為同步方法 方法呼叫時,呼叫指令檢查ACC_SYNCHRONIZED訪問標誌是否被設定,若是,則執行執行緒要求先成功持有管程,然後才執行方法,方法完成(包括正常、非正常完成)時釋放管程 方法執行期間,執行執行緒持有了管程,其他執行緒無法再獲取同一個管程 若同步方法執行期間丟擲異常,且方法內部無法處理此異常,則同步方法持有的管程在異常丟擲同步方法時自動釋放 同步一段指令集序列(synchronized語句塊的底層實現原理): 由Java語言synchronized語句塊表示 指令集中monitorenter、monitorexit支援synchronized關鍵字語義 正確實現synchronized關鍵字需要Javac編譯器與Java虛擬機器兩者共同協作支援 編譯器必須確保,無論方法以何種方式(正常結束、異常結束)完成,方法中呼叫的每條monitorenter指令都必須執行其對應的monitorexit指令 為保證方法異常完成時monitorenter和monitorexit指令依然可以正確配對執行,編譯器自動產生一個異常處理器,該異常處理器宣告可處理所有的常,其目的是用執行monitorexit指令 管程(Monitor)的概念:

相關推薦

10 位元組指令簡介

《深入理解Java虛擬機器:JVM高階特性與最佳實踐(第2版)》6.4節 長度:1個位元組 總數:<=256 面向:運算元棧,而非暫存器 對齊:運算元長度不對齊 操作碼助記符:i代表int,l代表long,s代表short,b代表byte,c代表char,f代表fl

深入理解java虛擬機器(六)位元組指令簡介

Java虛擬機器指令是由(佔用一個位元組長度、代表某種特定操作含義的數字)操作碼Opcode,以及跟隨在其後的零至多個代表此操作所需引數的稱為運算元 Operands 構成的。由於Java虛擬機器是面向運算元棧而不是暫存器的架構,所以大多數指令都只有操作碼,而沒有運算元。 位元組碼指令集是一種具有鮮明特點、

深入理解JVM虛擬機器(五):位元組指令簡介

Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字(稱為操作碼)以及跟隨其後的零至多個代表此操作所需引數(運算元)而構成。由於 Java 虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數的指令都不包含運算元,只有一個操作碼。 1. 位元組碼與資料型別

位元組指令簡介

摘自《深入理解 Java 虛擬機器:JVM 高階特性與最佳實踐》(第二版)         Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字(稱為操作碼,Opcode)以及跟隨其後的零至多個代表此操作所需引數(稱為運算元,Operands)而構成。由

JVM之位元組指令簡介

java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字以及跟隨其後的零至多個代表此操作所需的引數而構成的。 位元組碼與資料型別 載入和儲存指令: 將資料在棧幀中的區域性變量表和運算元棧

位元組指令簡介

        Java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的數字(稱為操作碼,Pocode)以及跟隨其後的零至多個代表此操作所需引數(稱為運算元,Operands)而構成。由於Java虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數的指令都不包含

[四] java虛擬機器JVM編譯器編譯程式碼簡介 位元組指令例項 程式碼到底編譯成了什麼形式

public static void main(String[] args) { boolean bNum = true; char cNum = 2; byte byteNum = 127; short sNum = 32767; int iNum = 100; long lNum =

JVM位元組指令簡介

Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(Opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(Operands)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那 Java 虛擬機器的直譯器使用下

Oracle數據庫代指令簡介

ever others ref shu varchar2 extend manage 20M 函數計算 這是oracle的課後作業,弄懂這些也差不多了吧,不懂的可以去看我的SQL sever數據庫的博客那個寫的詳細。視頻以後有時間錄~ 登錄數據庫 //方法一 s

JVM總括三-位元組位元組指令、JIT編譯執行

JVM總括三-位元組碼、位元組碼指令、JIT編譯執行     java檔案編譯後的class檔案,java跨平臺的中間層,JVM通過對位元組碼的解釋執行(執行模式,還有JIT編譯執行,下面講解),遮蔽對作業系統的依賴。一個位元組(8位)可以儲存256中不同的指令,這樣的指令就是位元組碼,ja

大話+圖說:Java位元組指令——只為讓你懂

前言 隨著Java開發技術不斷被推到新的高度,對於Java程式設計師來講越來越需要具備對更深入的基礎性技術的理解,比如Java位元組碼指令。不然,可能很難深入理解一些時下的新框架、新技術,盲目一味追新也會越來越感乏力。 本文既不求照本宣科,亦不求炫技或著文立說,僅力圖以最簡明、最形象生動的方式,結合例子與

JVM 虛擬機器位元組指令

把JVM虛擬機器位元組指令表整理了一下,方便搜尋,偶爾複習下 純手工整理,可能存在一些問題,如果發現請及時告之我會修正 位元組碼 助記符 指令含義 0x00 nop None 0x01

class檔案結構與jvm位元組指令

https://blog.csdn.net/luckydog1991/article/details/51654964這篇文章詳細的介紹了class檔案和位元組碼指令 Class檔案結構 https://blog.csdn.net/tyrone1979/article/details/9

Java位元組指令收集大全

Java位元組碼指令大全 常量入棧指令 指令碼 操作碼(助記符) 運算元 描述(棧指運算元棧) 0x01 aconst_null  

Java位元組詳解(三)位元組指令(轉)

一、概述 Java虛擬機器採用基於棧的架構,其指令由操作碼和運算元組成。 操作碼:一個位元組長度(0~255),意味著指令集的操作碼個數不能操作256條。 運算元:一條指令可以有零或者多個運算元,且運算元可以是1個或者多個位元組。編譯後的程式碼沒有采用運算元長

JVM學習筆記1:位元組指令

一.位元組碼指令集簡介: Java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(operand)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那麼java虛

[三] java虛擬機器 JVM位元組 指令集 bytecode 操作 指令分類用法 助記符

上面關於dup的描述摘自 虛擬機器規範,很難理解看起來是非常難以理解的,不妨換一個角度我們知道區域性變數的空間分配分為兩種long 和 double 佔用2個slot  其他佔用一個運算元棧,每個單位可以表示虛擬機器支援的任何的一個數據型別不過運算元棧其實同區域性變數一樣,他也是被組織一個數組, 每個元素的資

JVM九:class位元組指令

一:位元組碼與資料型別     Java虛擬機器的指令由一個位元組長度,代表著某種特定操作含義的數字(稱為操作碼)以及跟其隨後的零至多個代表此操作所需引數(稱為運算元)而構成。Java虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數指令都不包含運算元。因為位元

位元組指令看重寫在JVM中的實現

        Java是解釋執行的,包括動態連結的特性,都給解析或執行期間提供了很多靈活擴充套件的空間。面嚮物件語言的繼承、封裝和多型的特性,在JVM中是怎樣進行編譯、解析,以及通過位元組碼指令如何確定方法呼叫的版本是本文如下要探討的主要內容,全文圍繞一個多型的簡單舉例來

Python 2.6.2的位元組指令集一覽

對Python的位元組碼指令集感興趣但不知道從何下手麼?執行這段程式碼就能看到位元組碼的列表:  Python程式碼   import opcode   for op in range(len(opcode.opname)):     print('0x%.2X(%