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 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
00411430 lea edx,[(411454h)] //在安全过程之前,LEA指令在这里做什么?
00411436 call @ILT+140(@_RTC_CheckStackVars@8) (411091h)
//在安全过程之前,LEA指令在这里做什么?
这不是一个“安全程序”。 您正在查看Debug版本中MSVC编译器生成的代码,并打开了/ RTC选项。 RTC表示运行时错误检查。 LEA指令加载由编译器生成的描述堆栈帧中局部变量的表的地址。 它们的组织方式使得它们之间具有未使用的字节,填充了0xcc的字节。 您在地址004113EC处看到的情况。
_RTC_CheckStackVars @ 8调试功能使用此表来检查这些字节是否仍具有相同的值。 如果没有,那么就有确凿的证据表明代码存在错误并且堆栈堆栈。 通常通过溢出堆栈上数组的结束。 如果没有这种调试帮助,这些类型的错误可能很难诊断。 很有用。
lea edx, [(411454h)]
是相同的
mov edx, offset [(411454h)]
链接地址: http://www.djcxy.com/p/72387.html
上一篇: what does LEA directive do when only a displacement is used?
下一篇: x86 lea instruction