Assembly 当只使用位移时,LEA指令做什么?
00411430 lea edx,[(411454h)]//在安全程序之前,lea指令在这里做什么?Assembly 当只使用位移时,LEA指令做什么?,assembly,x86,Assembly,X86,00411430 lea edx,[(411454h)]//在安全程序之前,lea指令在这里做什么? int _tmain(int argc, _TCHAR* argv[]) { 004113D0 push ebp 004113D1 mov ebp,esp 004113D3 sub esp,0E4h 004113D9 push ebx 004113DA push esi 004113DB pus
int _tmain(int argc, _TCHAR* argv[])
{
004113D0 push ebp
004113D1 mov ebp,esp
004113D3 sub esp,0E4h
004113D9 push ebx
004113DA push esi
004113DB push edi
004113DC lea edi,[ebp-0E4h]
004113E2 mov ecx,39h
004113E7 mov eax,0CCCCCCCCh
004113EC rep stos dword ptr es:[edi]
int a=2;
004113EE mov dword ptr [a],2
int b=3;
004113F5 mov dword ptr [b],3
int c=add(&a,&b);
004113FC lea eax,[b]
004113FF push eax
00411400 lea ecx,[a]
00411403 push ecx
00411404 call add (4111CCh)
00411409 add esp,8
0041140C mov dword ptr [c],eax
printf("%d",c);
0041140F mov esi,esp
00411411 mov eax,dword ptr [c]
00411414 push eax
00411415 push offset string "%d" (41563Ch)
0041141A call dword ptr [__imp__printf (4182B8h)]
00411420 add esp,8
00411423 cmp esi,esp
00411425 call @ILT+310(__RTC_CheckEsp) (41113Bh)
return 0;
0041142A xor eax,eax
}
0041142C push edx
0041142D mov ecx,ebp
0041142F push eax
与
lea edx, [(411454h)]
与
lea edx, [(411454h)]
//在安全程序之前,LEA指令在这里做什么
这不是一个“安全程序”。您正在查看MSVC编译器在调试版本中打开/RTC选项时生成的代码。RTC表示运行时错误检查。LEA指令加载编译器生成的表的地址,该表描述堆栈帧中的局部变量。它们是有组织的,所以它们之间有未使用的字节,这些字节用0xcc填充。你可以在地址004113EC看到
RTC_CheckStackVars@8调试函数使用此表检查这些字节是否仍然具有相同的值。如果没有,那么就有确凿的证据表明代码存在bug并踩坏了堆栈框架。通常是通过溢出堆栈上数组的结尾。如果没有这种调试帮助,这些bug可能很难诊断。非常有用
//在安全程序之前,LEA指令在这里做什么
这不是一个“安全程序”。您正在查看MSVC编译器在调试版本中打开/RTC选项时生成的代码。RTC表示运行时错误检查。LEA指令加载编译器生成的表的地址,该表描述堆栈帧中的局部变量。它们是有组织的,所以它们之间有未使用的字节,这些字节用0xcc填充。你可以在地址004113EC看到
RTC_CheckStackVars@8调试函数使用此表检查这些字节是否仍然具有相同的值。如果没有,那么就有确凿的证据表明代码存在bug并踩坏了堆栈框架。通常是通过溢出堆栈上数组的结尾。如果没有这种调试帮助,这些bug可能很难诊断。非常有用。可能重复的我知道lea指令的含义,但lea指令做什么可能重复的我知道lea指令的含义,但lea指令做什么我知道他们做了相同的事情,但我想不起来(或在网上找到原因)为什么编译器会在
mov
上生成lea
。有什么想法吗?当然:lea
可以完成这项工作,那么为什么编译器只在这种情况下使用mov
,而在更复杂的地址计算中需要lea
呢?我不确定我是否会这样做。从周围的程序集来看,它看起来像是对一个方法的快速调用,该方法的指针指向一个全局变量,至少在VS 2010中,当将指向全局变量的指针传递到调用中时,会生成一个mov
。我想如果我能找到一个例子,它对输入执行地址计算,我就能更好地理解lea
。我知道他们也这么做,但我想不出(或在网上找到原因)编译器为什么会在mov
上生成lea
。有什么想法吗?当然:lea
可以完成这项工作,那么为什么编译器只在这种情况下使用mov
,而在更复杂的地址计算中需要lea
呢?我不确定我是否会这样做。从周围的程序集来看,它看起来像是对一个方法的快速调用,该方法的指针指向一个全局变量,至少在VS 2010中,当将指向全局变量的指针传递到调用中时,会生成一个mov
。我想如果我能找到一个例子,它对输入执行地址计算,我就能更好地理解lea。
mov edx, offset [(411454h)]