-
-
[原创]汇编入门应该从 masm 还是 asm 开始
-
发表于:
2007-9-3 14:07
6917
-
[原创]汇编入门应该从 masm 还是 asm 开始
根我了解,masm 相比于asm,提供了很多高级语言的语法,使得低级语言”高级化“,比如提供了类似高级语言的判断、循环等伪指令(提法正确否,大虾们指正),这对于很熟悉汇编语言的高手编写程序非常方便,结构也清晰,但对于入门级的爱好者,即使直接从masm入门学汇编,也不得不了解这写高级格式的语句汇编、连接后生成的可执行文件中转换成了什么样的指令(但并非说任意一个伪指令都会对应一个指令)。因此,开始从asm入手学习汇编吧。
比如:
invoke 伪指令,作用与call指令相同,但 invoke 指令有严密的检查参数类型、个数等功能,如果少一个参数或多一个参数,汇编器会正确提示给你,但call就不会提示,你没办法错误出在哪里?但我为什么还提倡从call 入门再来用invoke替代它呢?原因是你学习编程的目的不仅是为了学习一门技术,很多时候你还得调试分析你自己程序已纠错,或学习别人编程的思路或技巧。如果是这样的话,不论你以静态反汇编或动态调试自己或别人的程序,你在其中根本找不到 invoke 伪指令或其语法格式的指令,你将看到的是call形式的指令。因此,如果你入门时就以call 语法格式来学习,不论你自己编写或别人的,你反汇编或动态调试中至少对call那段指令一下就明白了,并且知道参数入栈的次序为什么么会是这种顺序,为什么会这样的写法。
例子:简单地实现一个提示框的call代码片断
……
.data
szText db '这是一个消息框',0
szCaption db '消息框演示',0
NULL equ 0
……
.code
start:
lea eax,szCaption
lea edx,szText
push MB_OK
push eax
push edx
push NULL
call Messagebox
……
end start
那么你在静态反汇编或动态调试时上面红色字部分接近100%都一样,只有Messagebox不会原样保留,可能是MessageboxA 或 MessageboxW 的样子,这是因为字符集的原因,也就是说是ANSI 还是unicode编码。
如果写成invoke 伪指令格式,则为:
invoke MessageBox,NULL,offset szText,offset szCaption,MB_OK ;stdcall 格式,参数入栈次序从右向左,由被调用者恢复栈。
显然invoke 格式阅读起来更容易些,我想Microsoft 为什么没用C语法函数的格式来确定格式,形如:
invoke MessageBox(NULL,offset szText,offset szCaption,MB_OK)
invoke 语句确实比call易读易理解,但你要是想真正从深层次理解搞懂call,你最好还是先学会弄懂call格式的形式,然后再用invoke来替代吧。
这里我只是抛砖引玉,并非仅仅局限于这个调用语句。
学习C语言也是如此,不要动不动就直接用MFC类库入门,MFC封装得太"严密"了,这样会造成很多最基础的语句格式都搞不清楚,到头来还是得回到最基础的地方来补课。至少我目前有这种状况。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课