Win32ASM學習[21]:宏匯編(1)

?--------------------------------------------------------------------------------------------------------------------

嗯?? 上個星期到現在?? 把Win32ASM基礎匯編復習了下?? 在網上找到了? 這個不錯系列

于是就轉載過來了?? 其中? 根據我自己的水平? 刪減了一些內容?或者增加了一些內容

如果要看原來的內容的?? 請訪問原創:http://www.cnblogs.com/del/category/121079.html?

?--------------------------------------------------------------------------------------------------------------------

宏可定義在源程序的任意位置, 但一般放在 .data 前面.
有些簡單的宏可以用 equ、textequ 或 = 來代替, 但宏有更復雜的功能.

"宏" 的本質是 "替換", 但又像極了 "子過程";
所以即有宏過程(macro procedure)、也有宏函數(macro function).
它既以有參數(可以是: 常數、變量、寄存器、指令、表達式), 有時也需要像子過程一樣聲明.
宏可以指定哪些參數是必須的, 還可以給參數默認值.

宏可以包含數據(.data)和代碼(.code)、還可以嵌套.
宏中的注釋使用 ;; 如果只用 ; 將會被一起替換到代碼中.

宏的功能很強大, 現在常用的 PrintDec、PrintHex、PrintString、PrintText 等等都是宏.
再強大它也只是 "文本替換".

"宏" 和 "子程序" 相比:
1、宏展開后順序執行, 不像調用子程序跳來跳去, 這樣程序會更 "快";
2、宏展開后會讓代碼量增大, 導致程序變 "大".
--------------------------------------------------------------------------------------------------------------------
一個簡單的宏:
--------------------------------------------------------------------------------------------------------------------
; Test34_1.asm
.386
.model flat, stdcall

include??? windows.inc
include??? kernel32.inc
include??? masm32.inc
include??? debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;定義一個 mExit 宏
mExit macro
??? PrintLine
??? ret
endm

.code
sum proc v1, v2, v3
??? mov eax, v1
??? add eax, v2
??? add eax, v3
??? ret
sum endp
;
main proc
??? invoke sum, 11, 22, 33
??? PrintDec eax ;66
??? ;PrintLine
??? ;ret
??? mExit ;mExit 將被替換為上面兩行代碼
main endp
end main
--------------------------------------------------------------------------------------------------------------------
一個代替求和函數的宏:
--------------------------------------------------------------------------------------------------------------------
; Test34_2.asm
.386
.model flat, stdcall

include??? windows.inc
include??? kernel32.inc
include??? masm32.inc
include??? debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

mSum macro v1, v2, v3
??? mov eax, v1
??? add eax, v2
??? add eax, v3
endm

.code
main proc
??? mSum 11, 22, 33
??? PrintDec eax ;66
??? PrintLine
??? mSum 11, 22, 33, 44, 55 ;多余的參數會被忽略
??? PrintDec eax ;66
??? PrintLine
??? ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
宏參數的默認值:
--------------------------------------------------------------------------------------------------------------------
; Test34_3.asm
.386
.model flat, stdcall

include??? windows.inc
include??? kernel32.inc
include??? masm32.inc
include??? debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;參數 v1、v2 通過 REQ 標識說明是必備參數
;參數 v3、v4 給出了默認值
mSum macro v1:req, v2:req, v3:=<33>, v4:=<44>
??? mov eax, v1
??? add eax, v2
??? add eax, v3
??? add eax, v4
endm

.code
main proc
??? mSum 11, 22
??? PrintDec eax ;110
??? PrintLine
??? ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
EXITM: 退出宏
--------------------------------------------------------------------------------------------------------------------
; Test34_4.asm
.386
.model flat, stdcall

include??? windows.inc
include??? kernel32.inc
include??? masm32.inc
include??? debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

mPrint macro
??? PrintText '第一行'
??? PrintText '第二行'
??? exitm
??? PrintText '第三行'
endm

.code
main proc
??? mPrint ;只會輸出前兩行
??? ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
PURGE: 取消宏
--------------------------------------------------------------------------------------------------------------------
; Test34_5.asm
.386
.model flat, stdcall

include??? windows.inc
include??? kernel32.inc
include??? masm32.inc
include??? debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

mPrint macro
??? PrintText '第一行'
??? PrintText '第二行'
??? PrintText '第三行'
??? PrintLine
endm

.code
main proc
??? mPrint
??? mPrint
??? purge mPrint ;可用逗號隔開取消多個宏
??? mPrint?????? ;這個宏不會展開了
??? ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
宏中 local 的使用:
--------------------------------------------------------------------------------------------------------------------
; Test34_6.asm
.386
.model flat, stdcall

include??? windows.inc
include??? kernel32.inc
include??? masm32.inc
include??? debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;從三個數中求最大數的宏
mMax macro v1, v2, v3
??? LOCAL L1, L2 ;;如沒有這句, 宏在多次展開時會讓 L1、L2 重名, 這樣宏會把標號名稱協調好
??? mov eax, v1
??? cmp eax, v2
??? jge L1
??? mov eax, v2
L1: cmp eax, v3
??? jge L2
??? mov eax, v3
L2:
endm

