vc2003 release模式下的反汇编代码如何看??

HunterForPig 2008-12-22 10:20:41
打开02优化
发现很多代码都没有了
如下:
int main(int argc, char* argv[])
{


int a =argc;
switch (a)
{
case 1:
printf("%d",a);
break;
case 2:
printf("%d",a);
break;
default:break;
}
return 0;
}
反汇编后:
--- d:\myproject\asm\testc\a.c -------------------------------------------------
00401005 je main+1Ch (40101Ch)
00401007 dec eax
00401008 jne main+2Bh (40102Bh)
break;
case 2:
printf("%d",a);
0040100A push 2
0040100C push offset string "%d" (4060FCh)
00401011 call printf (40102Eh)
00401016 add esp,8
break;
default:break;
}
return 0;
00401019 xor eax,eax

}
0040101B ret
{
case 1:
printf("%d",a);
0040101C push 1
0040101E push offset string "%d" (4060FCh)
00401023 call printf (40102Eh)
00401028 add esp,8
break;
default:break;
}
return 0;
0040102B xor eax,eax

}
0040102D ret
上面是在vc release版本copy 的反汇编代码 没有cmp 等指令,不知道如何比较选择支路的?
我想看看release版本的switch 反汇编后是怎样的该怎样写才能看到,不要debug的,我想看看网上大家说的编译器用向量表存储优化switch是如何回事!谢谢!
...全文
283 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
WJN92 2012-05-05
  • 打赏
  • 举报
回复
一般是先用DEBUG版的,最后才用RELEASE版的吧
用户 昵称 2012-05-04
  • 打赏
  • 举报
回复
不好意思,回错帖子了。
用户 昵称 2012-05-04
  • 打赏
  • 举报
回复
nvgbcnbvnbvxnb
  • 打赏
  • 举报
回复
up一下。。。
Q-Luo 2009-02-12
  • 打赏
  • 举报
回复
编译器对RELEASE版本有很多优化
大熊猫侯佩 2009-02-12
  • 打赏
  • 举报
回复
编译器做了优化,楼主可以看看类似 逆向揭秘 的书籍,其中
归纳了一般情况下编译器如何将正常代码逻辑做优化。不过从汇编语言角度来说,
没有优化,你自己就是优化器,一条条的代码全部由你来组织。
killbug2004 2009-02-09
  • 打赏
  • 举报
回复
LZ上正解
case 1这些语句是标号
nineforever 2009-02-08
  • 打赏
  • 举报
回复
cmp应该就在下面的代码上面

00401005 je main+1Ch (40101Ch)
00401007 dec eax
00401008 jne main+2Bh (40102Bh)
sunbao 2009-02-08
  • 打赏
  • 举报
回复
优化后就是要去掉某些冗余的代码,这时看上去和源码有些不同了,但执行结果是一样的。
cnzdgs 2008-12-22
  • 打赏
  • 举报
回复
你copy的代码不全,不过可以看出,是先把a放到eax里面,然后把eax减1,判断如果为0,则case 1,否则再把eax减1,如果为0,则case 2,否则default。
vs2017建立一个静态库lib工程 起号工程名字BeaEngine  然后选release配置选项 1,把headers\Includes下面到2个头文件拖到src\Includes的目录下面 2,把headers\BeaEngine.h拖出放到cpp工程所在目录下,并导入到vs2017的项目头文件栏 3,把src\BeaEngine.c 拖出放到cpp工程所在目录下,并导入到vs2017的项目源文件栏 4,把src目录下面的文件夹拖到cpp工程所在目录下. 把include\下面的beaengine文件夹拖出放到cpp工程所在目录下.把src\Includes文件夹拖出放到cpp工程所在目录下 4,项目-->属性--> c/c++ -->预编译头-->选择 不使用预编译头 5,项目-->属性--> c/c++ -->附加包含目录 beaengine文件夹, Includes文件夹, Includes\instr_set文件夹(注意后面2个文件夹是src拖出来到cpp工程所在目录下的) 6,注意错误提示,若有则单击提示,把#include 修改为#include "xxx.h" 7,项目-->属性--> 常规-->无全程序优化 ,字符集选--》多字节字符集 8,项目-->属性--> c/c++ -->代码生成-->运行库 选择多线程(/MT) 9,项目-->属性--> c/c++ -->高级-->调用约定选择 __stdcall (lib和调用主程序都需要选择 __stdcall,否则默认以c调用,带@的符号找不到的错误提示) 10,调用主程序最好把headers\BeaEngine.h拖出放到cpp工程所在目录下,并导入到vs2017项目的头文件栏中 11,项目-->属性--> 常规-->字符集选--》多字节字符集使用 Unicode 字符集(已测试过能正常使用!lib和调用主程序都要做此项相同设置) 12,项目-->属性-->配置属性-->C/C++-->命令行-->附加选项,加入【/D "_CRT_SECURE_NO_DEPRECATE" 】(注:加入中括号中完整的内容),可修正如下提示错误 使用VS2005以上版本(VS2005、VS2008、VS2010)编译在其他编译器下正常通过的C语言程序,你可能会遇到类似如下的警告提示: 引用内容 warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>          c:/program files/microsoft visual studio 10.0/vc/include/string.h(105) : 参见“strcpy”的声明 warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>          c:/program files/microsoft visual studio 10.0/vc/include/stdio.h(234) : 参见“fopen”的声明 原因解释 这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。库函数改写例子:

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