JAVA操做碼相關指令介紹(2)

上一章介紹了JAVA一些基礎類型轉化以及局部變量的入棧等操做JAVA操做碼相關指令介紹(1)。這章繼續給你們介紹下字節碼命令。java

JAVA數值運算

JAVA裏面提供的整數運算都基於intlong類型的運算。當小於int類型的類型參與計算的時候,會將他們轉化爲int類型。數組

1.數值之間相加

操做碼 操做數 備註
iadd 從棧中彈出兩個int類型數,相加以後將所得int類型結果壓回棧
ladd 從棧中彈出兩個long類型數,相加以後將所得long類型結果壓回棧
fadd 從棧中彈出兩個float類型數,相加以後將所得float類型結果壓回棧
dadd 從棧中彈出兩個double類型數,相加以後將所得double類型結果壓回棧
iinc vindex,const 把常量與一個位於vindex位置的int類型局部變量相加
wide iinc,indexconst 把常量與一個位於vindex位置的int類型局部變量相加

2.數值之間相減

棧頂端的充當減數,次頂端的充當被減數ide

操做碼 操做數 備註
isub 從棧中彈出兩個int類型數,相減所得int類型結果壓回棧
lsub 從棧中彈出兩個long類型數,相減所得long類型結果壓回棧
fsub 從棧中彈出兩個float類型數,相減所得float類型結果壓回棧
dsub 從棧中彈出兩個double類型數,相減所得double類型結果壓回棧

3.數值之間乘法

操做碼 操做數 備註
imul 從棧中彈出兩個int類型數,相乘所得int類型結果壓回棧
lmul 從棧中彈出兩個long類型數,相乘所得long類型結果壓回棧
fmul 從棧中彈出兩個float類型數,相乘所得float類型結果壓回棧
dmul 從棧中彈出兩個double類型數,相乘所得double類型結果壓回棧

4.數值之間除法

次頂端的數除以頂端的數。若是整數被0除,會拋出相關異常。post

操做碼 操做數 備註
idiv 從棧中彈出兩個int類型數,相除所得int類型結果壓回棧
ldiv 從棧中彈出兩個long類型數,相除所得long類型結果壓回棧
fdiv 從棧中彈出兩個float類型數,相除所得float類型結果壓回棧
ddiv 從棧中彈出兩個double類型數,相除所得double類型結果壓回棧

5.數值之間取餘

操做碼 操做數 備註
irem 從棧中彈出兩個int類型數,取餘所得int類型結果壓回棧
lrem 從棧中彈出兩個long類型數,取餘所得long類型結果壓回棧
frem 從棧中彈出兩個float類型數,取餘所得float類型結果壓回棧
drem 從棧中彈出兩個double類型數,取餘所得double類型結果壓回棧

6.數值之間取反

操做碼 操做數 備註
ineg 從棧中彈出兩個int類型數,取反將所得int類型結果壓回棧
lneg 從棧中彈出兩個long類型數,取反將所得long類型結果壓回棧
fneg 從棧中彈出兩個float類型數,取反將所得float類型結果壓回棧
dneg 從棧中彈出兩個double類型數,取反將所得double類型結果壓回棧

7.數值之間位移

操做碼 操做數 備註
ishl 將int型數值左移位指定位數並將結果壓入棧頂
ishr 將int型數值右(符號)移位指定位數並將結果壓入棧頂
iushr 將int型數值右(無符號)移位指定位數並將結果壓入棧頂
lshl 將long型數值左移位指定位數並將結果壓入棧頂
lshr 將long型數值右(符號)移位指定位數並將結果壓入棧頂
lshr 將long型數值右(無符號)移位指定位數並將結果壓入棧頂

7.數值之間或

操做碼 操做數 備註
ior 將棧頂兩int型數值做「按位或」並將結果壓入棧頂
lor 將棧頂兩long型數值做「按位或」並將結果壓入棧頂

8.數值之間與

操做碼 操做數 備註
iand 將棧頂兩int型數值做「按位與」並將結果壓入棧頂
land 將棧頂兩long型數值做「按位與」並將結果壓入棧頂

9.數值之間異或

