(譯)win32asm教程-10 (轉)

gugu99發表於2008-05-28
(譯)win32asm教程-10 (轉)[@more@] 

11.0 中的基礎:namespace prefix = o ns = "urn:schemas--com::office" />

現在你已經有了一些組合語言的基礎知識,你將要學習在Windows中怎樣學習彙編。

10.1

Windows的根本在於Windows API,應用介面。這是由操作提供的一套。每個Windows程式設計師都要用這些函式。這些函式在像kernel, user, gdi, , advapi等系統dll中。函式有兩類:ANSI和Unicode。這和字串的方法有關。Ansi中,每個位元組代表一個符號(ASCI碼),並用位元組0代表一個字串的結束(null-tenated)。Unicode使用寬字元格式。它的每個位元組用2個位元組。這允許像中文等多字元的語言的使用。寬字串由兩個0位元組結束。Windows透過使用不同的函式名,同時支援Ansi和Unicode。

例如:

MessageBoxA(字尾A意為ansi)
MessageBoxW(字尾W意為寬字元-unicode)

我們只使用ansi型

11.2匯入dll

為了使用來自WindowsAPI的函式,你需要匯入dll。這是由匯入庫(.lib)來完成的。這些庫是必需的。因為它們使系統(Windows)能在的動態基地址處動態的載入dll。在asm包中(win32asm.cjb)提供了大多數標準dll的庫。你可以用masm的includelib語句裝載一個庫。

譯者注:注意,win32asm.cjb.net被中國封了ip。訪問請使用。

Includelib C:masm32libkernel32.lib

這將載入庫kernel32.lib。在例子中,用這種格式:

Includelib masm32libkernel32.lib

現在你可以看到為什麼彙編源要和masm在同一個區的原因了。你可以不改動路徑為正確的區就能在其他的上編譯你的程式。

但你不只是需要包含庫。包含檔案(.inc)也是必須的。這些可以用l2inc工具由庫檔案自動生成。包含檔案這樣裝載:

include masm32includekernel32.inc

在包含檔案中,定義了dll中函式的原型(s),因而你能使用invoke。

kernel32.inc:
...
MessageBoxA proto stdcall :D, :DWORD, :DWORD, :DWORD
MessageBox textequ
...

你能看到包含檔案內有for Ansi的函式而且沒有‘A’的函式名字定義為與真實函式名一樣:你可以用MessageBox代替MessageBoxA使用。在你包含了庫和包含檔案後,你可以使用函式了:

invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, NULL

11.3 Windows包含檔案

這裡有一個特別的包含檔案。大多數的時候統稱為Windows.inc,其中包含了用於Windows API的所有常量和結構的定義。例如,訊息框有不同的樣式。函式的第四個引數是樣式。NULL指的是MB_OK,它只有一個OK按鈕。Windows包含檔案有這些樣式的定義:

MB_OK equ 0
MB_OKCANCEL equ ...
MB_YESNO equ ...

因此你可以把這些名字當常數來用:

invoke MessageBox, NULL, ADDR MsgText, ADDR MsgTitle, MB_YESNO

例子將使用masm包中的包含檔案:

include masm32includewindows.inc

11.4

.486
.model flat, stdcall

option casemap:none

includelib masm32libkernel32.lib
includelib masm32libuser32.lib
includelib masm32libgdi32.lib

include masm32includekernel32.inc
include masm32includeuser32.inc
include masm32includegdi32.inc

include masm32includewindows.inc

.data

blahblah

.code

start:

blahblah

end start

這是Windows彙編原始檔(.asm)的基本框架

.486

告訴彙編器應該生成486(或更高)的虛擬碼。你可以使用.386,但大多數情況下用.486

.model flat, stdcall

使用平坦記憶體(在前面章節中討論了)並使用stdcall習慣。它的意思是函式的引數從右往左壓入(最後的引數最先壓入)而且函式在結束時自己清棧。這對於幾乎所有的Windows API函式和dll是標準

option casemap:none

控制字元的對映為大寫。為了Windows.inc檔案能正常工作,這個應該為”none”

includelib

前面討論了

include

前面也討論了

.data

開始data部分(看前面章節)

.code

開始code部分(看前面章節)

start:
end start

表示一個程式的開始的標籤。它不是非得叫“start”。你可以使用任何和“end”語句後相同的標籤:

startofprog:

end startofprog


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004759/,如需轉載,請註明出處,否則將追究法律責任。

相關文章