.code
main proc
??? mMax 11, 22, 33
??? PrintDec eax? ;33
??? ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
靈活的參數, 用到 & 操作符:
--------------------------------------------------------------------------------------------------------------------
; Test34_7.asm
.386
.model flat, stdcall

include??? windows.inc
include??? kernel32.inc
include??? masm32.inc
include??? debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;求最數中的最大值:
mMax macro v1, v2
??? LOCAL L1
??? mov eax, v1
??? cmp eax, v2
??? jge L1
??? mov eax, v2
L1:
endm

;求最數中的最小值:
mMin macro v1, v2
??? LOCAL L1
??? mov eax, v1
??? cmp eax, v2
??? jle L1
??? mov eax, v2
L1:
endm

;能把 JGE 或 JLE 做參數:
mCom1 macro XX, v1, v2
??? LOCAL L1
??? mov eax, v1
??? cmp eax, v2
??? XX L1
??? mov eax, v2
L1:
endm

;能通過參數讓 J*E 變為 JGE 或 JLE:
mCom2 macro X, v1, v2
??? LOCAL L1
??? mov eax, v1
??? cmp eax, v2
??? J&X&E L1??? ;;這里用到特殊操作符 &
??? mov eax, v2
L1:
endm

.code
main proc
??? mMax 11, 22
??? PrintDec eax ;22
???
??? mMin 11, 22
??? PrintDec eax ;11
???
??? mCom1 JGE, 11, 22
??? PrintDec eax ;22
???
??? mCom1 JLE, 11, 22
??? PrintDec eax ;11
???
??? mCom2 G, 11, 22
??? PrintDec eax ;22
???
??? mCom2 L, 11, 22
??? PrintDec eax ;11
??? ret
main endp
end main
--------------------------------------------------------------------------------------------------------------------
特殊操作符: &、<>、%、!
--------------------------------------------------------------------------------------------------------------------
&? ;替換操作符
<> ;字符串傳遞操作符
%? ;表達式操作符, 也用于得到一個變量或常量的值
!? ;轉義操作符
--------------------------------------------------------------------------------------------------------------------
; Test34_8.asm
.386
.model flat, stdcall

include??? windows.inc
include??? kernel32.inc
include??? masm32.inc
include??? debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;自定義的宏
mPrint macro Text
??? PrintText '* &Text& *'
endm

.code
main proc
??? ;該宏會把參數直接替換過去
??? mPrint 1234??? ;* 1234 *
???
??? ;要保證參數的完整應該使用 <>
??? mPrint 12,34?? ;* 12 *
??? mPrint <12,34> ;* 12,34 *
???
??? ;需要計算結果應該使用 %()
??? mPrint 34+12?? ;* 34+12 *
??? mPrint %(34+12)?? ;* 46 *
???
??? ;用到 &、<、>、%、! 應該使用 ! 轉義
??? mPrint 10 !% 2 = %(10/2)!! ;* 10 % 2 = 5! *
??? ret
main endp
end main

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375335.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375335.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubunu安裝軟件的一個錯誤

http://tonychiu.blog.51cto.com/656605/654776/ 由于ubuntu/debian軟件庫中有時候不同的庫更新速度不一致&#xff0c;apt-get 出出現如下的錯誤提示 Some packages could not be installed. This may mean that you have requested an impossible situation or if you are us…

常用的基本Windows數據類型

常用的基本Windows數據類型 --------------------------------------------------------------------------------------------------------------------------------------------------------- 類 型 …

刪除空文件夾 清除CS擴展名文件 bat

刪除空文件夾。刪的干凈。刪的徹底。 將下列代碼復制到txt中保存。并把后綴.txt命成.bat。然后運行即可。 方案&#xff11;.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 刪除指定目錄及其子目錄下的空文件夾.bat 代碼&#xff1a;…

ios 坐標轉換

// 將像素point由point所在視圖轉換到目標視圖view中&#xff0c;返回在目標視圖view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 將像素point從view中轉換到當前視圖中&#xff0c;返回在當前視圖中的像素值 - (CGPoint)convertPoint:(C…

80X86偽指令

