簡體   English   中英

bipush在JVM中如何工作?

[英]How does bipush work in JVM?

我知道iload接受的整數是-1到5,但是如何使用bipush指令擴展到更高的數字? 特定的整數如何與字節碼一起存儲?

我認為您正在尋找JVMS的2.11節 ,其中涉及指令表示。 特別是,它使用明顯的順序:操作碼,緊隨其后的是操作數,順序為big-endian(作為所有Java表示形式)。 bipush的情況下,這將是字節0x10,后跟文字值。

有幾種不同的指令可用於推送整數常量。

最小的是iconst_ *指令。 這些只是一個字節,因為該值是在操作碼本身中編碼的。 iconst_1,iconstst_2等是不同的操作碼。 例如, iconst_5將被編碼為字節08

注意: iload是完全不相關的指令,用於加載局部變量的值。 您一定在想過icont_ *。

接下來是bipush ,可以在-128到127之間推送一個常數。該指令的長度為2個字節-第一個字節為操作碼,第二個字節為帶符號的8位整數。 您甚至可以使用它在-1到5范圍內推送常量,盡管這樣做會在類文件中占用不必要的空間。 例如, bipush 5將被編碼為10 05 (0x10是bipush的操作碼)

接下來是sipush ,除了它存儲一個16位常量而不是一個8位常量之外,其他都是相同的,因此該指令的長度為3個字節。 sipush的操作碼為0x11,因此sipush 5將被編碼為三個字節的序列11 00 05

您可能想知道如何存儲不適合16位的整數常量。 在這種情況下,編譯器將在類文件的單獨部分(稱為常量池)中創建條目,然后使用ldcldc_w指令引用常量池條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM