1. 程式人生 > >Win32彙編教程二 Win32彙編程式的結構和語法

Win32彙編教程二 Win32彙編程式的結構和語法


Win32彙編程式的結構和語法

--------------------------------------------------------------------------------

Win32ASM程式的結構和語法

讓我們先來看看一個最簡單的Win32彙編程式:


.386
.model flat, stdcall
option casemap :none ; case sensitive

include windows.inc
include kernel32.inc
includelib kernel32.lib

.data

szCaption db 'Win32彙編例子',0
szText db 'Win32彙編,Simple and powerful!',0

.code

start:
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
invoke ExitProcess,NULL

end start
這就是一個能執行的最簡單的Win32彙編程式,下面我簡單地介紹一下各部分的作用:

.386

這條語句和Dos下彙編是一樣的,是告訴編譯器我們要用到80386的指令集,因為32位彙編程式要用到32位的暫存器如eax,ebx等,所以這一句是必須的,當然,你也可以用.486,.586等,當用到特權指令時,還可以用 .386p,.486p等等。

.model flat,stdcall

.model告訴編譯器程式的模式,編過Dos彙編的人可能知道在Dos程式的模式有tiny,small,...huge 等,它指定了程式記憶體定址模式,在huge等模式下,記憶體定址和子程式呼叫將用Far的格式,但在Win32彙編中,你只能使用一個模式即 flat 模式,因為對Win32程式來說,記憶體是連續的一個4GB的段,無所謂小或大的模式。而stdcall 告訴編譯器引數的傳遞方式,在呼叫子程式時,引數是通過堆疊傳遞的,引數的傳遞方式有三種,stdcall,c 和 pascal,stdcall 指定了引數是從右到左壓入堆疊的,比如說對一個Windows API 如 MessageBox,在手冊中是如此定義的:

int MessageBox(

HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);

那麼在彙編中我們就可以這樣呼叫它:


push uType
push lpCaption
push lpText
push hWnd
call MessageBox

大家要注意最右面的引數是最後一個進堆疊的,當然,我們不必這樣麻煩的呼叫一個 API,因為Masm中的一個巨集語句不但幫助我們完成了所有的壓棧操作,還幫我們檢查引數的個數是否正確,那就是 invoke 語句,我們可以把上面的語句換成 invoke MessageBox,hWnd,lpText,lpCaption,uType 就行了。如本程式中代入實際引數就成了 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK。

include 語句

include 語句包含了一些系統的定義和API函說明,其中所有的Windows 資料結構定義和常量定義包含在 windows.inc 中,而其他 API函式的說明包含在 xxx.inc 中, 如查 Microsoft Win32 Programmer's Reference 知道 ExitProcess包含在kernel32.dll 中,那麼我們就要在程式中包括 include kernel32.inc 和 includelib kernel32.lib語句,否則在編譯時會出現 API 函式未定義的錯誤。而 MessageBox 在 user32.dll 中,那麼我們就要在程式中包括 include user32.inc 和 includelib user32.lib語句

.data 或 .data?

指明瞭接下來是資料段,.data 定義了預定義的變數,.data?定義了未初始化的變數,兩者的不同之處是 .data? 定義的變數並不佔用 .exe 檔案的大小,而是在程式執行時動態分配,所以開始是不指定初始值的資料可以放在 .data? 段中,如一個1K大小的緩衝區,放在 .data?中,程式將不會增加一個位元組。

.code

指明瞭接下來是程式碼段,我們的所有程式碼都放在這裡。最後的一句 start 語句指定了程式開始執行的語句。程式中的 ExitProcess 是一個標準的 Win32 API,對應 Dos彙編中的 int 20h 或 mov ah,4ch/int 21h,也就是程式退出。而 MessageBox 也是一個標準的 API,功能是在螢幕上顯示一個訊息框,具體的引數上面已經解釋過了還有要注意的是 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK 語句中, MB_OK 和 NULL 已經預定義在 Windows.inc 中。

相關推薦

Win32彙編教程 Win32彙編程式結構語法

Win32彙編程式的結構和語法--------------------------------------------------------------------------------Win32ASM程式的結構和語法讓我們先來看看一個最簡單的Win32彙編程式:.386

php面試題之——數據結構算法(高級部分)

ash item name queue lis 雙向 joseph test 數據結構和算法 二、數據結構和算法 1.使對象可以像數組一樣進行foreach循環,要求屬性必須是私有。(Iterator模式的PHP5實現,寫一類實現Iterator接口)(騰訊) <?

WordPress系列教程()----WordPress基本使用常用設定

接著上文,上篇文章已經把網站搭建好了,這篇主要講WordPress基本使用與常用設定。 一、前後臺頁面 預設前臺頁面是這個樣子: 後臺是這個樣子: 後臺包含以下這些模組: 下面我們就來講講上面的功能。 二、文章 文章欄目下包括,寫文章,分類目

3.VHDL的基本結構語法

目錄 IF語句 1.順序語句 順序語句僅出現在程序和子程式中。順序語句綜合後 , 對映為實際的閘電路,系統一上電, 閘電路開始工作 。電路可實現邏輯上 的順序執行,實際上所有閘電路是並行工作的。 賦值語句要點: 賦值語句 流程控制語句 空

Quartz教程:API,JobTrigger