8086 偽指令表 一、數據定義偽操作 偽 指 令 名 稱 語 句 格 式 功 能 定義字節類型的數據存儲區 [變量名] DB 表達式[&#xff0c;…] 定義一個以變量名為首址的字節類型數據存儲區&#xff0c;所含數據元素的個數由其后表達式的個數所決定&#xff0c;數據存儲單元…

jQuery慢慢啃之選擇器(二)

1.$("#myDiv");ID匹配一個元素 <span id"foo[bar]"></span> $("#foo\\[bar\\]);//轉義 2.$("div");//元素標簽名匹配 3.$(".myClass"); css類名匹配 4.$("*") 匹配所有元素&#xff0c;多用于結合上下文…

iOS學習之基本概念

學習iOS最重要的是態度和興趣&#xff0c;如果你對于學習始終抱有不斷的熱情和端正的態度&#xff0c;那么&#xff0c;無論是什么&#xff0c;你總會成功的&#xff01; 有一句話與大家共勉&#xff1a;過程中跌倒多少次都沒有關系&#xff0c;重要的是&#xff0c;跌倒后你能…

Win32ASM代碼基本模塊

;-------------------------------------------------------------------------------- ;程序環境設置 .386 .model flat,stdcall option casemap:none ;-------------------------------------------------------------------------------- ;頭文件與庫文件導入 include windo…

ORA-16038: log 3 sequence# 103 cannot be archived

[sizelarge]今天在自己機器做了個實驗&#xff0c;插入10萬條&#xff0c;由于空間少&#xff0c;重啟數據庫時出現&#xff1a; [sizex-large]SQL> startup ORACLE instance started. Total System Global Area 188743680 bytes Fixed Size 1218460 byte…

Win32ASM學習[23]:RadASM快捷鍵

RadASM快鍵操作 一.書簽 SHIFTF8為所在行下書簽或刪除書簽(Crtl0-9能定義存于文件中的10個書簽)&#xff0c; 可通過編輯\書簽\開關書簽。&#xff08;CRTLF8為下一書簽&#xff0c;F8為上一書簽&#xff09; 二、列選擇&#xff1a; 拉框時用到&#xff0c;CRTLB為切換行…

SAP MM/FI 自動過賬實現 OBYC 接口執行

一. 自動過賬原理 在MM模塊的許多操作都能實現在FI模塊自動過賬&#xff0c;如PO收貨、發票驗證(LIV)、工單發料、向生產車間發料等等。不用說&#xff0c;一定需要在IMG中進行配置才可以實現自動處理。但SAP實現的這種自動配置的機制是怎樣的呢&#xff1f;其實也并不復雜&…

JAVA 字符處理

/** * 分割字符串 * * param str String 原始字符串 * param splitsign String 分隔符 * return String[] 分割后的字符串數組 */ SuppressWarnings("unchecked") public static String[] split(String str, String splitsign) { int index; if (str null || …

Win32ASM-進程學習【1】

關于一些進程的概念就不說了。。。 一創建進程GreateProcess (1).當一個進程被創建時: ①.系統為進程創建一個內核對象,并將這個對象的計數設置為1,進程對象只是一個比較小的數據結構,可以通過進程句柄來引用 ②.系統為進程創建一個虛擬地址空間,并將可執行文件裝載到這個地…

Object-C,NSArraySortTest,數組排序3種方式

晚上回來&#xff0c;繼續寫Object-C的例子&#xff0c;今天不打算寫iOS可視化界面的程序&#xff0c;太累了。剛剛dady又電話過來&#xff0c;老一套&#xff0c;煩死了。其實&#xff0c;我一直一個觀點&#xff0c;無論發生什么事情&#xff0c;不要整天一副不開心的樣子。開…

android中listview的一些樣式設置

在Android中&#xff0c;ListView是最常用的一個控件&#xff0c;在做UI設計的時候&#xff0c;很多人希望能夠改變一下它的背景&#xff0c;使他能夠符合整體的UI設計&#xff0c;改變背景背很簡單只需要準備一張圖片然后指定屬性 android:background"drawable/bg"&…

Win32ASM-進程學習【2】

獲取運行中的句柄 1.從窗口句柄中獲取進程句柄 要對進程進行某種操作,就必須首先知道該進程的句柄或者進程ID 對于自己創建的子進程來說CreateProcess函數返回了子進程句柄和進程的ID 但是如果如果要對系統中運行的某個進程進行操作,那么首先獲取他們的句柄才行 如果知道某個…

完美解決IE8有兩個進程的問題

完美解決IE8有兩個進程的問題&#xff0c;照以下方法設置后就只有一個進程了&#xff0c;沒有什么負影響哦&#xff01; 方法&#xff1a; 1、winR&#xff0c;在運行框里輸入&#xff1a;gpedit.msc&#xff0c;回車進入組策略設置。 2、依次展開&#xff1a;計算機配置——管…

【轉】gvim配置及相關插件安裝

0.準備軟件及插件。(a)gvim72.exe 地址ftp://ftp.vim.org/pub/vim/pc/gvim72.exe。(b)vimcdoc-1.7.0-setup.exe 地址http://prdownloads.sourceforge.net/vimcdoc/vimcdoc-1.7.0-setup.exe?download(c)ec57w32.zip 地址http://prdownloads.sourceforge.net/ctags/ec57w32.zip(…

Win32ASM-進程學習[3]-讀寫進程空間

invoke ReadProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesReadinvoke WriteProcessMemory,hProcess,lpBaseAddress,lpBuffer,dwSize,lpNumberOfBytesWritten hProcess 指定將要被讀寫的目標進程句柄 lpBaseAddress 目標進程中被讀寫的起始線性地址. …

MongoDB使用記錄

安裝服務 使用以下命令將MongoDB安裝成為Windows服務。筆者的MongoDB目錄為D:\Program Files\mongodb mongod --logpath "D:\Program Files\mongodb\data\logs.txt" --logappend --dbpath "D:\Program Files\mongodb\data" --directoryperdb --serviceName…