java反彙編命令手冊

来源:https://www.cnblogs.com/MC-Bonnie/p/18160197
-Advertisement-
Play Games

1. 棧和局部變數操作 1.1 將常量壓入棧的指令 指令 功能描述 aconst_null 將null對象引用壓入棧 iconst_m1 將將int類型常量-1壓入棧 iconst_0 將int類型常量0壓入棧 iconst_1 將int類型常量1壓入棧 iconst_2 將int類型常量2壓入棧 ...


1. 棧和局部變數操作

1.1 將常量壓入棧的指令
指令 功能描述
aconst_null 將null對象引用壓入棧
iconst_m1 將將int類型常量-1壓入棧
iconst_0 將int類型常量0壓入棧
iconst_1 將int類型常量1壓入棧
iconst_2 將int類型常量2壓入棧
iconst_3 將int類型常量3壓入棧
iconst_4 將int類型常量4壓入棧
iconst_5 將int類型常量5壓入棧
lconst_0 將long類型常量0壓入棧
lconst_1 將long類型常量1壓入棧
fconst_0 將float類型常量0壓入棧
fconst_1 將float類型常量1壓入棧
dconst_0 將double類型常量0壓入棧
dconst_1 將double類型常量1壓入棧
bipush 將一個8位帶符號整數壓入棧
sipush 將16位帶符號整數壓入棧
ldc 把常量池中的項壓入棧
ldc_w 把常量池中的項壓入棧(使用寬索引)
ldc2_w 把常量池中long類型或者double類型的項壓入棧(使用寬索引)
1.2 從棧中的局部變數中裝載值的指令
指令 功能描述
iload 從局部變數中裝載int類型值
lload 從局部變數中裝載long類型值
fload 從局部變數中裝載float類型值
dload 從局部變數中裝載double類型值
aload 從局部變數中裝載引用類型值(refernce)
iload_0 從局部變數0中裝載int類型值
iload_1 從局部變數1中裝載int類型值
iload_2 從局部變數2中裝載int類型值
iload_3 從局部變數3中裝載int類型值
lload_0 從局部變數0中裝載long類型值
lload_1 從局部變數1中裝載long類型值
lload_2 從局部變數2中裝載long類型值
lload_3 從局部變數3中裝載long類型值
fload_0 從局部變數0中裝載float類型值
fload_1 從局部變數1中裝載float類型值
fload_2 從局部變數2中裝載float類型值
fload_3 從局部變數3中裝載float類型值
dload_0 從局部變數0中裝載double類型值
dload_1 從局部變數1中裝載double類型值
dload_2 從局部變數2中裝載double類型值
dload_3 從局部變數3中裝載double類型值
aload_0 從局部變數0中裝載引用類型值
aload_1 從局部變數1中裝載引用類型值
aload_2 從局部變數2中裝載引用類型值
aload_3 從局部變數3中裝載引用類型值
iaload 從數組中裝載int類型值
laload 從數組中裝載long類型值
faload 從數組中裝載float類型值
daload 從數組中裝載double類型值
aaload 從數組中裝載引用類型值
baload 從數組中裝載byte類型或boolean類型值
caload 從數組中裝載char類型值
saload 從數組中裝載short類型值
1.3 將棧中的值存入局部變數的指令
指令 功能描述
istore 將int類型值存入局部變數
lstore 將long類型值存入局部變數
fstore 將float類型值存入局部變數
dstore 將double類型值存入局部變數
astore 將將引用類型或returnAddress類型值存入局部變數
istore_0 將int類型值存入局部變數0
istore_1 將int類型值存入局部變數1
istore_2 將int類型值存入局部變數2
istore_3 將int類型值存入局部變數3
lstore_0 將long類型值存入局部變數0
lstore_1 將long類型值存入局部變數1
lstore_2 將long類型值存入局部變數2
lstore_3 將long類型值存入局部變數3
fstore_0 將float類型值存入局部變數0
fstore_1 將float類型值存入局部變數1
fstore_2 將float類型值存入局部變數2
fstore_3 將float類型值存入局部變數3
dstore_0 將double類型值存入局部變數0
dstore_1 將double類型值存入局部變數1
dstore_2 將double類型值存入局部變數2
dstore_3 將double類型值存入局部變數3
astore_0 將引用類型或returnAddress類型值存入局部變數0
astore_1 將引用類型或returnAddress類型值存入局部變數1
astore_2 將引用類型或returnAddress類型值存入局部變數2
astore_3 將引用類型或returnAddress類型值存入局部變數3
iastore 將int類型值存入數組中
lastore 將long類型值存入數組中
fastore 將float類型值存入數組中
dastore 將double類型值存入數組中
aastore 將引用類型值存入數組中
bastore 將byte類型或者boolean類型值存入數組中
castore 將char類型值存入數組中
sastore 將short類型值存入數組中
wide指令
wide 使用附加位元組擴展局部變數索引
1.4 通用(無類型)棧操作
指令 功能描述
nop 不做任何操作
pop 彈出棧頂端一個字長的內容
pop2 彈出棧頂端兩個字長的內容
dup 複製棧頂部一個字長內容
dup_x1 複製棧頂部一個字長的內容,然後將複製內容及原來彈出的兩個字長的內容壓入棧
dup_x2 複製棧頂部一個字長的內容,然後將複製內容及原來彈出的三個字長的內容壓入棧
dup2 複製棧頂部兩個字長內容
dup2_x1 複製棧頂部兩個字長的內容,然後將複製內容及原來彈出的三個字長的內容壓入棧
dup2_x2 複製棧頂部兩個字長的內容,然後將複製內容及原來彈出的四個字長的內容壓入棧
swap 交換棧頂部兩個字長內容

