- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
论反汇编在时间常数优化中的应用
摘要:本文阐述了时间常数优化的重要性,并且在Visual C++语言环境下,从特定编译器生成的汇编代码出发,探讨了反汇编在时间常数优化中的应用,提出了若干优化改进方案。
关键字:C++ 反汇编 时间常数 优化
程序的优化是无止境的。其中,时间常数是在相同时间复杂度下决定程序运行快慢的关键。然而在竞赛中,渐进时间复杂度是关注的重点,而同样能够决定程序运行快慢的时间常数优化问题却缺乏重视。本文阐述了时间常数优化的重要性,并且在Visual C++语言环境下,从特定编译器生成的汇编代码出发,探讨了反汇编在时间常数优化中的应用,提出了若干优化改进方案。
一、基本概念
汇编语言(Assembly language),是一种与硬体紧密相关的程序设计语言,是一种低级语言。汇编语言是机器语言的便于记忆和理解的符号化形式。
由于汇编语言的各种语法规范互不兼容,本文以下部分以Intel语法为基础,并以使用Intel语法的Visual C++作为实验平台。
汇编语言源程序是用伪代码创建的。一个伪代码是一条处理器可以理解的指令。例如:
add
add指令把两个数加到一起。大部分伪代码带有参数
add eax, edx
add有两个参数。一个源参数,一个目标参数。它把源值加到目标值中,并把结果保存在目标中。参数有很多不同的类型,如:寄存器,内存地址,直接数值。下面的介绍以寄存器为例。
有几种大小的寄存器:4位,8位,16位,32位(在MMX处理器中有更多的种类)。在16位程序中,你仅能使用4位、8位和16位的寄存器。在32位的程序中,你还可以使用32位的寄存器。
一些寄存器是别的寄存器的一部分:例如,如果eax保存了值EA7823BBh,那么,它的子寄存器ax,ah和al也会保存其值的一部分,如下表所示:
eax EA 78 23 BB
ax 23 BB
ah 23
al BB
ax,ah,al是eax的一部分。eax是一个32位的寄存器(仅在386以上存在),ax包含了eax的低16位(2字节),ah包含了ax的高字节,而al包含了ax的低位字节。因而ax是16位的,al和ax是8位的。
让我们来分析下面的代码:
mov eax,
;Mov把一个值载入寄存器(注意是一个十六进制值,因为h这个后缀。
mov cl, ah
;把ax的高字节移入cl
sub cl, 10
;从cl的值中减去10(十进制)
mov al, cl
;并把cl存入eax的最低字节
mov指令可以把一个值从寄存器,内存或直接数值移入另一个寄存器。在上面的例子中,eax包含,然后ah的值(eax左数第三个字节)被复制入了cl中(ecx寄存器的最低字节)。然后,cl减10并移回al中(eax的最低字节)
关于汇编指令的其它基础知识,请参看相关的入门书籍。
编译器(Compiler),是将便于人编写,阅读,维护的高级计算机语言程序翻译为计算机能识别,运行的低级机器语言的程序。编译器将源程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源程序一般为高级语言(High-level language),如Pascal,C++等所写的程序,而目标程序则是机器能直接执行的目标代码(Object code),有时也称作机器代码(Machine code)。
编译器友好(Compiler friendly),是指所写的代码符合编译器的规范,其功能的完整性不依赖于特定编译器的特性或隐藏功能,因此具有通用性和兼容性。
本文的结论不一定需要用汇编实现,因为嵌入汇编不是所有语言都能够支持的,况且这样做不是文章的本意。
二、数据分析
在特定的平台上,不同的汇编伪代码有着不同的执行速度。但是,每种功能的伪代码的相对执行速度是较为恒定的。比如,执行乘除法伪代码的时间一定大大长于执行加减法伪代码的时间。
表1为Aoa[1]中8286系统各种伪代码的理论执行时间:
表1:8286指令集的执行时间
为了验证上表的结论以及探讨从反汇编角度对程序进行改进的可行性,本文对实际语句的运行情况进行了数据搜集。
本文采用的实验环境如下:
试验环境:
软件: Windows XP sp2 050301-1519 MSVC++ 69514-335-0000007-18650
硬件: Intel Pentium 4 CPU 2.66GHz
Debug模式等同于非优化模式等同于不带参数进行编译
Release模式等同于优化模式约等于G++中-O2优化
注意:本文的某些结论并不适用于其他处理器、平台和编译器,需要再次进行测试。
测试方法:
您可能关注的文档
- 《焦作市惠利佳超市中老年女装营销策略探究》-毕业设计(论文).doc
- 《教师工作量管理系统》-毕业设计(论文).doc
- 《酵母蔗糖酶的提取及性质测定》-毕业设计(论文).doc
- 《借壳上市对企业绩效的影响—基于山煤集团借壳中油化建的分析》-毕业设计(论文).doc
- 《金融学专业-浅析我国商业银行个人房贷业务的风险范防与控制》-毕业设计(论文).doc
- 《金属表面前处理——除油、除锈》-毕业设计(论文).doc
- 《金属切削刀具可靠性的研究》-毕业设计(论文).doc
- 《酒店形象维度对顾客满意的影响》-毕业设计(论文).doc
- 《具有弹性的夹爪机构设计》-毕业设计(论文).doc
- 《具有长线补偿能力的直流放大器的称重传感器设计》-毕业设计(论文).docx
文档评论(0)