當(dāng)自己想使用C語言開發(fā)一個編譯器的時(shí)候,需要將文本內(nèi)容轉(zhuǎn)換為匯編語言,此時(shí)需要我們對匯編語言具有一定了解及簡單編寫程序,否則無法繼續(xù)進(jìn)行編譯器的編寫。
此處使用MASM32開發(fā)工具,當(dāng)然也可以選用SASM, 此處由于并不深入學(xué)習(xí)且無兼容性考慮,因此此處選用MASM32工具。
此處點(diǎn)擊Australia 1/2開始下載
圖1.png
將下載后的安裝包解壓如下圖, 會有一個install.exe文件
圖2.png
雙擊install.exe文件,安裝即可。中間會有一步選擇安裝路徑,選擇自己想要安裝的盤符即可。
注:此處的盤符影響之后的工作盤符,其他盤符可能無法鏈接到庫文件。
安裝完成后,會在桌面出現(xiàn)如下圖所示的圖標(biāo)
圖3.png
創(chuàng)建文件: File -> New, 然后Ctrl+S保存(此處的文件的路徑應(yīng)與剛剛安裝的盤符相同, 文件名格式為:xxx.asm)
輸入下列代碼
.486.model flat, stdcall option casemap :noneincludelib \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
編譯
點(diǎn)擊Project -> Assemble ASM file進(jìn)行編譯,編譯之后會在同級目錄下生成后綴名為obj的文件
鏈接
點(diǎn)擊Project -> Assemble && file進(jìn)行鏈接,鏈接之后會在同級目錄下生成后綴名為exe的文件
運(yùn)行
點(diǎn)擊Project -> Run Program, 出現(xiàn)如下圖結(jié)果
圖4.png
.486.model flat, stdcall option casemap:none includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\gdi32.libinclude \masm32\include\kernel32.incinclude \masm32\include\user32.incinclude \masm32\include\gdi32.incinclude \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é)束時(shí)清棧),這幾乎是所有Windows API函數(shù)和dll的標(biāo)準(zhǔn)
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é)束標(biāo)簽。這里不一定要用start, 可以使用任何單詞和“end”語句后相同的標(biāo)簽。
作者:_凌浩雨
鏈接:https://www.jianshu.com/p/e082912ef8ef
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
聯(lián)系客服