1. 程式人生 > >基於棧虛擬機器和基於暫存器虛擬機器的比較

基於棧虛擬機器和基於暫存器虛擬機器的比較

虛擬機器的概念

   首先問一個基本的問題,作為一個虛擬機器,它最基本的要實現哪些功能?

   他應該能夠模擬物理CPU對運算元的移進移出,理想狀態下,它應該包含如下概念:
 (1)將原始碼編譯成VM指定的位元組碼。
 (2)包含指令和運算元的資料結構(指令用於處理運算元作何種運算)。
 (3)一個為所有函式操作的呼叫棧。
 (4)一個“指令指標(Instruction Point ---IP)”:用於指向下一條將要執行的指令。
 (5)一個虛擬的“CPU”--指令的派發者:
      1)取指:獲取下一條指令(通過IP獲取)
      2)譯碼:對指令進行翻譯,將要作何種操作。
      3)執行:執行指令。

   以上是CPU的三級流水線操作,實際上五級流水線還包括回寫,即把執行後生成的結果回寫進儲存器。

   有兩種基本的方法實現虛擬機器:基於Stack的和基於Register的,比如基於Stack的虛擬機器有JVM、.net的CLR,這種基於Stack實現虛擬機器是一種廣泛的實現方法。
而基於Register的虛擬機器有Lua VM(是Lau程式語言的虛擬機器)和Dalvik VM。這兩種虛擬機器實現的不同主要在於運算元和結果的儲存和檢索機制不一樣。

Stack-Based虛擬機器

    一個基於Stack的虛擬機器會通過IP來獲取運算元,其運算元都是儲存在Stack資料結構中,從棧中取出資料、計算然後再將結果存入棧中(LIFO,Last in first out)。

如下就是一個典型的計算20+7在棧中的計算過程:


   1、POP 20
   2、POP 7
   3、ADD 20, 7, result
   4、PUSH result

Register-Based虛擬機器

    基於暫存器的虛擬機器,它們的運算元是存放在CPU的暫存器的。沒有入棧和出棧的操作和概念。但是執行的指令就需要包含運算元的地址了,也就是說,指令必須明確的包含運算元的地址,這不像棧可以用棧指標去操作。比如如下的加法操作:


    ADD R1, R2, R3 ;就一條指令搞定了。
    正如前面所說,基於暫存器的VM沒有入棧和出棧的操作。所以加法指令只需要一行就夠了,但是不像Stack-Based一樣,我們需要明確的制定運算元R1、R2、R3(這些都是暫存器)的地址。這種設計的有點就是去掉了入棧和出棧的操作,並且指令在暫存器虛擬機器執行得更快。
     基於暫存器得虛擬機器還有一個優點就是一些在基於Stack的虛擬機器中無法實現的優化,比如,在程式碼中有一些相同的減法表示式,那麼暫存器只需要計算一次,然後將結果儲存,如果之後還有這種表示式需要計算就直接返回結果。這樣就減少了重複計算所造成的開銷。

     當然,暫存器虛擬機器也有一些問題,比如虛擬機器的指令比Stack vm指令要長(因為Register指令包含了運算元地址)。

相關推薦

基於虛擬機器基於虛擬機器比較

虛擬機器的概念    首先問一個基本的問題,作為一個虛擬機器,它最基本的要實現哪些功能?    他應該能夠模擬物理CPU對運算元的移進移出,理想狀態下,它應該包含如下概念:  (1)將原始碼編譯成VM指定的位元組碼。  (2)包含指令和運算元的資料結構(指令用於處理運算元作

自己學驅動17——ARM工作模式ARM9

1.ARM體系CPU的7種工作模式     (1)使用者模式(usr):ARM處理器正常的程式執行狀態。     (2)快速中斷模式(fiq):用於高速資料傳輸或通道處理。     (3)中斷模式(irq):用於通用的中斷處理。     (4)管理模式(svc):作業系統使

彙編:轉移目的地址在機器碼或

  assume cs:code, ds:data data segment db 128 dup (0) data ends code segment start: mov ax, data mov ds, ax jmp far ptr s mov

SIDI的用途

SI是源變址暫存器,DI是目的變址暫存器。可以用來存放資料、地址,功能類似、用法類似、一般使用哪個都可以。 但需要注意的是:在串處理指令中,SI用作隱含的源串地址,預設在DS中;DI用做隱含的目的串地址,預設在ES中;此時不能混用。 BP: 是和堆疊指標SP聯合使

espebp

首先說明,在堆疊中變數分佈是從高地址到低地址分佈,EBP是指向棧底的指標,在過程呼叫中不變,又稱為幀指標。ESP指向棧頂,程式執行時移動,ESP減小分配空間,ESP增大釋放空間,ESP又稱為棧指標。 下面來逐步分析函式的呼叫過程 1.函式main執行,main各個引數從右向左逐步壓入棧中,最後壓入返回

java 虛擬機器如何翻譯位元組碼 基於基於的區別

java 編譯 解釋執行 javac 編譯器 完成了程式程式碼經過詞法分析, 語法分析, 到抽象語法樹, 在遍歷語法樹生成線性的位元組碼指令流的過程 javac 最後是生成了.class 的位元組碼 最後位元組碼需要翻譯成機器語言才能執行

虛擬機器:直譯器,樹遍歷直譯器,基於基於,大雜燴

解析器是parser,而直譯器是interpreter。兩者不是同一樣東西,不應該混用。  前者是編譯器/直譯器的重要組成部分,也可以用在IDE之類的地方;其主要作用是進行語法分析,提取出句子的結構。廣義來說輸入一般是程式的原始碼,輸出一般是語法樹(syntax tree,也叫parse tree等)或抽

於堆疊的(Stack-based ) 基於(Register-based) 的虛擬機器區別

轉載: 虛擬機器可分為兩種:基於堆疊的(Stack-based ) 和基於暫存器(Register-based) 的虛擬機器。基於堆疊的虛擬機器也定義了少量的暫存器,基於暫存器的虛擬機器也有堆疊,其區別體現在它們提供的指令集體系結構(ISA ,Instruc

解釋執行編譯執行的區別、基於基於的指令集區別

1. 解釋執行和編譯執行的區別 我們在學習java的時候,對class檔案都有個疑惑,虛擬機器是如何執行發方法中的位元組碼指令的呢?其實 虛擬機器的執行引擎在執行java程式碼的時候有解釋執行和編譯執行兩種選擇。通俗說來,解釋執行是通過直譯器執行,編譯執行即通

基於基於的指令集架構

用C的語法來寫這麼一個語句: C程式碼   a = b + c;   如果把它變成這種形式: add a, b, c 那看起來就更像機器指令了,對吧?這種就是所謂“三地址指令”(3-address instruction),一般形式為: op dest, src1,

實驗——基於文件驗證MYSQL驗證的vsftpd虛擬用戶

linux實驗一、實現基於文件驗證的vsftpd虛擬用戶1、創建用戶數據庫文件vim /etc/vsftpd/vusers.txtwangwangpassmagemagepasscd /etc/vsftpd/db_load -T -t hash -f vusers.txt vusers.dbchmod 600

基於httpd-2.2httpd-2.4配置虛擬主機web站點,並提供https服務(一)

基於主機名的虛擬主機服務 使用httpd-2.2和httpd-2.4實現> 1.建立httpd服務,要求:> 1) 提供兩個基於名稱的虛擬主機www1, www2;要求每個虛擬主機都有單獨的錯誤日誌和訪問日誌; > 2) 通過www1的/server-status提供狀態信息,且僅允許172

