java虚拟机xadd指令学习
寫一個(gè)小程序;
public class hello3 {public static void main(String[] args) { int a1 = 101;int a2 = 202;int a3 = a1 + a2;System.out.println(a3);} }對class反匯編;
public class hello3 {public hello3();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>": ()V4: returnpublic static void main(java.lang.String[]);Code:0: bipush 1012: istore_13: sipush 2026: istore_27: iload_18: iload_29: iadd10: istore_311: getstatic #2 // Field java/lang/System.out:Ljava/ io/PrintStream;14: iload_315: invokevirtual #3 // Method java/io/PrintStream.printl n:(I)V18: return }先看一下兩個(gè)push指令;
bipush
? ? 將一個(gè)byte類型數(shù)據(jù)入棧;
? ? 格式:bipush byte
? ? 將立即數(shù)byte帶符號擴(kuò)展為一個(gè)int類型的值value,然后將value入棧到操作數(shù)棧中;
bipush ? ?將單字節(jié)的常量值(-128~127)推送至棧頂
sipush ? ?將一個(gè)短整型常量值(-32768~32767)推送至棧頂
istore_<n>
? ? 將一個(gè)int類型數(shù)據(jù)保存到本地變量表中;
? ? <n>必須是一個(gè)指向當(dāng)前棧幀局部變量表的索引值;
先把101壓入操作數(shù)棧,然后保存到本地變量表;再對202進(jìn)行同樣操作;只是不了解為什么一個(gè)數(shù)用bipush,一個(gè)數(shù)用sipush;也許是隨機(jī)的,也許有原因;
之后執(zhí)行兩個(gè)iload指令,
?
iload_<n>
? ? 從局部變量表加載一個(gè)int類型值到操作數(shù)棧中;
? ? <n>代表一個(gè)當(dāng)前棧幀中局部變量表的索引值;
把兩個(gè)數(shù)放入操作數(shù)棧;
然后執(zhí)行iadd;也就是虛擬機(jī)中加法的時(shí)候,兩個(gè)數(shù)都是在操作數(shù)棧中;
加法指令:xadd
以上x=i,l,f,d分別表示int型、long型、float型、double型;
加完之后?istore_3,結(jié)果存到本地變量表;
然后getstatic;
然后iload_3,把結(jié)果放入操作數(shù)棧;
然后就是invokevirtual調(diào)用println方法輸出結(jié)果;
invokevirtual 虛擬機(jī)指令:用于調(diào)用對象的實(shí)例方法,根據(jù)對象的實(shí)際類型進(jìn)行分派(虛方法分派),這也是Java語言中最常見的方法分派方式;
?
總結(jié)
以上是生活随笔為你收集整理的java虚拟机xadd指令学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java虚拟机指令初步学习
- 下一篇: Win32 API 浏览目录对话框示例