LEA EAX, [EAX]
我在使用Microsoft C编译器编译的二进制文件中遇到此指令。它显然无法改变EAX的价值。那为什么呢?
答案 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
您是否在优化代码或未经优化的代码中看到了它?