• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            loop_in_codes

            低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

            基于棧的虛擬機的實現

            上次的編譯原理練習中,生成的目標代碼是別人寫的一個基于寄存器的簡單虛擬機。這

            回這個簡單的基于棧的虛擬機,純碎是為了彌補上回的練習不足。

            基于寄存器(register based)的虛擬機和基于棧(stack based)的虛擬機主要的不同在于

            對指令運算的中間值的保存方式。這些中間值包括各種運算的結果值,傳給各個指令的參

            數等等。前者一般會設置幾個寄存器,如累加寄存器;后者則沒有寄存器,只有一個用來

            保存這些值的棧。例如,這里我實現的SM(stack based machine)中的ADD指令:

            ADD:從棧中依次彈出兩個數a和b,然后將b+a壓棧(b是左操作數)。基于這樣一個方

            式,SM中大部分指令都不需要操作數,其操作數都直接從棧頂取。因為這個虛擬機僅僅是

            用于上回設計的簡單語言的運行,即沒有函數、只有數字類型、有if和while。在這回練習中

            我甚至把邏輯運算符給閹割了,只保留了大于小于之類的關系運算符。以下是該語言計算階

            乘的例子:

            read x;
            if( x > 0 )
            {
            fac = 1;
            while( x > 0 )
            {
              fac = fac * x;
              x = x - 1;
            }
            write fac;
            }
            else
            {
            write 0;
            }

            基本上同《編譯原理與實踐》里的例子一樣,這樣省得我去琢磨語言文法。

            不過,SM中還是有一個寄存器,即指令指針寄存器(pc),永遠指向將要執行的指令。在實現中,

            所有指令都被保存一個數組里,所以pc就是一個指向數組索引的整數值。

            SM中有一個簡單的內存,只用于保存程序中的全局變量(只有全局變量)。同樣,這個虛擬的

            內存也被簡單地用一個數組來實現,所以,指令中的所有地址,都是數組索引值。

            SM的代碼文件直接就是指令序列的二進制表示。在這個二進制文件中,內容依次為:操作碼(1

            字節),操作數(4字節,如果有的話),操作碼,操作數,。。。SM讀取這樣的文件,將這些

            指令放進指令數組,然后逐條解釋執行,直到遇到空指令。

            代碼中的test是上面簡單提到的編程語言的編譯程序,該程序將源代碼編譯為SM可執行的二進制

            文件(sm后綴)。為了方便調試,SM本身可以根據命令行參數輸出二進制文件對應的反匯編代碼,

            這可以方便我調試編譯程序的代碼生成是否正常工作。同時,當初為了測試SM的正確性,還寫了

            個簡單的匯編程序(sasm),可以把SM的匯編代碼轉換為二進制文件。

            這回我特地在文法中間插入action丟給yacc處理,在賦值語句中一切正常。但是在if中yacc依然

            提示警告,看起來應該跟if中的懸掛else二義性有關系。不過通過添加空的文法符號,居然解決了。

            不清楚為什么上回死活有問題,詭異了。

             

            下載SM

            posted on 2010-04-15 19:56 Kevin Lynx 閱讀(7775) 評論(0)  編輯 收藏 引用 所屬分類: 編譯原理

            国产一级做a爰片久久毛片| 久久久久亚洲av无码专区| 99久久精品国产综合一区| 国产精品成人久久久久久久| 久久综合九色欧美综合狠狠| 偷窥少妇久久久久久久久| 久久久久久综合网天天| 色欲av伊人久久大香线蕉影院| 久久夜色精品国产网站| 色综合久久中文色婷婷| 中文成人无码精品久久久不卡| 久久人人添人人爽添人人片牛牛| 色婷婷综合久久久久中文 | 2021最新久久久视精品爱| 99精品国产综合久久久久五月天| 久久电影网2021| 久久99精品久久久大学生| 国产亚州精品女人久久久久久 | 久久久久九国产精品| 人妻精品久久无码专区精东影业| 91精品国产高清久久久久久io| 久久久久亚洲AV成人网| 久久精品人人做人人妻人人玩| 久久精品国产第一区二区| 久久久久久久亚洲Av无码| 无码人妻少妇久久中文字幕| 国产精品久久国产精麻豆99网站| 久久久久久久久66精品片| 久久www免费人成看国产片| 欧美牲交A欧牲交aⅴ久久| 久久久高清免费视频| 久久久久免费视频| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久久久久久女国产乱让韩| 999久久久免费国产精品播放| 久久国产欧美日韩精品| 久久影院午夜理论片无码| 精品久久久无码中文字幕| 99久久精品无码一区二区毛片 | 漂亮人妻被中出中文字幕久久| 青草影院天堂男人久久|