首页
社区
课程
招聘
lea和mov有啥不同?
发表于: 2005-1-11 02:24 7907

lea和mov有啥不同?

2005-1-11 02:24
7907
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
LEA 取地址
MOV 取值

~~~~~~~
2005-1-11 03:32
0
雪    币: 31
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
最初由 tcflying 发布
LEA 取地址
MOV 取值

~~~~~~~

但看雪的教程怎么这样写

14、问:在汇编语言中,“[]”的用法?如:
1、push dword ptr [024c1100]
2、cmp eax,[ebp+14]
3、cmp byte ptr [eax],46
4、lea eax,[edx-02]
5、mov ecx,[edx+08]

其中“[]”里的内容,什么时候表示的是值,什么时候表示的是地址,为什么?第4个是不是把“edx-02”的值作为地址送给eax???

另一个问题是:我发现在soft-ice中,在寄存器区(即最上面的那个区,标志位下面)的右下脚有一个类似:“ds:xxxxxxxx=xxxxxxxx”的字样,时隐时现,并不断变化,不知是干什么用的,请指教,不胜感激!!!!!!!!

答:

①右下角显示的那个是当前指令要操作的内存的地址及内容 。
lea指令表示取有效地址,第4个是把“edx-02”的值送给eax。


1,压栈024c1100值的双字
2,eax-ebp+14的有效值,不保留值,主要看标志位。
3,字节型eax-46,看标志位
4,把edx-02的有效值给eax
5,edx+8处值作为地址,此地址的值给ecx
2005-1-11 05:20
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
虽然我仍是菜鸟,不过论坛上的DX都会回答,我尽点微薄之力吧.如有不对高手指正!!
4、lea eax,[edx-02] 这个没错的.

ds:xxxxxxxx(这边可以看成是数据段偏移地址)=xxxxxxxx(值)

亮的时候说明对这个地址,数据有变动.
2005-1-11 05:57
0
雪    币: 332
活跃值: (499)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
5
你自己,在od里调试一下(反复改了看各种形式的结果),就明白了。
这个只能意会不能言传,呵呵。
2005-1-11 09:30
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
一个比较特别的指令是lea, 意思是"装入有效地址"(Load Effective Address), 它的操作数就是地址,所以
lea eax,[edx-02]
就是把 edx 中的值减去2再送入eax, 而不是把由[edx-02]指明的内存地址上的值放到eax. 其结果是[eax]和[ebx-02]都表示同一个地址.

其实这句就相当于mov eax,edx-2
2005-1-11 10:37
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
综括号"[]"用来从括号间的内存地址处取值,没有括号就只是这个值,寄存器和内存地址也可以.
2005-1-11 10:38
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
8
好象N多人问Lea的问题,建议把这个写在FAQ里面,免得天天讨论
2005-1-11 10:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵,说的很明白,我也一直不是很清楚!谢谢了!
最初由 great123 发布
一个比较特别的指令是lea, 意思是"装入有效地址"(Load Effective Address), 它的操作数就是地址,所以
lea eax,[edx-02]
就是把 edx 中的值减去2再送入eax, 而不是把由[edx-02]指明的内存地址上的值放到eax. 其结果是[eax]和[ebx-02]都表示同一个地址.


........
2005-1-11 13:05
0
雪    币: 212
活跃值: (70)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
aogo站上有大量这种FAQ~~;)
2005-1-11 18:00
0
雪    币: 209
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了一遍
2005-1-11 19:04
0
雪    币: 31
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢大家帮助
2005-1-11 19:51
0
雪    币: 1123
活跃值: (1150)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
13
基本上
LEA=MOV OFFSET
2005-1-15 11:37
0
雪    币: 209
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
原则上先用mov offset,因为无论从执行效率还是编码大小衡量,mov offset均优于lea,
但取局部变量地址只能用lea,
其实lea还有一个‘另类’的功能:
将两个寄存器相加,把和放入第三个寄存器
如 lea eax,[ebx+edx+1]
明显优于
mov eax,ebx
add eax,edx
add eax,1
2005-1-15 12:05
0
游客
登录 | 注册 方可回帖
返回