操做碼 操做數 備註
ixor 將棧頂兩int型數值做「按位異或」並將結果壓入棧頂
lxor 將棧頂兩long型數值做「按位異或」並將結果壓入棧頂

10.數值之間比較

操做碼 操做數 備註
dcmpg 比較棧頂兩double型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值爲NaN時,將1壓入棧頂
dcmpl 比較棧頂兩double型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值爲NaN時,將-1壓入棧頂
fcmpg 比較棧頂兩float型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值爲NaN時,將1壓入棧頂
fcmpl 比較棧頂兩float型數值大小,並將結果(1,0,-1)壓入棧頂;當其中一個數值爲NaN時,將-1壓入棧頂
lcmp 比較棧頂兩long型數值大小,並將結果(1,0,-1)壓入棧頂
ifeq 當棧頂int型數值等於0時跳轉
ifne 當棧頂int型數值不等於0時跳轉
iflt 當棧頂int型數值小於0時跳轉
ifge 當棧頂int型數值大於等於0時跳轉
ifgt 當棧頂int型數值大於0時跳轉
ifle 當棧頂int型數值小於等於0時跳轉

JAVA類相關操做

1.類屬性字段操做

操做碼 操做數 備註
new 建立類實例
newarray 建立一個指定原始類型(如int,float,char…)的數組,並將其引用值壓入棧頂
anewarray 建立一個引用型(如類,接口,數組)的數組,並將其引用值壓入棧頂
multianewarray 建立指定類型和指定維度的多維數組(執行該指令時,操做棧中必須包含各維度的長度值),並將其引用值壓入棧頂
getfield 獲取指定類的實例域,並將其值壓入棧頂
putfield 爲指定的類的實例域賦值
getstatic 獲取指定類的靜態域,並將其值壓入棧頂
putstatic 爲指定的類的靜態域賦值

2.數組操做

操做碼 操做數 備註
baload 將boolean或byte型數組指定索引的值推送至棧頂
caload 將char型數組指定索引的值推送至棧頂
saload 將short型數組指定索引的值推送至棧頂
iaload 將int型數組指定索引的值推送至棧頂
laload 將long型數組指定索引的值推送至棧頂
faload 將float型數組指定索引的值推送至棧頂
daload 將double型數組指定索引的值推送至棧頂
aaload 將引用型數組指定索引的值推送至棧頂
bastore 將棧頂boolean或byte型數值存入指定數組的指定索引位置
castore 將棧頂char型數值存入指定數組的指定索引位置
sastore 將棧頂short型數值存入指定數組的指定索引位置
iastore 將棧頂int型數值存入指定數組的指定索引位置
fastore 將棧頂float型數值存入指定數組的指定索引位置
dastore 將棧頂double型數值存入指定數組的指定索引位置
aastore 將棧頂引用型數值存入指定數組的指定索引位置

3.方法調用和返回指令

調用以後的結果依舊是在操做棧的code

操做碼 操做數 備註
invokevirtual 用於調用對象的實例方法,根據對象的實際類型進行分派(虛方法分派),這也是Java語言中最多見的方法分派方式。
invokeinterface 用於調用接口方法,它會在運行時搜索一個實現了這個接口方法的對象,找出適合的方法進行調用。
invokespecial 用於調用一些須要特殊處理的實例方法,包括實例初始化方法(§2.9)、私有方法和父類方法。
invokestatic 調用類方法(static方法)。
ireturn 從當前方法返回int
lreturn 從當前方法返回long
areturn 從當前方法返回對象引用
return 從當前方法返回void

4.其餘操做

操做碼 操做數 備註
monitorenter 得到對象的鎖,用於同步方法或同步塊
monitorexit 釋放對象的鎖,用於同步方法或同步塊
athrow 拋出異常信息
jsr 跳轉至指定16位offset位置,並將jsr下一條指令地址壓入棧頂
jsr_w 跳轉至指定32位offset位置,並將jsr_w下一條指令地址壓入棧頂
goto_w 無條件跳轉(寬索引)

大多數的操做碼已經在這兩章中介紹了,小夥伴們能夠簡單的對本身的程序進行編譯查看下操做碼(javap -help)。對於一些簡單的程序就能夠本身去查看。cdn

相關文章
相關標籤/搜索