LEA EAX, [EAX]我在用Microsoft C编译器编译的二进制文件中遇到了这条指令。它显然不能改变EAX的值。那它为什么会在那里?
发布于 2010-04-24 14:17:43
它是一个NOP。
以下内容通常用作NOP。它们都做同样的事情,但它们导致不同长度的机器代码。根据对齐要求,选择其中之一:
xchg eax, eax = 90
mov eax, eax = 89 C0
lea eax, [eax + 0x00] = 8D 40 00 发布于 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指令的目标之前,以便将它们对齐。
有趣的是,您可以根据这类指令的特性来识别编译器。
发布于 2010-04-24 14:03:35
LEA EAX, [EAX]确实不会改变EAX的价值。据我所知,它的功能与:
MOV EAX, EAX你是在优化的代码中还是在未优化的代码中看到它?
https://stackoverflow.com/questions/2703394
复制相似问题