上一章介紹了JAVA
一些基礎類型轉化以及局部變量的入棧等操做JAVA操做碼相關指令介紹(1)。這章繼續給你們介紹下字節碼命令。java
JAVA數值運算
JAVA
裏面提供的整數運算都基於int
和long
類型的運算。當小於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