2. 類型轉換

指令 功能描述
i2l 把int類型的數據轉化為long類型
i2f 把int類型的數據轉化為float類型
i2d 把int類型的數據轉化為double類型
l2i 把long類型的數據轉化為int類型
l2f 把long類型的數據轉化為float類型
l2d 把long類型的數據轉化為double類型
f2i 把float類型的數據轉化為int類型
f2l 把float類型的數據轉化為long類型
f2d 把float類型的數據轉化為double類型
d2i 把double類型的數據轉化為int類型
d2l 把double類型的數據轉化為long類型
d2f 把double類型的數據轉化為float類型
i2b 把int類型的數據轉化為byte類型
i2c 把int類型的數據轉化為char類型
i2s 把int類型的數據轉化為short類型

3. 整數運算

指令 功能描述
iadd 執行int類型的加法
ladd 執行long類型的加法
isub 執行int類型的減法
lsub 執行long類型的減法
imul 執行int類型的乘法
lmul 執行long類型的乘法
idiv 執行int類型的除法
ldiv 執行long類型的除法
irem 計算int類型除法的餘數
lrem 計算long類型除法的餘數
ineg 對一個int類型值進行取反操作
lneg 對一個long類型值進行取反操作
iinc 把一個常量值加到一個int類型的局部變數上

4. 邏輯運算

4.1 移位操作
指令 功能描述
ishl 執行int類型的向左移位操作
lshl 執行long類型的向左移位操作
ishr 執行int類型的向右移位操作
lshr 執行long類型的向右移位操作
iushr 執行int類型的向右邏輯移位操作
lushr 執行long類型的向右邏輯移位操作
4.2 按位布爾運算
指令 功能描述
iand 對int類型值進行
land 對long類型值進行“邏輯與”操作
ior 對int類型值進行“邏輯或”操作
lor 對long類型值進行“邏輯或”操作
ixor 對int類型值進行“邏輯異或”操作
lxor 對long類型值進行“邏輯異或”操作
4.3 浮點運算
指令 功能描述
fadd 執行float類型的加法
dadd 執行double類型的加法
fsub 執行float類型的減法
dsub 執行double類型的減法
fmul 執行float類型的乘法
dmul 執行double類型的乘法
fdiv 執行float類型的除法
ddiv 執行double類型的除法
frem 計算float類型除法的餘數
drem 計算double類型除法的餘數
fneg 將一個float類型的數值取反
dneg 將一個double類型的數值取反

5. 對象和數組

指令 功能描述
5.1 對象操作指令
指令 功能描述
new 創建一個新對象
checkcast 確定對象為所給定的類型
getfield 從對象中獲取欄位
putfield 設置對象中欄位的值
getstatic 從類中獲取靜態欄位
putstatic 設置類中靜態欄位的值
instanceof 判斷對象是否為給定的類型
5.2 數組操作指令
指令 功能描述
newarray 分配數據成員類型為基本上數據類型的新數組
anewarray 分配數據成員類型為引用類型的新數組
arraylength 獲取數組長度
multianewarray 分配新的多維數組

6. 控制流

指令 功能描述
6.1 條件分支指令
指令 功能描述
ifeq 如果等於0,則跳轉
ifne 如果不等於0,則跳轉
iflt 如果小於0,則跳轉
ifge 如果大於等於0,則跳轉
ifgt 如果大於0,則跳轉
ifle 如果小於等於0,則跳轉
if_icmpcq 如果兩個int值相等,則跳轉
if_icmpne 如果兩個int類型值不相等,則跳轉
if_icmplt 如果一個int類型值小於另外一個int類型值,則跳轉
if_icmpge 如果一個int類型值大於或者等於另外一個int類型值,則跳轉
if_icmpgt 如果一個int類型值大於另外一個int類型值,則跳轉
if_icmple 如果一個int類型值小於或者等於另外一個int類型值,則跳轉
ifnull 如果等於null,則跳轉
ifnonnull 如果不等於null,則跳轉
if_acmpeq 如果兩個對象引用相等,則跳轉
if_acmpnc 如果兩個對象引用不相等,則跳轉
6.2 比較指令
指令 功能描述
lcmp 比較long類型值
fcmpl 比較float類型值(當遇到NaN時,返回-1)
fcmpg 比較float類型值(當遇到NaN時,返回1)
dcmpl 比較double類型值(當遇到NaN時,返回-1)
dcmpg 比較double類型值(當遇到NaN時,返回1)
6.3 無條件轉移指令
指令 功能描述
goto 無條件跳轉
goto_w 無條件跳轉(寬索引)
6.4 表跳轉指令
指令 功能描述
tableswitch 通過索引訪問跳轉表,並跳轉
lookupswitch 通過鍵值匹配訪問跳轉表,並執行跳轉操作
6.5 異常
指令 功能描述
athrow 拋出異常或錯誤
finally子句
jsr 跳轉到子常式
jsr_w 跳轉到子常式(寬索引)
rct 從子常式返回

