首页
社区
课程
招聘
[原创]win32 汇编入门中应准确掌握的知识(一)
发表于: 2007-8-20 20:34 10856

[原创]win32 汇编入门中应准确掌握的知识(一)

2007-8-20 20:34
10856
大虾们不屑一看,献给那些给我一样初涉学习编程的网友,毕竟大虾们的杰作菜鸟们看不懂,总得有些像这样上不了场面的"文章"才能真正引领菜鸟入门,就象儿童的语言儿童才能听懂,呵呵!!!

addr 和 offset 伪操作符的异同点及使用场合

一、相同点

1、addr 和 offset 操作符都是获得操作数的偏移地址;
2、addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中。

二、不同点

1、addr  伪操作符,只能用在 invoke 伪指令语句中;
2、offset 伪操作符可以用在任何可能涉及偏移地址的指令(当然包括 invoke 伪指令)并想获取操作数偏移地址的场合中;
3、addr 不能处理向前引用(即 addr 引用的操作数必须在使用 addr 前就得定义或声明),而offset 则能(不管引用的操作数是
其前或其后定义或声明);

所谓向前引用是指:标号的定义是在invoke  语句之后,比如在如下的例子:  
invoke  MessageBox,NULL,  addr  MsgBoxText,addr  MsgBoxCaption,MB_OK  //引用MsgBoxText、MsgBoxCaption 在先

......   

MsgBoxCaption  db  "Iczelion  Tutorial  No.2",0  //定义或声明 MsgBoxCaption 在 addr 后
MsgBoxText  db  "Win32  Assembly  is  Great!",0  //定义或声明 MsgBoxText 在 addr 后

如果您是用  addr  而不是  offset  的话,那  MASM  就会报错

4、addr 是运行阶段在堆栈中分配内存空间,offset 是编译阶段由编译器解释。因此,addr 可以处理局部变量而 offset 则不能。

5、addr 如果检查到待处理的变量是局部变量,就在执行 invoke 语句前产生如下指令序列:   

lea  eax,operand ;注意:lea 是 80x86 系列处理器支持的指令,而不是伪指令。
push  eax  

因为 lea 指令能够在运行时决定标号的有效地址,所以有了上述指令序列,就可以保证  invoke  的正确执行了。

总结:为了避免出现错误,建议除在局部变量中引用 addr 操作符外,其它场合使用 offset。

注意:在 invoke 语句中如果处理局部变量的话,注意一个问题,那就是在引用某个函数的返回值
作为调用另一个函数中的参数时,必须正确放置引用另一函数返回值与引用局部变量偏移地址位置次序。
假设在一个子程序中有如下invoke指令:
……………………………………………………
  invoke  Test,eax,addr szHello,MB_OK

其中Test是一个需要二个参数的子程序,szHello是一个局部变量,会发生什么结果呢?编译器会把invoke伪指令和addr翻译成下面这个模样:

lea    eax,[ebp-4]

push   eax    ;参数2:addr szHello

push   eax    ;参数1:eax

call   Test

发现了什么?到push第一个参数eax之前,eax的值已经被lea eax,[ebp-4]指令覆盖了!也就是说,要用到的eax的值不再有效,所以,当在invoke中使用addr伪操作符时,注意在它的前面不能用eax,否则eax的值会被覆盖掉,当然eax在addr的后面的参数中用是可以的。幸亏MASM编译器对这种情况有如下错误提示:

error A2133: register value overwritten by INVOKE

否则,不知道又会引出多少莫名其妙的错误!

说明:某些文章中对 addr 和 offset 所引用的对象仅用了“变量或标号”,我是用“操作数”来阐述的,本人的观点是:
变量或标号感觉上包含的概念过窄,比如结构、函数等等,因此,觉得使用操作数好像感觉准确些。

[课程]Android-CTF解题方法汇总!

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
支持,希望一直写下去
2007-8-20 23:13
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢谢楼主,建议版主加精!
2007-8-21 10:56
0
雪    币: 347
活跃值: (25)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
4
抢我台词
2007-8-21 14:37
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
5
不错,支持,努力更新下去
2007-8-21 17:37
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
6
支持,希望能够把这个系列做完
2007-8-21 17:56
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
基础扎实才是王道,赶紧学习
2007-8-26 09:54
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
望继续出(二),加油
2007-8-26 23:23
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持!Vielen Dank!
2007-8-27 20:13
0
雪    币: 392
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不错,看得懂
加油继续
2007-8-29 13:36
0
雪    币: 8599
活跃值: (5065)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
addr 和 offset 的区别搞明白了。。。
2007-8-30 14:39
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我帮你顶下,希望能看到更多作品!
2007-9-30 11:52
0
雪    币: 257
活跃值: (56)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
朋友的头像不会是魔力宝贝里面的吧?
2007-10-4 17:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢楼主,望继续出(二)
2007-11-11 18:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
怎么看上去和罗云彬的那本win32汇编写得一个样啊!
2007-11-13 17:25
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
16
说得好,掌声!
2007-11-15 10:39
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
17
支持呀``````````
2007-11-15 11:25
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
支持谢谢了。。   正好对addr 和offset疑惑呢...
2007-11-17 17:21
0
雪    币: 236
活跃值: (16)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
怎么不继续了楼主?
我们都还等着呢!
2007-11-22 22:00
0
游客
登录 | 注册 方可回帖
返回
//