专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C语言

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

发布时间:2011-06-28 16:18:29 文章来源:www.iduyao.cn 采编人员:星星草
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的反汇编,或者直接看机器码
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: