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

来源:https://www.cnblogs.com/noteless/archive/2018/08/29/9556928.html
-Advertisement-
Play Games

位元組碼指令集是瞭解學習虛擬機運行的必須步驟,本文詳細的介紹了絕大多數的位元組碼指令,從多個維度對位元組碼指令進行瞭解析說明,並且對位元組碼指令集助記符進行了更加詳細的釋義. 本文主要涉及jvm的位元組碼指令集 助記符 位元組碼邏輯功能分類 以及用法 ...


說明,本文的目的在於從巨集觀邏輯上介紹清楚絕大多數的位元組碼指令的含義以及分類 只要認真閱讀本文必然能夠對位元組碼指令集有所瞭解 如果需要瞭解清楚每一個指令的具體詳盡用法,請參閱虛擬機規範

指令簡介

電腦指令就是指揮機器工作的指示和命令,程式就是一系列按一定順序排列的指令,執行程式的過程就是電腦的工作過程。 通常一條指令包括兩方面的內容: 操作碼和操作數,操作碼決定要完成的操作,操作數指參加運算的數據及其所在的單元地址。 虛擬機的位元組碼指令亦是如此含義 class文件相當於JVM的機器語言 class文件是源代碼信息的完整表述 方法內的代碼被保存到code屬性中,位元組碼指令序列就是方法的調用過程   Java虛擬機的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(opcode) 以及跟隨其後的零至多個代表此操作所需參數的操作數(operand)所構成 虛擬機中許多指令並不包含操作數.只有一個操作碼。   如果忽略異常處理,執行邏輯類似
do{
自動計算pc寄存器以及從pc寄存器的位置取出操作碼;
if(存在操作數){
取出操作數;
}
執行操作碼所定義的操作;
}while(處理下一次迴圈);
操作數的數量以及長度取決於操作碼,如果一個操作數的長度超過了一個位元組,那麼它將大端排序存儲,即高位在前的位元組序。 例如,如果要將一個16位長度的無符號整數使用兩個無符號位元組存儲起來(將它們命名為byte]和byte2 ) 那這個16位無符號整數的值就是:  (bytel<<8) | byte2. 位元組碼指令流應當都是單位元組對齊的,只有,tableswitch和lookupswitch兩個指令例外 這倆貨是4位元組為單位的   限制了操作碼長度為一個位元組 0~255,   但是也就導致操作碼個數不能超過256 放棄編譯後代碼的操作數對齊 也就省略很多填充和間隔符號 限制長度和放棄對齊也儘可能的讓編譯後的代碼短小精幹 但是如果向上面那樣如果操作碼處理超過一個位元組的數據時,就必須在運行時從位元組流中重建出具體數據結構,將會有一定程度的性能損失

指令詳解

說明: 操作碼一個位元組長度,也就是8位二進位數字,也就是兩位十六進位數字 class文件只會出現數字形式的操作碼 但是為了便於人識別,操作碼有他對應的助記符形式 接下來所有的指令的說明,都是以助記符形式表達的 但是要明確,實際的執行運行並不存在助記符這些東西,都是根據操作碼的值來執行   指令本身就是為了功能邏輯運算 運算自然要處理數據 所以說指令的設計是邏輯功能點與數據類型的結合 接下來先看下有哪些數據類型和邏輯功能點

數據類型

image_5b869c5d_c55   上一篇文章中已經說明JVM支持的數據類型 共有9中基本類型 對於基本類型  指令在設計的時候都用一個字母縮寫來指代(boolean除外)
byte  short  int  long  float  double  char  reference boolean
b s i l f d c a
 

邏輯功能

載入存儲指令
算數指令
類型轉換指令
對象的創建於操作
操作數棧管理指令
控制轉移指令
方法調用和返回指令
拋出異常
同步
  指令基本上就是圍繞著上面的邏輯功能以及數據類型進行設計的 當然   也有一些並沒有明確用字母指代數據類型,比如arraylength 指令,並沒有代表數據類型的特殊字元,操作數只能是一個數組類型的對象
另外還有一些,比如無條件跳轉指令goto 則是與數據類型無關的   接下來將會從各個維度對絕大多數指令進行介紹 註意: 在不同的分類中,有些指令是重覆的,因為有很多操作是需要處理數據的 也就是說數據類型相關的指令裡面可能跟很多邏輯功能點相關聯,比如 載入存儲指令,可以載入int 可以載入long等 他在我接下來的說明中,可能不僅僅會出現在數據類型相關的指令中 也會出現在載入存儲指令的介紹中,請不要疑惑 就是要從多維度介紹這些指令,才能更好地理解他們

指令-相關電腦英語辭彙含義

push push 按 推動 壓入
load load 載入 裝載 
const const 常數,不變的
store store 存儲 保存到
add add 加法
sub subduction 減法
mul multiplication 乘法
div division 除法
inc increase 增加
rem remainder 取餘 剩下的留下的
neg negate 取反 否定
sh shift 移位 移動變換
and and
or or
xor exclusive OR 異或
2 to 轉換 轉變 變成
cmp compare 比較
return return  返回
eq equal 相等
ne not equal 不相等
lt less than 小於
le less than or equal 小於等於
gt greater than 大於
ge greater than or equal 大於等於
if if 條件判斷 如果
goto goto 跳轉
invoke invoke 調用
dup dump 複製 拷貝 卸下 丟下
 

