虛擬機器 指令寫出

2021-08-24 21:43:10 字數 2585 閱讀 1841

是的, 還有幾個節點的指令生成沒有測試呢, 包括流控制語句, io. 不過呢, 流控制是相對比較容易優化的, 進行"生成指令再對比"的測試不太好維護, 而 io 指令很簡單: 所以要不這樣, 把指令寫出來, 然後開個虛擬機器執行, 如果執行沒問題就算測試通過了.

一些常見的語義錯誤處理在之前的之前的內容中都以注釋形式出現, 不過如果留心的話, 上次更新的**這些錯誤處理都是完備的, 比如在 jerry-ui.h 和 jerry-ui.c 兩個檔案中給出了這些錯誤的 ui, 而 const.h 中更新了很多字串字面常量巨集作為錯誤資訊. 當然你也可以隨意修改, 隨便它們怎麼運作. 這裡只是稍帶提一下, 以免等會兒突然見到會顯得很突兀.

/* 一般語義錯誤 */

void semanticerr(errmsg err, int line)

/* 符號錯誤* /

void symerror(errmsg err, struct variablenode* var)

引數處理目前採用比較笨的方法, 就是逐個引數進行比較. 比如, 現在允許引數有

/* 輸出幫助資訊 */

#define option_help_info "--help"

/* 指定目標檔案 */

#define option_output_specify "-o"

引數解析迴圈

static int showhelp(int argc, char* argv);

static int setoutputfilename(int argc, char* argv);

static int setfiletoprocess(int argc, char* argv);

void handleparam(int argc, char* argv, file** out)

while (i < argc) else if (0 == strcmp(option_output_specify, argv[i])) else

++i;

}*out = fopen(outfilename, "wb");

if (null == *out)

}

每個分支匹配乙個引數, 然後傳入剩餘的引數到具體的處理函式中去. 而每個處理函式的返回值則是它所消耗的引數個數, 以便於迴圈中調整引數指標.

其它邊邊角角的東西不細說了, 現在切換到 jerry-compiler.c 檔案中. main 函式中並沒有寫出的操作, 在呼叫了 handleparam 之後只是為語法分析進行鋪墊工作和資源分配之類的. 嗯, 另有乙個地方比 main 函式更適合完成這項工作, 那就是壓在語法分析器棧棧底的無名英雄 fakedefaultanalyser 的 consumenonterminal 函式.

很顯然, 當這個函式被呼叫時, 如果沒有任何錯誤, 那麼一定是其它所有分析器都完成任務正常退出了, 因此, 傳遞給它的語法節點就是表徵整個原始檔的語法樹. 那麼只需要將這個節點的指令序列輸出就搞定了.

void fakedefaultanalyserconsument(void* self, struct abstractsyntaxnode* node)

else

fprintf(stderr, "error in source code.\n");

} else

}

現在要做的是, 首先給每條指令烙上偏移值, 以便於讓跳轉指令運作 --- 跳轉指令都會變為一條整數引數指令.
instructioncode code;

int segoffset = 0;

struct iterator* iterator;

struct noparaminstruction* endprog = (struct noparaminstruction*)

allocate(sizeof(struct noparaminstruction));

endprog->code = end_program;

// 加入最後一條結束指令

inslist->addto(inslist, endprog, inslist->count(inslist));

for_each (iterator, inslist) else if (isrealparamins(code))

}

然後寫出總的指令大小, 或者可以稱之為山寨版的**段總長度
if (1 != fwrite(&segoffset, sizeof(segoffset), 1, treeout))
最後一步, 將每個指令寫出
for_each (iterator, inslist) 

// **指令空間

while (0 != inslist->count(inslist))

/* 逐條指令寫出 */

void writeinstruction(void* instruction)

// 帶引數指令寫出引數

if (isintparamins(icode))

} else if (isrealparamins(icode))

} else if (isjump(icode))

}}

請 update jerry 以獲取最新源**.

Bochs虛擬機器debug指令

在學習 linux核心完全注釋 時,為了方便,直接使用了趙博提供的linux 0.11 devel 040923.zip來debug,幫助理解 後來又在哈工大的 上發現了他們作業系統課程的實驗,同樣是關於linux 0.11版本的。後來在使用的過程中,我發現趙博使用的是bochs 2.1.1,而哈工...

虛擬機器指令 shell的使用

在linux學習者初步使用和學習linux的時候,會發現我們對這套作業系統是比較陌生的。而我們想要玩轉linux,那麼就不得不執行一些具有威脅性質的指令,可能會更改系統檔案,在此過程中,稍有不慎就可能會導致系統無法使用甚至癱瘓。因此保險起見,我們在最初的階段,將使用虛擬機器來幫助我們先去了解linu...

1 0虛擬機器的基本操作指令

虛擬機器裡的指令 第一條指令 ls 顯示當前工作路徑下的檔案,並且在命令與引數之間有空格。pwd指令 指的是顯示工作目錄的路徑名稱。即顯示你當前所處的位置 ls 空格 l 顯示檔案的屬性 ls 空格 a cal為日曆名稱,顯示的是當月的。cal空格月份空格年 表示某年某月。cal空格年 會出現某年全...