Win32組合語言學習筆記>>第二課:編寫第一個Win32彙編程式
本節課主要是編譯連線一段寫好的程式碼:
程式執行如下:
程式碼:
.386 .model flat,stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\user32.inc includelib C:\masm32\lib\user32.lib include C:\masm32\include\kernel32.inc includelib C:\masm32\lib\kernel32.lib .data szCaption db '我的第一個彙編程式',0 szText db 'Hello World!',0 .code start: invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK invoke ExitProcess,0 end start
一、編譯、連結程式
切換到源程式目錄(當然你也可以在命令列顯示加上你的源程式的路徑)
編譯: Ml /c /coff 1.asm
連線: Link /subsystem:windows 1.obj
當然你還可以用MASM32視覺化來操作,我的系統是win7的,用MASM32先編譯直接就給我報了個:error RC1110:could not open rsrc.rc
鬱悶,然後就直接:Rebulid ALl ,這樣就一切OK.不知道為什麼。
二、模式定義
.386
.model flat,stdcall
option casemap:none
.386語句是組合語言的偽指令,告訴編譯器使用的是386指令集。比如還有.8086,.186,.286,.386/.386p,.
486/.486p等等。後面帶p的表示程式中可以使用特僅指令,由於我們寫的是Win32程式,不會用到特僅指令,所
以定義.386就夠了,如果要編寫驅動程式的話,就需要用到特僅指令,這時就要定義成.386p。
model語句的格式
.model 記憶體模式[,語言模式][,其他模式]
記憶體模式的定義影響最後生成的可執行檔案,可執行檔案的規模從小到大,可以有很多種型別
模 式 |
內 存 使 用 方 式 |
tiny small medium compact large huge flat |
用來建立 .com檔案,所有的程式碼、資料和堆疊都在同一個64 KB段內 建立程式碼和資料分別用一個64 KB段的 .exe檔案 程式碼段可以有多個64 KB段,資料段只有一個64 KB段 程式碼段只有一個64 KB段,資料段可以有多個64 KB段 程式碼段和資料段都可以有多個64 KB段 同large,並且資料段中的一個數組也可以超過64 KB Win32程式使用的模式,程式碼和資料段使用同一個4 GB段 |
Stdcall是函式呼叫約定:引數從右向左壓棧,由被呼叫函式平衡堆疊
option casemap:none,程式中的大小寫敏感
三、段的定義
.386
.model flat,stdcall
option casemap:none
<一些include語句>
.data
<一些字串、變數定義>
.code
<程式碼>
<開始標號>
<其他語句>
end 開始標號
四、程式的入口與結束
.code
start:
end start
五、什麼是API函式
API(Application Programming Interface,應用程式程式設計介面)
API函式包含在Windows系統目錄下的動態連線庫檔案中(如User32.dll,GDI32.dll,Shell32.dll等等)。.
我們在軟體開發的過程中,經常會使用到很API函式,比如MessageBox就是一個API函式,這個API函式
的功能就是彈出一個對話方塊。