首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

switch语句块的反汇编,发现,处理外部的变量,居然采用类似全局变量的方法来操作。解决方法

2012-03-22 
switch语句块的反汇编,发现,处理外部的变量,居然采用类似全局变量的方法来操作。问题描述:main函数中定义一

switch语句块的反汇编,发现,处理外部的变量,居然采用类似全局变量的方法来操作。
问题描述:

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的反汇编,或者直接看机器码

热点排行
Bad Request.