上文《彙編器原始碼剖析》中,我們對一彙編器進行了原始碼剖析,這裡我們仿照其實現乙個自己版本的彙編器,90%的東西都是借鑑於上文中的原始碼。
實現乙個彙編器,首先需要定義乙個彙編指令集,這裡我們還是沿用上文中的彙編指令集。彙編指令與指令之間是一一對應的關係,也就是說是直譯的過程。我們的指令集是列舉型別,也是沿用上文原始碼的指令集。
我們的函式功能是對輸入的彙編指令,將其讀入,翻譯成對應的二進位制**,然後將其輸出。
實現彙編器的重點在於理解彙編器的原理,而彙編器的原理就在於定義好彙編指令集、二進位制指令集,並且確定好二者之間的對映轉換關係。
以上即是彙編器的原理。具體如何定義彙編指令集、二進位制指令集,如何實現彙編到二進位制的對映轉換,是具體的實現細節,不同的應用場景實現方法可能不同。
這裡,我們給出最為簡單的一種實現模型,我們先給出**,然後根據**講解具體的實現細節。
//測試樣例實現乙個簡單的彙編器
#include #include
#include
#include
#include
using
namespace
std;
enum
binins;
//二進位制指令結構體
//指令碼+運算元
struct
instruction;//
列舉型別的二進位制指令集
enum
binins;//
初始化彙編指令集
void initassembleinstructions(vector&assins)
//初始化
//指令-引數個數
void initinstrctionargnumber(mapint>&insargnum)
//建立彙編指令到二進位制指令的對映
//初始化
void initassembletobinary(const vector& assins, map&asstobin)}//
讀入彙編指令
void readassemble(vector&ass)}//
顯示void display(const vector&bar)
}string stringtoupper(const
string&str)
return
ret;
}void assembletobinary(const vector&ass,
vector
&bin,
const map&asstobin,
mapint>&insargnum)
cout
<< assline <
istringstream sin(assline);
string
strop, strarg;
instruction ins;
binins op;
intarg;
while (sin >>strop)
op = cit->second;
//insargnum為非const型
//asstobin const型保障了insargnum不會存在更新的情況
int argnum =insargnum[op];
if (argnum > 0
)
else
ins.op =op;
ins.arg =arg;
bin.push_back(ins);
}}string inttostring(int n, int
sizeofbytes)
return
ret;
}void outputbinary(const vector&bin,
const mapint>&insargnum)
if (cit->second > 0
)
cout
<
}}int
main()
下面我們對程式進行如下解釋。
資料結構
instruction:指令結構體,有兩個元素op和arg,分別對應於指令碼和運算元。op最多需要乙個運算元。
binins:列舉型別,二進位制指令集。
assins:vector型別,彙編指令集
insargnum:map型別,用來記錄二進位制指令對應的運算元個數
asstobin:map型別,彙編指令到二進位制指令的對映,用於彙編指令到二進位制指令的轉換操作
ass:vector型別,用於儲存輸入的彙編指令
bin:vector型別,用於儲存由彙編指令轉換的二進位制指令
操作函式
initassembleinstruction:用於初始化彙編指令集
initinstructionargnumber:用於初始化二進位制指令對應的運算元個數
initassembletobinary:用於初始化彙編指令到二進位制指令的對映
readassemble:用於讀入彙編指令
display:用於顯示讀入的彙編指令
assembletobinary:用於將彙編指令轉換為二進位制指令
outputbinary:用於將轉換後的二進位制指令輸出
stringtoupper:用於將彙編**統一轉換為大寫,這樣可以忽略彙編**的大小寫
inttostring:用於將int型數轉換為二進位制形式
main:測試函式,先將assins、insargnum、asstobin等初始化,讀入彙編指令,並將其轉換二進位制指令,最後將轉換後的二進位制指令輸出。
彙編器實現的關鍵三點:彙編指令的表示、二進位制指令的表示、彙編指令到二進位制指令之間的轉換三個方面。
在程式中我們對輸入的彙編指令是按照空白符間隔的方式進行的彙編**切分,如果進一步改進,可以對彙編**進行詞法分析,切分出彙編token——指令碼和運算元,然後將指令碼和運算元翻譯成對應的二進位制**。
接下來,我們會分析乙個反彙編器的源**,然後根據反彙編器的實現原理,實現乙個自己的反彙編器。
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...
GNU彙編器 irp和 macro
最近從u boot中摘了一段 出來 源於kernel 這段 作用是用軟體 彙編 實現除法和取模運算,因為有些老的cpu是沒有相關的硬體指令的。在編譯的時候,彙編器報了一些錯誤,這些錯誤都是同一型別,這裡僅列出其中的乙個 error bad instruction reteq lr 錯誤本身還是比較好...