<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

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

COMET虛擬機的設計與實(shí)現

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

2.8 調試器

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

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

3 COMET虛擬機實(shí)現 3.1 虛擬機數據結構

struct comet

{

off_t pc;

short fr;

short gr[5];

short mem[MEMSIZE];

} cmt;

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

3.2 主函數

int

main(int argc, char *argv[])

{

init(argc, argv);

if(debug) comet_debug();

else while(comet_step());

fclose(source);

return 0;

}

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

3.3 字節碼載入

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用于記錄讀取字節碼的數目,如果n小于相應的值,則發(fā)生字節碼裝載錯誤。變量flag用于保存字節碼裝載信息,分別字節碼裝載地址和字節碼大小。

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

3.4 指令解析

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

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

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

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

/* 其他指令函數聲明 */

int comet_step(void)

{

static void (*comet_op)() = {

comet_ld, comet_st, comet_lea,

/* 其他指令執行函數指針 */

};

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

short op = get_op();

/* 執行op對應的代碼 */

(*comet_op [op])();

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

return val;

}

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

3.5 輸入輸出設備

COMET虛擬機在解析每個(gè)指令前,先讀取IO設備狀態(tài)寄存器IO_FLAG中的值,如果IO_FLAG被設置,則執行相應的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類(lèi)型 */

}

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

}

3.6 調試器

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

/* 各種調試命令 */

typedef enum

{

GO, STEP, JUMP, REGS,

IMEM, DMEM, ALTER,

TRACE, PRINT, CLEAR,

HELP, QUIT

} DbType;

/* 調試函數 */

void

comet_debug(void)

{

int cmd; /* 保存調試命令 */

while(1) {

/* 讀調試命令 */

switch(cmd) {

case HELP: /* 幫助文件 */

case GO : /* 執行程序 */

case STEP: /* 分步執行 */

/* 其他調試命令 */

default : /* 未知命令 */

}

}

}

調試函數comet_debug根據不同的調試命令執行相應的操作,并顯示虛擬機狀當前的狀態(tài)信息。

4 運行虛擬機

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

4.1 普通運行

輸入命令:comet sum

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

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

COMET虛擬機輸出:

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

COMET虛擬計算機

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


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


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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>