偶然机会接触到了 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