首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LEA EAX有什么意义,[EAX]?

LEA EAX有什么意义,[EAX]?
EN

Stack Overflow用户
提问于 2010-04-24 13:55:17
回答 3查看 10.6K关注 0票数 43
代码语言:javascript
复制
LEA EAX, [EAX]

我在用Microsoft C编译器编译的二进制文件中遇到了这条指令。它显然不能改变EAX的值。那它为什么会在那里?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-24 14:17:43

它是一个NOP

以下内容通常用作NOP。它们都做同样的事情,但它们导致不同长度的机器代码。根据对齐要求,选择其中之一:

代码语言:javascript
复制
xchg eax, eax         = 90
mov eax, eax          = 89 C0 
lea eax, [eax + 0x00] = 8D 40 00 
票数 81
EN

Stack Overflow用户

发布于 2010-04-24 14:18:31

来自this的文章:

MSVC++编译器使用此技巧来发出不同长度的

指令(用于跳转目标之前的填充)。例如,如果MSVC++需要4字节和6字节填充,则它会生成以下代码:

8d6424 00 lea ebx+00,ebx;4字节填充8d9b 00000000

lea esp+00000000 (尤指6字节填充)

在编译器生成的汇编清单中,第一行被标记为"npad 4“,第二行被标记为"npad 6”。寄存器(ebx,esp)可以从很少使用的寄存器中选择,以避免代码中的错误依赖。

因此,这只是一种NOP,出现在jmp指令的目标之前,以便将它们对齐。

有趣的是,您可以根据这类指令的特性来识别编译器。

票数 35
EN

Stack Overflow用户

发布于 2010-04-24 14:03:35

代码语言:javascript
复制
LEA EAX, [EAX]

确实不会改变EAX的价值。据我所知,它的功能与:

代码语言:javascript
复制
MOV EAX, EAX

你是在优化的代码中还是在未优化的代码中看到它?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2703394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档