指令-數據類型相關的指令

java中的操作碼長度只有個位元組,所以必然,並不會所有的類型都有對應的操作 Java虛擬機指令集對於特定的操作只提供了有限的類型相關指令 有一些單獨的指令可以再必要的時候用來將一些不支持的類型轉換為可支持的類型
下表中最左邊一列的T表示模板,只需要用數據類型的縮寫,替換掉T 就可以得到對應的具體的指令 如果下表中為空,說明對這種數據類型不支持這種類型的操作
操作碼/類型 byte short int long float double char reference
Tipush bipush sipush





Tconst

iconst lconst fconst dconst
aconst
Tload

iload lload fload dload
aload
Tstore

istore lstore fstore dstore
astore
Tinc

iinc




Taload  baload  saload  iaload  laload  faload  daload  caload  aaload
Tastore  bastore  sastore  iastore  lastore  fastore  dastore  castore  aastore
Tadd 

iadd  ladd  fadd  dadd

Tsub 

isub  lsub  fsub  dsub

Tmul 

imul lmul  fmul  dmul

Tdiv 

idiv  ldiv  fdiv  ddiv

Trem 

irem  lrem  frem  drem

Tneg 

ineg  lneg  fneg  dneg

Tshl

ishl lshl



Tshr

ishr lshr



Tushr 

iushr  lushr



Tand 

iand  land



Tor

ior  lor



Txor 

ixor  lxor



i2T  i2b  i2s 
i2l  i2f  i2d

l2T 

l2i 
l2f  l2d

f2T 

f2i  f2l 
f2d

d2T

d2i  d2l  d2f


Tcmp


lcmp



Tcmpl



fcmpl  dcmpl

Tcmpg 



fcmpg  dcmpg

if_TcmpOP

if_icmpOP 



if_acmpOP
Treturn

ireturn  lreturn  freturn  dreturn 
areturn
  從上表的空白處可以看得出來 大部分數據類型相關聯的指令,都沒有支持整數類型 byte char short ,而且沒有任何指令支持boolean類型 因為 編譯器會在編譯期或者運行期  將byte 和short 類型的數據 帶符號擴展 為相應的int類型數據 類似的,boolean 和char類型數據零位擴展為相應的int類型數據 在處理boolean byte short char類型的數組時,也會轉換為使用對應的int類型的位元組碼指令來處理
另外需要格外註意的是,上表是為了呈現部分與數據類型相關聯的操作碼 並不是說所有的操作碼都在上表中,僅僅是和數據類型相關聯的才出現在了上表中
  實際類型與運算類型的對應關係如下,分類後面會說到
實際類型 運算類型 分類
boolean int 1
int int 1
byte int 1
short int 1
int int 1
float float 1
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 需求:實體是blog 和author 關係是一對一,查詢 blog 以及 blog 的作者信息 嵌套查詢 xml select from blog where bid = {id, jdbcType=INTEGER} ...
  • 引言 還記得大三時上培訓班的是時候,當時的培訓老師說自己是本地講解spring最好的講師,但是後來等我實習了看了《Spring 3.x 企業應用開發實戰》以及後續版本《精通Spring+4.x++企業應用開發實戰》才發現,這位培訓老師就是基本按照《Spring 3.x 企業應用開發實戰》給我們講sp ...
  • #以下是我自己在聯繫列表中所編寫的語句:names=["zangsan",'lisi','wangermazi','Xiaoliuzi','dabiaoge','牛erbiaodi']# 0 1 2 3 4 5 print(names[2])#簡單取值#取lisi和wangermaziprint(n ...
  • 11種狀態解析 LISTEN 等待從任何遠端TCP 和埠的連接請求。 SYN_SENT 發送完一個連接請求後等待一個匹配的連接請求。 SYN_RECEIVED 發送連接請求並且接收到匹配的連接請求以後等待連接請求確認。 ESTABLISHED 表示一個打開的連接,接收到的數據可以被投遞給用戶。連接 ...
  • 剛剛開始學習c++。之前c的內容掌握的也不多,基本只是一本概論課的程度,以前使用c的struct寫過的鏈表、用python寫過簡單的數據結構,就試著把兩者用c++寫出來,也是對c++的class,以及繼承中的public/protected/private的性質進行初步瞭解。第一次寫頭文件.h和源文 ...
  • ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼)是一套基於拉丁字母的字元編碼,共收錄了 128 個字元,用一個位元組就可以存儲,它等同於國際標準 ISO/IEC 646。ASCII 規範於 1967 年第一次發佈, ...
  • Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 48605 Accepted: 18339 Description You are trapped in a 3D dungeon and need t ...
  • 前幾天決定學Python,上網找了教程看了兩天,和C比起來面向對象的特性真的都很便捷,有了類開發各種敵機,子彈什麼的都很方便。 在此要感謝開發pygame模塊的開發人員,真的很好用(逃 主函數↓ 精靈類模塊 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...