基於httpd-2.2httpd-2.4配置虛擬主機web站點,並提供https服務(二)

基於主機名配置虛擬主機web站點 使用httpd-2.2和httpd-2.4實現> 1.建立httpd服務,要求:> 1) 提供兩個基於名稱的虛擬主機www1, www2;要求每個虛擬主機都有單獨的錯誤日誌和訪問日誌; > 2) 通過www1的/server-status提供狀態信息,且僅允

2018/11/03-、x86架構-《惡意程式碼分析實戰》

  棧用於函式的記憶體、區域性變數、流控制結構等被儲存在棧中。棧是一種用壓和彈操作來刻畫的資料結構,向棧中壓入一些東西,然後再把他們彈出來。它是一種先入後出(LIFO)的結構。   x86架構有對棧的內建支援。用於這種支援的暫存器包括ESP和EBP。其中,ESP是棧指標,包含了指向棧頂的記憶體地址。一些東西

m序列訊號發生器--基於線性移位反饋LFSR

1.m序列簡介 m序列是目前廣泛應用的一種偽隨機序列,其在通訊領域有著廣泛的應用,如擴頻通訊,衛星通訊的分碼多重進接,數字資料中的加密、加擾、同步、誤位元速率測量等領域。m序列在所有的偽隨機序列裡面的地位是最基礎同樣也是最重要的。它的特點就是產生方便快捷,有很強的規律特性,同時自相關性、互

X86-64

概要 說到x86-64,總不免要說說AMD的牛逼,x86-64是x86系列中集大成者,繼承了向後相容的優良傳統,最早由AMD公司提出,代號AMD64;正是由於能向後相容,AMD公司打了一場漂亮翻身戰。導致Intel不得不轉而生產相容AMD64的CPU。這是IT行業以弱勝強的經典戰役。不過,大家為了名稱延續性

STM32入門學習之GPIO(STM32F030F4P6基於CooCox IDE)(操作版)

依然,直接上程式碼 #include "stm32f0xx.h" #include "stm32_lib/inc/stm32f0xx_rcc.h" #include "stm32_lib/inc/stm32f0xx_gpio.h" int main(void) { /

基於stm32-spi2的檔案系統(

前段時間移植了一個FATFS檔案系統之後總是有人問我FATFS移植的問題,有時候很多問題都一樣,只是有些人太浮躁,沒有好好的把那不到1K的原始檔給看一遍而已,今天整理檔案,發現之前下載的一個很不錯的介紹FATFS的文章,裡面基本上把程式碼全部都註釋了,奉獻給大家。原文如下,地址已經找不到了,就不在附

基於ARM9處理器的工作模式&工作狀態&&異常型別總結筆記

ARM9處理器工作模式 改變工作模式的方法:①軟體改變,改變CPSR(當前程式狀態暫存器)的低5位即可;②外部中斷或異常處理改變; 使用者模式:大部分情況下,程式是執行在使用者模式下,此時某些被保護的暫存器是不能訪問; 非使用者模式:除了使用者模式之外的模式;

Operation System: 關於

對於Intel架構的處理器,從8位的暫存器(8位的CPU)一直演進到如今的64位(64位暫存器),為了承上啟下,到現在的64位的CPU還是可以運行當年8位CPU的程式,而如今的暫存器當中,依然是可以從64位中分出8位來應對8位的程式。 如今的暫存器如下圖所示:(圖片來源: