Masm32 學習筆記 - 1. LastError$()

偶然機會接觸到了 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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章