问题描述:
main函数中定义一个int变量, 函数体内的临时变量是在栈中,,
看过反汇编的童鞋 应该有印象,一般是,通过esp, ebp来操作这个变量,
只有全局变量或者静态变量,才不通过esp,ebp来操作这个变量。。。。。。。
今晚不小心看到了一个关于 swicth的反汇编, 发现,是这样处理的:
看代码吧:
int main()
{
50831EC0 push ebp
50831EC1 mov ebp,esp
50831EC3 sub esp,0D0h
50831EC9 push ebx
50831ECA push esi
50831ECB push edi
50831ECC lea edi,[ebp-0D0h]
50831ED2 mov ecx,34h
50831ED7 mov eax,0CCCCCCCCh
50831EDC rep stos dword ptr es:[edi]
int i=0;
50831EDE mov dword ptr [i],0
switch(i)
50831EE5 mov eax,dword ptr [i]
50831EE8 mov dword ptr [ebp-0D0h],eax
50831EEE cmp dword ptr [ebp-0D0h],0
50831EF5 je main+42h (50831F02h)
50831EF7 cmp dword ptr [ebp-0D0h],1
50831EFE je main+4Dh (50831F0Dh)
50831F00 jmp main+56h (50831F16h)
{
case 0:
i++;
50831F02 mov eax,dword ptr [i]
50831F05 add eax,1
50831F08 mov dword ptr [i],eax
break;
50831F0B jmp main+56h (50831F16h)
case 1:
i+=4;
50831F0D mov eax,dword ptr [i]
50831F10 add eax,4
50831F13 mov dword ptr [i],eax
break;;
default:
break;
}
return 0;
50831F16 xor eax,eax
}
50831F18 pop edi
50831F19 pop esi
50831F1A pop ebx
50831F1B mov esp,ebp
50831F1D pop ebp
50831F1E ret
没有用过ebp, esp来操作这个变量,
而是采用类似全局变量的手段来操作这个变量。。。。
------解决方案--------------------
这个问题我也发现了,在switch的不同分支里定义相同名字的变量,会报错说变量重定义
其实这个问题也很好解决,我通常用switch的时候都会建立一个临时隔离区
- C/C++ code
switch(x){ case 1:{ int y=0; …… }break; case 2:{ int y=0; …… }break; }
------解决方案--------------------
你可能是被反汇编器忽悠了
你不带解析符号的看一下50831EDE mov dword ptr [i],0的反汇编,或者直接看机器码