日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

java虚拟机xadd指令学习

發布時間:2025/4/14 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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指令学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。