[三] 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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...