首页
社区
课程
招聘
[求助]汇编指令LEA意义
发表于: 2008-11-27 13:31 28669

[求助]汇编指令LEA意义

2008-11-27 13:31
28669
lea     eax, dword ptr ss:[esp+44]

谁能解释下这条指令

假如 SS=1000H,ESP =1000H,[2044] = 12345678H,EAX = 5000H

这条指令执行过后,EAX是多少 ?

为什么要有这样的一条指令?假如是2044的话,这条指令岂不是一点用都没有?

直接
    ADD ESP,OFFSET SS
       ADD ESP,44
MOV EAX, ESP

不就可以了?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (29)
雪    币: 155
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
LEA 传操作数地址。。Load Effectiv Address  还是英文好理解点。。。
2008-11-27 13:43
0
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
有个函数 

_Test proc
    local  @var
            ret
_Test endp

请楼主告诉我,如何在函数里取得@war的地址?如果你能够回答,就知道lea的作用了
2008-11-27 15:05
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
只学过几天汇编语言,不要胡乱说话。

在你的例子中


lea eax, dword ptr ss:[esp+44]

谁能解释下这条指令

假如 SS=1000H,ESP =1000H,[2044] = 12345678H,EAX = 5000H

这条指令执行过后,EAX是多少 ?


这条指令执行过后EAX =  ESP+0x44 == 0x1044,而不是你说的0x2044。

LEA是INTEL颇为得意的一条指令(虽然大多数程序员并不以为然)。在INTEL OPTIMIZATION REFERFENCE MANUAL中,特别提到了这条指令的好处。

0.LEA指令具有单时钟周期,执行效率很高。

1.它是CPU地址生成单元参与运算的,而不是ALU参与运算的,所以在流水线上不会与上下文的算术逻辑指令产生流水相关

2.INTEL指令集中不存在很多RISC机器所具有的三操作数算术运算指令,比如像ARM的"add r0,r1,r2",而LEA指令恰好提供了同样的功能,以模拟“三元算术逻辑指令”。

  举个例子,要计算两个寄存器的和,但又不想破坏原来的值,那么可以执行lea ebx ,[eax+edx], 这条指令,执行的就是 ebx = eax + edx 这条加法运算。如果用add指令,则不可能一条指令内完成。

3.在汇编语言程序设计中,在需要取得一个变量地址时,使用LEA是很方便的。而MOV指令则常常出错,因为在微软MASM汇编语法中,label和variable是不同的。
2008-11-27 16:28
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
lea eax,[esp+44]的功能就是eax=esp+44
这样的格式出现
是因为mov指令不支持mov reg,reg+immed这样的格式
当然也可以用lea来进行快速加法、乘法......
2008-11-27 17:22
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我也觉得LEA不是必须的
2008-11-27 18:41
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
赞一个,这次书呆彭回答得很专业。

确实,lea 不在 ALU 里执行,而是在 AGU (address generation unit)  里执行

ALU 与 AGU 是并行的整数运算单元,将巧妙地 lea 与 add 分开并行执行,很大程度提高吞吐量。
2008-11-27 21:44
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我也觉得LEA不是必须的
2008-11-27 23:17
0
雪    币: 118
活跃值: (106)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
菜鸟学习中。。。
2010-6-4 15:46
0
雪    币: 54
活跃值: (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
书呆彭 应该是专门教汇编的教授吧,见解非常祥细,学习中。。。

顺便再建议下论坛里的表情符能多弄点,有时说不出来的话,一个表情就OK
2010-6-5 04:19
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
暂时不理解
2010-6-5 07:18
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
lea传送的地址
2010-6-27 20:08
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习了,赞一个!!
2011-7-29 18:22
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学写了,谢谢
2011-9-7 14:48
0
雪    币: 41
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
受教了,汇编不太懂,正在学习中
谢谢
2011-9-7 15:04
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
地址传送指令 用lea比用mov 更简便么
2011-9-9 16:39
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
17
专业啊。一个lea有这么多讲究。
2011-9-9 16:45
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
强大。学习中。
2011-12-29 15:12
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
就像5楼说的那样子
2012-1-3 09:51
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
有效地址传送指令 LEA

格式: LEA OPRD1,OPRD2

功能: 将源操作数给出的有效地址传送到指定的的寄存器中

说明:

1. OPRD1 为目的操作数,可为任意一个16位的通用寄存器.
   
OPRD2 为源操作数,可为变量名、标号或地址表达式.  

      示例: LEA BX,DATA1
            LEA DX,BETA[BX+SI]
            LEA BX BX,[BP],[DI]

2. 本指令对标志位无影响。

偶也正在学习中
2012-1-14 01:16
0
雪    币: 76
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
书呆彭  你亮了
2012-2-1 15:04
0
雪    币: 8542
活跃值: (2792)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
书呆彭讲的经典
2012-2-1 17:04
0
雪    币: 3871
活跃值: (1096)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
lea     eax, dword ptr ss:[esp+44]
如果楼主非要用MOV指令来代替,得分为两句
mov eax,esp
add eax,44
相当于小学数学里面的定义一样,先括号,后解括号外面的,lea,间接传送.mov是直接传送.不知道我的回答是否正确.求楼下指正
2012-2-3 00:13
0
雪    币: 217
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢谢书呆彭大师的讲解,学习了
2012-6-23 13:17
0
雪    币: 119
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习  理解中
2012-7-9 23:26
0
游客
登录 | 注册 方可回帖
返回
//