java虚拟机xadd指令学习
寫一個小程序;
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 }先看一下兩個push指令;
bipush
? ? 將一個byte類型數據入棧;
? ? 格式:bipush byte
? ? 將立即數byte帶符號擴展為一個int類型的值value,然后將value入棧到操作數棧中;
bipush ? ?將單字節的常量值(-128~127)推送至棧頂
sipush ? ?將一個短整型常量值(-32768~32767)推送至棧頂
istore_<n>
? ? 將一個int類型數據保存到本地變量表中;
? ? <n>必須是一個指向當前棧幀局部變量表的索引值;
先把101壓入操作數棧,然后保存到本地變量表;再對202進行同樣操作;只是不了解為什么一個數用bipush,一個數用sipush;也許是隨機的,也許有原因;
之后執行兩個iload指令,
?
iload_<n>
? ? 從局部變量表加載一個int類型值到操作數棧中;
? ? <n>代表一個當前棧幀中局部變量表的索引值;
把兩個數放入操作數棧;
然后執行iadd;也就是虛擬機中加法的時候,兩個數都是在操作數棧中;
加法指令:xadd
以上x=i,l,f,d分別表示int型、long型、float型、double型;
加完之后?istore_3,結果存到本地變量表;
然后getstatic;
然后iload_3,把結果放入操作數棧;
然后就是invokevirtual調用println方法輸出結果;
invokevirtual 虛擬機指令:用于調用對象的實例方法,根據對象的實際類型進行分派(虛方法分派),這也是Java語言中最常見的方法分派方式;
?
總結
以上是生活随笔為你收集整理的java虚拟机xadd指令学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java虚拟机指令初步学习
- 下一篇: Win32 API 浏览目录对话框示例