背景
當自己想使用C語言開發(fā)一個編譯器的時候项滑,需要將文本內(nèi)容轉(zhuǎn)換為匯編語言,此時需要我們對匯編語言具有一定了解及簡單編寫程序涯贞,否則無法繼續(xù)進行編譯器的編寫枪狂。
開發(fā)工具
此處使用MASM32開發(fā)工具,當然也可以選用SASM, 此處由于并不深入學(xué)習(xí)且無兼容性考慮宋渔,因此此處選用MASM32工具州疾。
下載
此處點擊Australia 1/2開始下載
安裝
-
將下載后的安裝包解壓如下圖, 會有一個install.exe文件
-
雙擊install.exe文件,安裝即可皇拣。中間會有一步選擇安裝路徑严蓖,選擇自己想要安裝的盤符即可。
注:此處的盤符影響之后的工作盤符氧急,其他盤符可能無法鏈接到庫文件颗胡。
-
安裝完成后,會在桌面出現(xiàn)如下圖所示的圖標
程序測試
創(chuàng)建文件: File -> New吩坝, 然后Ctrl+S保存(此處的文件的路徑應(yīng)與剛剛安裝的盤符相同, 文件名格式為:xxx.asm)
輸入下列代碼
.486
.model flat, stdcall
option casemap :none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\masm32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\windows.inc
include \masm32\include\msvcrt.inc
include \masm32\include\masm32.inc
include \masm32\macros\macros.asm
.data
.code
start:
print chr$("Hello Wordld!")
print chr$(" ",13,10)
mov eax, sval(input("Enter any press to continue..."))
end start
-
編譯
點擊Project -> Assemble ASM file進行編譯毒姨,編譯之后會在同級目錄下生成后綴名為obj的文件
-
鏈接
點擊Project -> Assemble && file進行鏈接,鏈接之后會在同級目錄下生成后綴名為exe的文件
-
運行
點擊Project -> Run Program钉寝, 出現(xiàn)如下圖結(jié)果
編碼框架
.486
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\windows.inc
.data
// 變量
.code
start:
// 代碼
end start
接下來分別解釋下每行代表什么:
-
.486
告訴匯編器應(yīng)該生成486處理的偽代碼弧呐,也可以使用.386闸迷。
-
.model flat, stdcall
使用平坦內(nèi)存模式并使用stdcall調(diào)用習(xí)慣(stdcall指函數(shù)的參數(shù)從右往左壓入,即最后的參數(shù)先壓入俘枫,且函數(shù)在結(jié)束時清棧)腥沽,這幾乎是所有Windows API函數(shù)和dll的標準
-
option casemap :none
控制字符的映射為大寫。為使“Windows.inc”文件正常工作鸠蚪,這里應(yīng)用為“none”
-
includelib include
為了使用Windows API的函數(shù), 需要導(dǎo)入dll文件今阳。這里由靜態(tài)庫(.lib)完成,它們使系統(tǒng)能在內(nèi)存的動態(tài)基地址處動態(tài)的載入dll茅信。
Includelib \masm32\lib\kernel32.lib
我們不只需要包含靜態(tài)庫盾舌,還需要包含.inc
文件,這是由l2inc工具根據(jù)庫文件自動生成的汹押。include \masm32\include\kernel32.inc
特殊的包含文件Windows.inc
,其中包含了Windows API的所有常量和結(jié)構(gòu)的定義起便。 -
.data
定義變量的地方
-
.code
代碼區(qū)域
-
start ... end start
表示程序的開始/結(jié)束標簽棚贾。這里不一定要用start, 可以使用任何單詞和“end”語句后相同的標簽榆综。