偶然機會接觸到了 Masm32 語言(win32 下的 M-“宏” asm-“彙編語言”),並拜讀了羅雲彬那本書,收穫頗大。
以前在學c語言的時候,看反彙編或者看彙編類的書籍,都會覺得很難啃,無法領會這兩者之間的奧祕。在看了Masm32後,好像在彙編(16位 or dos時代)和c語言(或VC++)之中找到了兩者之間的橋樑,但是這橋甚長,仍然無法看到對面的橋頭。
第一篇,寫點自己摸索時候的感觸吧。
Masm 利用Macros和一些經過封裝的“指令操作符”(不知道這稱呼是否準確)來是整個程序代碼的結構達到類似C語言的結構,這應該就是懂C語言和稍微有點asm基礎的人能大致
看懂masm的原因吧。然而,在一些細節方面仍然需要對計算機的組成和asm有一定的瞭解。
例如:
最近在寫一個小程序的時候想用 CRC32 來驗證2個文件是否一樣:
call CRC32 ...
mov dwCRC,eax
call CRC32...
mov dwCRC1,eax
.if dwCRC != dwCRC1
...
.endif
熟悉彙編的人應該馬上可以看出 .if 後面的比較條件是有問題的。
迴歸正題
LastError$() 這個Macro對於熟悉win32的人來說很容易就慘到是幹什麼的。
他結合了 GetLastError() 與 FormatMessage(), 並返回錯誤信息字符串的地址。
eg:
.data
szCap db 'Error',0
.if eax == 0
invoke MessageBox, NULL, GetLastError$(),offset szCap,MB_OK or MB_ICONERROR
;這裏的invoke 就是對於 call 的封裝,省了手動push參數的一步
;用上fn這個宏的話,這一句就可以簡化成:
fn MessageBox,NULL,GetLastError$(),"Error",MB_OK or MB_ICONERROR
.endif
這樣就可以很方便的在寫程序的時候進行debug了。
關於Macro的用法和介紹在Masm32 sdk中有專門分類的文檔進行列舉。 把這些文檔都吃透的時候Masm寫win32程序便能便捷了。
那麼問題來了,能比在vs下用win32, mfc, c#更簡單? 這個答案不說大家心裏也明白。
這個對我來說是一種知其所以然的學習,哈哈,至於相比之下masm32的優點,自行來體會吧!
--- Great Masm32