2014-10-27 16 views
1

基於堆棧的和基於寄存器的虛擬機如何處理不同的數據類型?基於(堆棧/註冊)的虛擬機如何處理不同的數據類型

我知道基於堆棧的虛擬機使用堆棧來存儲他們的數據以及在這個堆棧上和下來推送和彈出數據,但他們如何表示這些數據?是否像某種數據可以被轉換爲任何需要的數據或有多個堆棧,每個數據類型一個堆棧,例如ints,浮點數,對象,字符,數組和引用?如果它使用多個堆棧,那麼它是否必須移動東西才能添加說float和int?

另外,基於註冊的虛擬機做類似的事情嗎?

如果許多虛擬機以不同的方式運行,那麼JVM和Dalvik虛擬機就是很好的例子。

在此先感謝。

+2

堆棧中的數據被解釋*的方式通常取決於所執行的操作碼。例如,當有些人可以使用堆棧項目時,有些專用於字節或短操作。堆棧總是存儲相同類型的數據,可能是很長的一段時間。 – Seki 2014-10-27 08:37:28

+0

@Seki,所以它們的數據類型與您的說法完全相同,但是它們是通過不同的操作碼進行轉換或用作不同類型的? – zeitue 2014-10-27 14:50:09

+0

調查[neokvm](http://nekovm.org/)和[lua](http://lua.org/)。兩者都是簡單的虛擬機,並且源代碼是免費軟件。 – 2014-10-27 14:50:12

回答

1

大多數字節碼解釋器和虛擬機做的是要麼...

你可以使用一個工會位轉換成不同的類型,例如在轉變雙到字符數組

union { 
    uint32_t i[2]; 
    double dbl; 
} dbl2ints; 

dbl2chars.dbl = double_value; 

您現在可以使用dbl2chars.i[0]dbl2chars.i[1]中的值將其嵌入任何存放虛擬機內存/數據的內容中。因此,如果您的自定義語言編譯爲VM字節碼,則可以讓編譯器將浮點數/雙精度值編譯爲整數值並使用正確的浮點操作碼,然後將這些位重新解釋爲浮點數/雙精度值。

另一種更流行的方法(如Lua的VM和其他VM所使用的)是製作標記的聯合。

typedef union { 
    float fl; 
    uint32_t ui; 
    char *pstr; 
} valuedata; 

typedef struct { 
    valuedata val; 
    uint32_t valtype; 
} ValType; 
0

基於堆棧和基於寄存器的虛擬機實際上都以相同的方式存儲其數據。基於寄存器的虛擬機使用一組32位或64位字長的字(無符號整數)來表示它們的寄存器。對於基於堆棧的虛擬機,堆棧實現爲一個單詞數組,通常是32位無符號整數,指向數組堆棧頂部的指針。

這些類型的虛擬機實際存儲和處理數據的訣竅是讀取和寫入數據時。例如,要將double加載到基於32位堆棧的虛擬機的堆棧中,這個double將分爲兩部分。 double的上半部分和下半部分將被視爲無符號整數,並簡單地單獨推入堆棧。這些類型的數據轉換可以通過C和C++中的轉換,指針和聯合來實現。

相關問題