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

时间:2010-04-24 05:55:17

标签: c assembly x86 instruction-set

LEA EAX, [EAX]

我在使用Microsoft C编译器编译的二进制文件中遇到此指令。它显然无法改变EAX的价值。那为什么呢?

3 个答案:

答案 0 :(得分:81)

这是NOP

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

xchg eax, eax         = 90
mov eax, eax          = 89 C0 
lea eax, [eax + 0x00] = 8D 40 00 

答案 1 :(得分:34)

来自this文章:

  

这个技巧由MSVC ++编译器使用   发出NOP指令   不同的长度(用于填充之前   跳跃目标)。例如,MSVC ++   如果它生成以下代码   需要4字节和6字节填充:

     

8d6424 00 lea [ebx + 00],ebx   ; 4字节填充8d9b 00000000
  lea [esp + 00000000],esp; 6字节   填充

     

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

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

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

答案 2 :(得分:3)

LEA EAX, [EAX]

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

相同
MOV EAX, EAX

您是否在优化代码或未经优化的代码中看到了它?