原文連結 | 譯文連結 | 翻譯:nkcoder | 校對:方騰飛 本系列教程由quartz-2.2.x官方文件翻譯、整理而來,希望給同樣對quartz感興趣的朋友一些參考和幫助,有任何不當或錯誤之處,歡迎指正;有興趣研究原始碼的同學,可以參考我對quartz-core原始碼的註釋(進行中)。

Scala坑(控制結構函式)

在Scala中幾乎所有構造出了的語法結構都有值 1.條件表示式 不同java,Scala的if/else語法結構有值,值是跟在if或者else後面的表示式的值 if(x > 0) 1 else 0    把值賦給變數  val s = if(x >0) 1 el

2.VHDL的基本結構語法(一)

目錄 類屬說明 程序與時鐘 程序的啟動 1.VHDL基本結構  實體(Entity) :描述所設計的系統的外部介面訊號 ,定義電路設計中所有的輸入和輸出埠;  結構體 (Architecture) :描述系統內部

WIN32彙編 選單加速鍵的使用

一.首先是選單加速鍵資原始檔:#define ICO_MAIN 4096 #define IDM_MAIN 8192 #define IDM_OPEN 16641 #define IDM_OPTION 16642 #define IDM_EXIT 16643 #define

Win32彙編--如何使用資源 [選單加速鍵]

使用資源 —— 選單和加速鍵   主選單,頂層選單,彈出式選單,子選單,右鍵彈出式選單,系統彈出式選單。選單中的選單項有好幾種,從資源定義的角度來看,分隔用的橫線也是一個選單項,除橫線外其他選單項可以供使用者選擇,也可以設定為“禁止”或“灰化”狀態暫時停用。   選單

[彙編]_[初級]_[VS2010搭建彙編開發環境win32x64]

場景:1. 雖然使用MASM32也可以編譯執行彙編程式,但是既然裝了VS2010,它也能支援編譯執行彙編吧.不然微軟的開發人員難道還不用vs寫彙編程式了?2. x64程式是大勢所趨,win32(只能支援4G記憶體)逐漸退出舞臺了,所以x64編譯彙編也是必然要知道的.win32

線索叉樹的構建遍歷------小甲魚數據結構算法

-- tag typedef pre == 約定 cnblogs amp scan #include <stdio.h> #include <stdlib.h> typedef char ElemType; // 線索存儲標誌位 // Link

叉樹數據結構算法

span reat 排序 算法 eof 打印路徑 所有結點 數據 oot 參考:http://blog.csdn.net/dazhong159/article/details/7906916 百度面試題目: 輸入一個整數和一棵二元樹。從樹的根結點開始往下

win10環境下VTK7.1的編譯Qt調用VTK的詳細教程(VS2013編譯支持Qt的VTK庫)

span ble 導致 解決方法 log 發現 ear files 沒有 本文主要用於編譯支持Qt的VTK庫,重點在於編譯VTK庫,供Qt調用。 第1步:新建一個文件夾:vtkDir 第2步:在該文件夾下新建兩個文件夾vtk_bin、vtk_src 第3步:將下載好的V

Java數據結構算法()——數組

image 創建 函數 編程 局限性 總結 遍歷數組 ron 添加   上篇博客我們簡單介紹了數據結構和算法的概念,對此模糊很正常,後面會慢慢通過具體的實例來介紹。本篇博客我們介紹數據結構的鼻祖——數組,可以說數組幾乎能表示一切的數據結構,在每一門編

Java數據結構算法(十)——2-3-4樹

oid 樹的高度 n+1 tno != val post 節點數據 isp   通過前面的介紹,我們知道在二叉樹中,每個節點只有一個數據項,最多有兩個子節點。如果允許每個節點可以有更多的數據項和更多的子節點,就是多叉樹。本篇博客我們將介紹的——2-3

微擎次開發教程之系統目錄結構

上傳 定制 配置文件 附加組 htm 需要 數據 二次 ins 今天春哥技術博客和大家分享下關於微擎二次開發教程之系統目錄結構,希望可以幫到大家。 入口腳本入口腳本是應用啟動流程中的第一環,入口文件根據“系統配置文件”初始化了系統的常量、全局變量及全局對象,並將終端用戶的請

python環境下使用mysql數據及數據結構叉樹算法(圖)

結點 sel 連續 編號 binary 樹搜索 pass 技術分享 種類 python環境下使用mysql數據及數據結構和二叉樹算法(圖):1 python環境下使用mysql2使用的是 pymysql庫3 開始-->創建connection-->獲取curso

《組合語言》實驗——用機器指令彙編指令程式設計

.title { background-color: #4682B4 } 實驗任務一:使用debug將下面的程式寫入記憶體,逐條執行,根據指令執行後的實際執行情況填空。 前提說明:為便於驗證實驗結果,對實驗任務一做了2點調整: ①在使用a命令輸入指令除錯前,使用e命令將記憶體單元0021:0~002

資料結構演算法緒論(

1、演算法概念 不同的演算法可以提高計算相同算術題的效率,那麼演算法的研究就變得有意義了。 2、演算法的特性 輸入 輸出 有窮性(執行有限的步驟) 確定性(每一個步驟僅有一個含義) 可行性 3、演算法設計要求 沒有無法錯誤、有合法輸入和輸出 4、演算法效率 度量方法: 事前分析估算方法

win32 彙編基礎概念整理

一、關於暫存器 暫存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是暫存器,但只有在CALL/RET在中會預設使用它,其它情況很少使用到,暫時可以不用理會。 EAX是WIN32 API 預設的返回值存放處。 ECX是LOOP指令自動減一的暫存器。 ESP是堆