7. 方法調用與返回

7.1 方法調用指令
指令 功能描述
invokcvirtual 運行時按照對象的類來調用實例方法
invokespecial 根據編譯時類型來調用實例方法
invokestatic 調用類(靜態)方法
invokcinterface 調用介面方法
7.2 方法返回指令
指令 功能描述
ireturn 從方法中返回int類型的數據
lreturn 從方法中返回long類型的數據
freturn 從方法中返回float類型的數據
dreturn 從方法中返回double類型的數據
areturn 從方法中返回引用類型的數據
return 從方法中返回,返回值為void
7.3 線程同步
指令 功能描述
montiorenter 進入並獲取對象監視器
monitorexit 釋放並退出對象監視器

如何根據以上指令手冊翻譯java源碼呢?

首先新建一個java類,這裡用DemoForJavap.java舉個例,源碼如下:
package com.example.demo;

public class DemoForJavap{

	public int add(){
		int a = 1;
		int b = 2;
		int c = a+b;
		return c;
	}
}
使用javac命令編譯成class文件後用javap -c命令進行反彙編

我們主要解讀下add這個方法中的彙編碼:
  public int add();
    Code:
       0: iconst_1      //將int類型常量1壓入操作數棧
       1: istore_1		//將int類型值存入局部變數1,此處相當於int a=1;執行完畢
       2: iconst_2		//將int類型常量2壓入操作數棧
       3: istore_2		//將int類型值存入局部變數2,此處相當於int b=2;執行完畢
       4: iload_1		//從局部變數1中裝載int類型值
       5: iload_2		//從局部變數2中裝載int類型值
       6: iadd			//執行int類型的加法
       7: istore_3		//將int類型值存入局部變數3,此處相當於int c=a+b;執行完畢
       8: iload_3		//從局部變數3中裝載int類型值
       9: ireturn		//從方法中返回int類型的數據,此處相當於return c;執行完畢

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DTD 是文檔類型定義(Document Type Definition)的縮寫。DTD 定義了 XML 文檔的結構以及合法的元素和屬性。 為什麼使用 DTD 通過使用 DTD,獨立的團體可以就數據交換的標準 DTD 達成一致。 應用程式可以使用 DTD 來驗證 XML 數據的有效性。 內部 DTD ...
  • 其他章節請看: vue3 快速入門 系列 Pinia vue3 狀態管理這裡選擇 pinia。 雖然 vuex4 已支持 Vue 3 的 Composition API,但是 vue3 官網推薦新的應用使用 pinia —— vue3 pinia 集中式狀態管理 redux、mobx、vuex、pi ...
  • a-textarea(textarea)出現模糊問題的可能解決方案 項目介紹:本項目是一個vue3+ant-design-vue4.x開發,是一個客服機器人的組件。其它項目通過iframe+js文件來引入(iframe的內容就是表單,入口按鈕是通過js文件進行dom操作創建)。 通過js監聽頁面寬度 ...
  • 運算符重載:與function overloading異曲同工的是,C++提供所謂的Operator overloading。所謂operators是像 +(加)-(減)*(乘)/(除)>>(位右移)<<(位左移)之類的符號,代表一種動作。 面對operators,我們應該把他想像是一種函數,只不過 ...
  • C-07.InnoDB數據存儲結構 1.資料庫的存儲結構:頁 索引結構給我們提供了高效的索引方式,不過索引信息以及數據記錄都是保存在文件上的,確切說是存儲在頁結構中。另一方面,索引是在存儲引擎中實現的,MySQL伺服器上的存儲引擎負責對錶中數據的讀取和寫入工作。不同存儲引擎中存放的格式一般是不同的, ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 分享10款ER圖工具,詳細分析他們的功能特點、價格和適用場景,可以根據你的需求進行選擇。ER圖(Entity-Relationship Diagram)是資料庫設計中常用的一種模型,用於描述實體之間的關係。這種圖形化的表示方法旨在幫助人們理解和設計資料庫結構,它們在資料庫開發和設計中非常有用。 1 ...
  • 1. 索引 在資料庫中索引最核心的作用是:加速查找。 例如:在含有300w條數據的表中查詢,無索引需要700秒,而利用索引可能僅需1秒。 mysql> select * from big where password="81f98021-6927-433a-8f0d-0f5ac274f96e"; + ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...