在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            關(guān) 閉

            新聞中心

            EEPW首頁(yè) > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > COMET虛擬機(jī)的設(shè)計(jì)與實(shí)現(xiàn)

            COMET虛擬機(jī)的設(shè)計(jì)與實(shí)現(xiàn)

            作者: 時(shí)間:2012-07-10 來(lái)源:網(wǎng)絡(luò) 收藏

            2.8 調(diào)試器

            調(diào)試器是一個(gè)內(nèi)嵌在里的機(jī)器級(jí)的調(diào)試器。當(dāng)需要調(diào)試一個(gè)的程序時(shí),只需要在啟動(dòng)的時(shí)給出相應(yīng)的命令參數(shù)就啟動(dòng)調(diào)試功能了[2,4]。

            COMET調(diào)試器的基本功能有:顯示幫助(help),運(yùn)行程序直到停止(go),分步執(zhí)行(step n),跳轉(zhuǎn)程序(jump),顯示寄存器內(nèi)容(regs),顯示內(nèi)存數(shù)據(jù)(dMem),顯示內(nèi)存指令(iMem),修改內(nèi)存數(shù)據(jù)(alter),遍歷指令(trace),指令記數(shù)功能(print),重新裝載字節(jié)碼(clear),退出調(diào)試器(quit)。每個(gè)調(diào)試命令的具體用法可以參考COMET虛擬機(jī)的幫助文件。

            3 COMET虛擬機(jī)實(shí)現(xiàn) 3.1 虛擬機(jī)數(shù)據(jù)結(jié)構(gòu)

            struct comet

            {

            off_t pc;

            short fr;

            short gr[5];

            short mem[MEMSIZE];

            } cmt;

            虛擬機(jī)結(jié)構(gòu)變量cmt是一個(gè)全局變量,成員分別為:指令計(jì)數(shù)器(pc)、標(biāo)志寄存器(fr)、通用寄存器(gr)、存儲(chǔ)器(mem)。將cmt設(shè)計(jì)為全局變量的優(yōu)點(diǎn)是個(gè)函數(shù)不用傳遞復(fù)雜的結(jié)構(gòu)體參數(shù),缺點(diǎn)是每個(gè)進(jìn)程同時(shí)只能有一個(gè)虛擬機(jī)實(shí)例。

            3.2 主函數(shù)

            int

            main(int argc, char *argv[])

            {

            init(argc, argv);

            if(debug) comet_debug();

            else while(comet_step());

            fclose(source);

            return 0;

            }

            函數(shù)init首先初始化COMET虛擬機(jī)并裝載字節(jié)碼,如果發(fā)生錯(cuò)誤則停止。然后根據(jù)調(diào)試器狀態(tài),選擇運(yùn)行虛擬機(jī)的方式。如果調(diào)試開關(guān)(debug)被設(shè)置,則調(diào)用comet_debug函數(shù)在調(diào)試狀態(tài)下運(yùn)行COMET虛擬機(jī)。如果沒有打開調(diào)試開關(guān),則循環(huán)調(diào)用單步執(zhí)行函數(shù)comet_step,直到程序結(jié)束[1,2]。

            3.3 字節(jié)碼載入

            void

            comet_load(void)

            {

            unsigned short n, flag[2];

            fseek(source, 0, SEEK_SET);

            n = fread(flag,

            sizeof(off_t), 2, source);

            n = fread(cmt.mem[flag[0]],

            sizeof(off_t),tmp[1],source);

            /* 其他處理代碼 */

            }

            變量n用于記錄讀取字節(jié)碼的數(shù)目,如果n小于相應(yīng)的值,則發(fā)生字節(jié)碼裝載錯(cuò)誤。變量flag用于保存字節(jié)碼裝載信息,分別字節(jié)碼裝載地址和字節(jié)碼大小。

            COMET字節(jié)碼設(shè)計(jì)比較簡(jiǎn)單,也存在很多不足。例如,沒有標(biāo)志文件格式的魔數(shù),沒有更完善的錯(cuò)誤檢測(cè)措施。我們的目的是讓讀者了解字節(jié)碼的工作原理,因此只給出了一種最簡(jiǎn)單的實(shí)現(xiàn)[1,2,4]。

            3.4 指令解析

            指令的解析一般包含這個(gè)幾個(gè)過(guò)程:取指令,解碼,執(zhí)行。其中解碼對(duì)虛擬機(jī)的執(zhí)行效率有很大的影響[5]。這里采用下標(biāo)索引技術(shù)來(lái)解碼指令。具體代碼如下:

            void comet_ld(void); /* LD指令*/

            void comet_ld(void); /*ST指令 */

            void comet_ld(void); /* LEA指令 */

            /* 其他指令函數(shù)聲明 */

            int comet_step(void)

            {

            static void (*comet_op)() = {

            comet_ld, comet_st, comet_lea,

            /* 其他指令執(zhí)行函數(shù)指針 */

            };

            /* 解析指令,存放在op中 */

            short op = get_op();

            /* 執(zhí)行op對(duì)應(yīng)的代碼 */

            (*comet_op [op])();

            /* 返回執(zhí)行狀態(tài) */

            return val;

            }

            例如,有指令LEA,其對(duì)應(yīng)的機(jī)器碼為031,那么將通過(guò)函數(shù)指針數(shù)組comet_op直接定位到(*comet_op[031])函數(shù),即并執(zhí)行相應(yīng)的comet_lea函數(shù)。

            3.5 輸入輸出設(shè)備

            COMET虛擬機(jī)在解析每個(gè)指令前,先讀取IO設(shè)備狀態(tài)寄存器IO_FLAG中的值,如果IO_FLAG被設(shè)置,則執(zhí)行相應(yīng)的IO操作[3]。具體代碼如下:

            void

            comet_io(void)

            {

            switch(cmt.mem[IO_FLAG]IO_TYPE)

            {

            case IO_NULL:

            /* 無(wú)IO操作 */

            case IO_OCT IO_IN:

            /* 八進(jìn)制輸入 */

            case IO_DEC IO_IN:

            /* 十進(jìn)制輸入 */

            case IO_HEX IO_IN:

            /* 十六進(jìn)制輸入 */

            case IO_OCT IO_OUT:

            /* 八進(jìn)制輸出 */

            case IO_DEC IO_OUT:

            /* 十進(jìn)制輸出 */

            case IO_HEX IO_OUT:

            /* 十六進(jìn)制輸出 */

            default:

            /* 未知IO類型 */

            }

            /* 重置IO狀態(tài)寄存器IO_FLAG */

            }

            3.6 調(diào)試器

            調(diào)試程序是建立和單步執(zhí)行的COMET虛擬機(jī)之上的。當(dāng)沒有打開調(diào)試功能時(shí),循環(huán)執(zhí)行COMET虛擬機(jī)字節(jié)碼程序,直到停止。當(dāng)打開了調(diào)試功能時(shí),調(diào)試函數(shù)debug根據(jù)調(diào)試命令,執(zhí)行相應(yīng)步的指令、顯示或操作相關(guān)的數(shù)據(jù)。

            /* 各種調(diào)試命令 */

            typedef enum

            {

            GO, STEP, JUMP, REGS,

            IMEM, DMEM, ALTER,

            TRACE, PRINT, CLEAR,

            HELP, QUIT

            } DbType;

            /* 調(diào)試函數(shù) */

            void

            comet_debug(void)

            {

            int cmd; /* 保存調(diào)試命令 */

            while(1) {

            /* 讀調(diào)試命令 */

            switch(cmd) {

            case HELP: /* 幫助文件 */

            case GO : /* 執(zhí)行程序 */

            case STEP: /* 分步執(zhí)行 */

            /* 其他調(diào)試命令 */

            default : /* 未知命令 */

            }

            }

            }

            調(diào)試函數(shù)comet_debug根據(jù)不同的調(diào)試命令執(zhí)行相應(yīng)的操作,并顯示虛擬機(jī)狀當(dāng)前的狀態(tài)信息。

            4 運(yùn)行虛擬機(jī)

            下面通過(guò)一個(gè)求(1 + 2 + … + n)的程序,來(lái)介紹其在COMET虛擬機(jī)上的執(zhí)行的流程。程序的字節(jié)碼由相關(guān)的工具生成,保存為sum.comet文件(后綴為comet)。

            4.1 普通運(yùn)行

            輸入命令:comet sum

            在COMET虛擬機(jī)獲得sum參數(shù)后,會(huì)自動(dòng)識(shí)別為sum.comet字節(jié)碼文件。

            輸入100,表示求1+2+…+100的和。

            COMET虛擬機(jī)輸出:

            ===============

            COMET虛擬計(jì)算機(jī)

            存儲(chǔ)器相關(guān)文章:存儲(chǔ)器原理


            塵埃粒子計(jì)數(shù)器相關(guān)文章:塵埃粒子計(jì)數(shù)器原理


            關(guān)鍵詞: COMET 虛擬機(jī)

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