• <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

            低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

            基于棧的虛擬機(jī)的實(shí)現(xiàn)

            上次的編譯原理練習(xí)中,生成的目標(biāo)代碼是別人寫(xiě)的一個(gè)基于寄存器的簡(jiǎn)單虛擬機(jī)。這

            回這個(gè)簡(jiǎn)單的基于棧的虛擬機(jī),純碎是為了彌補(bǔ)上回的練習(xí)不足。

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

            對(duì)指令運(yùn)算的中間值的保存方式。這些中間值包括各種運(yùn)算的結(jié)果值,傳給各個(gè)指令的參

            數(shù)等等。前者一般會(huì)設(shè)置幾個(gè)寄存器,如累加寄存器;后者則沒(méi)有寄存器,只有一個(gè)用來(lái)

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

            ADD:從棧中依次彈出兩個(gè)數(shù)a和b,然后將b+a壓棧(b是左操作數(shù))?;谶@樣一個(gè)方

            式,SM中大部分指令都不需要操作數(shù),其操作數(shù)都直接從棧頂取。因?yàn)檫@個(gè)虛擬機(jī)僅僅是

            用于上回設(shè)計(jì)的簡(jiǎn)單語(yǔ)言的運(yùn)行,即沒(méi)有函數(shù)、只有數(shù)字類(lèi)型、有if和while。在這回練習(xí)中

            我甚至把邏輯運(yùn)算符給閹割了,只保留了大于小于之類(lèi)的關(guān)系運(yùn)算符。以下是該語(yǔ)言計(jì)算階

            乘的例子:

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

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

            不過(guò),SM中還是有一個(gè)寄存器,即指令指針寄存器(pc),永遠(yuǎn)指向?qū)⒁獔?zhí)行的指令。在實(shí)現(xiàn)中,

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

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

            內(nèi)存也被簡(jiǎn)單地用一個(gè)數(shù)組來(lái)實(shí)現(xiàn),所以,指令中的所有地址,都是數(shù)組索引值。

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

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

            指令放進(jìn)指令數(shù)組,然后逐條解釋執(zhí)行,直到遇到空指令。

            代碼中的test是上面簡(jiǎn)單提到的編程語(yǔ)言的編譯程序,該程序?qū)⒃创a編譯為SM可執(zhí)行的二進(jìn)制

            文件(sm后綴)。為了方便調(diào)試,SM本身可以根據(jù)命令行參數(shù)輸出二進(jìn)制文件對(duì)應(yīng)的反匯編代碼,

            這可以方便我調(diào)試編譯程序的代碼生成是否正常工作。同時(shí),當(dāng)初為了測(cè)試SM的正確性,還寫(xiě)了

            個(gè)簡(jiǎn)單的匯編程序(sasm),可以把SM的匯編代碼轉(zhuǎn)換為二進(jìn)制文件。

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

            提示警告,看起來(lái)應(yīng)該跟if中的懸掛else二義性有關(guān)系。不過(guò)通過(guò)添加空的文法符號(hào),居然解決了。

            不清楚為什么上回死活有問(wèn)題,詭異了。

             

            下載SM

            posted on 2010-04-15 19:56 Kevin Lynx 閱讀(7808) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 編譯原理

            久久99精品久久久久久齐齐| 欧美黑人激情性久久| 国内精品人妻无码久久久影院| 久久99久久99精品免视看动漫 | 国产午夜久久影院| 国产成人精品久久综合| 亚洲精品tv久久久久久久久久| 麻豆AV一区二区三区久久| 久久人人爽人爽人人爽av| 国内精品久久人妻互换| 无码八A片人妻少妇久久| 热久久这里只有精品| 亚洲国产精品一区二区久久hs| www亚洲欲色成人久久精品| 欧洲人妻丰满av无码久久不卡| 欧美午夜A∨大片久久| 久久这里只有精品久久| 亚洲色欲久久久综合网东京热| 久久99精品久久久久久水蜜桃 | 精品无码久久久久久尤物| 亚洲伊人久久综合影院| 99热热久久这里只有精品68| 国产综合久久久久| 亚洲精品无码久久一线| 久久无码高潮喷水| 色99久久久久高潮综合影院| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久久亚洲AV成人网人人网站| 国产精品欧美久久久久天天影视 | 久久婷婷久久一区二区三区| 麻豆AV一区二区三区久久| 思思久久99热只有频精品66| 久久久久成人精品无码 | 久久久久免费看成人影片| 狠狠色丁香久久婷婷综合_中| 青青青青久久精品国产h久久精品五福影院1421 | 蜜臀av性久久久久蜜臀aⅴ| 亚洲国产精品无码久久一线| 九九精品久久久久久噜噜| 国内精品伊人久久久久妇| 久久99久国产麻精品66|