首页
社区
课程
招聘
[原创]汇编入门应该从 masm 还是 asm 开始
发表于: 2007-9-3 14:07 6917

[原创]汇编入门应该从 masm 还是 asm 开始

2007-9-3 14:07
6917
根我了解,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 Messagebo
x

……
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直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
哎,不同意你的这个观点,偶是刚学汇编,看的是老罗的书, 关于这个invoke 和call就那么一点区别.
没必要深究.

拿C 与MFC 来类比恐怕不合适....
2007-9-3 18:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厄 关注 不过确实有在反汇编出来的代码中看不明白的时候 只能仗着OD的功能来看
2007-9-3 20:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我刚开始看王爽的书两个月...那些东西还不是很明白
2007-9-5 23:48
0
雪    币: 347
活跃值: (25)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
5
楼主学的是win32汇编吧?
2007-9-6 01:05
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我觉得invoke正因为简单我所以用invoke入门更容易
入门了之后在学习调试分析不是更容易

如果刚开始就出现无数个call错误, 还不知道错误在那里?? 谁有信心继续学下去.
2007-9-6 08:35
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
7
什么都行,只要适合你自己,条条大路通罗马。
2007-9-9 21:43
0
游客
登录 | 注册 方可回帖
返回
//