(譯)win32asm教程-10 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (譯)win32asm教程-7 (轉)Win32ASM
- (譯)win32asm教程-9 (轉)Win32ASM
- (譯)win32asm教程-8 (轉)Win32ASM
- (譯)win32asm教程-11 (轉)Win32ASM
- (譯)win32asm教程-5 (轉)Win32ASM
- (譯)win32asm教程-6 (轉)Win32ASM
- (譯)win32asm教程-12-完結 (轉)Win32ASM
- (譯)win32asm例項-1 (轉)Win32ASM
- (譯)win32asm例項-3 (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (二) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (四) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (三) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (七) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (六) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (八) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (一) (轉)Win32ASM
- Iczelion 的 Win32Asm VxD 彙編教程 (五) (轉)Win32ASM
- win32asm原理 (轉)Win32ASM
- Win32Asm 教程,來自易語言俱樂部論壇,譯者taowen。 (5千字)Win32ASM
- Win32ASM經驗點滴 (轉)Win32ASM
- [譯] TensorFlow 教程 #06 – CIFAR-10
- [譯] TensorFlow 教程 #06 - CIFAR-10
- 轉載10gocp翻譯Go
- [編譯] 10、kconfig 入門指導教程編譯
- Java Servlet和JSP教程(10)(轉)JavaServletJS
- 遊戲製作相關---HAM教程翻譯本(五)(轉)遊戲
- 遊戲製作相關---HAM教程翻譯本(四)(轉)遊戲
- 【譯】UIVisualEffectView教程UIView
- Openwrt編譯教程編譯
- ZooKeeper 官方教程[翻譯]
- [翻譯]CMAKE官方教程
- Mac OS X 10.15 編譯安裝 Nginx詳細教程Mac編譯Nginx
- 反編譯系列教程(上)編譯
- 反編譯系列教程(中)編譯
- [譯】Redux入門教程(二)Redux
- [譯] TensorFlow 教程 #14 – DeepDream
- [譯]Flask教程–請求物件Flask物件
- [譯]Metal 渲染管線教程