彙編器優化,指令名鍊錶排序與二分查詢

2021-07-30 08:48:37 字數 806 閱讀 7168

在彙編器的詞法分析階段,需要對獲取的指令名進行有效性驗證並儲存對應的指令型別。然而,當前實現方法在效率和管理性方面還有不足,顧需進行優化,主要工作如下圖。

前期實現時,為了快速匹配指令名,建立了乙個與指令集對應的全域性陣列,該陣列按字母表順序索引指令名。具體而言就是將相同首字母的指令放入以該字母命名的一維陣列中,26個字母索引陣列共同構成全域性陣列。

該方法存在兩方面的問題,1 需要手動建立和同步修改全域性陣列和指令集,還需要人工按字母索引分類,**冗餘,不易於管理。2 查詢時需要遍歷索引內的所有指令名,效率不高。

本次優化,使用鍊錶自動遍歷指令集並生成排好序的索引陣列,並在查詢時使用二分法提高效率。

由於指令集中指令並不一定按照字母順序排列,而二分法必須是對有序資料才能進行。因此需要建立乙個包含全部指令名的有序陣列。實現中,使用基於鍊錶的插入排序,表頭資料為全a,為最小的指令名,每次插入時,從表頭查詢,直到第乙個大於新指令名的節點,並將新指令名插入到該節點之前,實現中,需要乙個儲存上乙個節點的臨時變數。由於指令存在多種引數或型別,指令集中包含多條相同名指令,因此需要進行插入前的過濾。

插入排序完成後,需要將鍊錶內容拷貝到陣列中以便使用二分查詢,同時記錄指令總數。

二分查詢對待查詢內容進行折半判斷,每次判斷後,調整查詢區間為之前的一半,本次優化使用遞迴形式實現。

通過以上的優化,去除了之前手工維護的全域性索引陣列,大大簡化**維護和管理工作,並建立相應類,呼叫時直接呼叫類方法,而非之前在使用時的for迴圈遍歷。另一方面,提高了一定的查詢效率。

ARM的ADS彙編器與GCC彙編器

arm的ads彙編器與gcc彙編器 2009 10 14 10 06 彙編器與指令集,不同的cpu對應不同的指令集 不同的彙編器對應不同的語法和偽指令集。每種彙編器都可以有自己的偽指令集和自己的語法,但實際上,由於事實標準的原因,所有的cpu廠商會提供指令使用手冊,手冊中的指令書寫樣式,實際上就是事...

ARM彙編器與GCC彙編器支援的組合語言差別

將arm sdt下的彙編 移植到gcc for arm編譯器時,經常要做如下修改 1 注釋 或者 2 偽操作符替換 jumpaddr jumpaddr 符號定義加 號 include include equ equ tclk2 equ pb25 equ tclk2,pb25 tclk2 equ pb...

實現乙個彙編器

上文 彙編器原始碼剖析 中,我們對一彙編器進行了原始碼剖析,這裡我們仿照其實現乙個自己版本的彙編器,90 的東西都是借鑑於上文中的原始碼。實現乙個彙編器,首先需要定義乙個彙編指令集,這裡我們還是沿用上文中的彙編指令集。彙編指令與指令之間是一一對應的關係,也就是說是直譯的過程。我們的指令集是列舉型別,...