周以反汇编在常数优化因子中应用_第1页
周以反汇编在常数优化因子中应用_第2页
周以反汇编在常数优化因子中应用_第3页
周以反汇编在常数优化因子中应用_第4页
周以反汇编在常数优化因子中应用_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

论反汇编在时间常数优化中的应省七 :VisualC++语言环境下,从特定编译器关键字:C++反汇编时间常数优化VisualC++语言环境下,从特定编译器生成的汇编代码出发,探一、基本概language由于汇编语言的各种语范互不兼容,本文以下部分以In语法为基础,并以使用In语法的VisualC++作为实验平台。addaddeax,add有两个参数。一个源参数,一个目标参数。它把源值加到目标值中,有几种大小的寄存器:4位,8位,16位,32位(MMX处理器中有更多的种类。在16位程序中,你仅能使用4位、8位和16位的寄存器。在32eax保存了值EA7823BBh,那么,它的子寄存器ax,ah和al也会保存其值的一部分,如下表所示: EA782323ax,ah,aleax的一部分。eax32位的寄存器(386以上存在)ax包含eax16位(2字节,ahax的高字节,而al包含了ax的低位字节。因而ax16位的,alax8位的。让来分析下面的代码eax,cl,cl,10al,clmov指令可以把一个值从寄存器,内存或直接数值移入另一个寄存器。在上面的例子中,eax12345678hah的值(eax左数第三个字节)被cl中(ecx寄存器的最低字节。然后,cl10al中(eax的编译器(Compiler),是将便于人编写,阅读,的高级计算机语言程序program)作为输入,翻译产生使用目标语言(language)的等价程序。language而目标程序则是机器能直接执行的目标代码(Objectcode码(Machinecode。r功能的完整性不依赖于特定编译器的特性或隐藏功能,因此具有通用性和兼容二、数据分1Aoa[1]8286系统各种伪代码的理论执行时间表表1:8286指令集的执试验环试验环境 WindowsXPsp2050301-1519MSVC++69514-335-0000007-硬件:InPentium4CPU2.66GHzRelease模式等同于优化模式约等于G++中-O2优化进试。#include<time.h>#include#include<time.h>#include<stdio.h>clock_tstart,finish;inta;{movecx,2000000000 moveax,10movebx,10 dececxjztestEndjmp}return0;}的Python,得出了表2的结果:表2:在测试环境下各个指令实际运行时间及比NORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALPTRPTRPTRPTRPTRPTRPUSHCALLRET注1有误差,并且会随着操作系 编译器和系统配置的变化而不同程度的波动具体测试语句见附录L1L2变量长度(16,32)等3表311andorxornotadd,sub加减法运算,test置位运算(为sub运算2344556call+ret调用子函数+从这6个层次中,可以看到汇编代码执行的快慢程度,因此,如果我作组合,那么,就达到了对时间常数进行优化的目的。三、实例分memset函数的小实看下面的C++程序(假设计算机具有足够大的内存:#include#includeconstintcharfield[Total/Time];intforforfor(i=0;i<Time;i++)return}Time值对速度无影响,因为程序的时间复杂度守恒。但是,当上机实验后,你会发现Time100000左右时程序运行最快Time值在C++语言中,把memset作为一个函数进行调用。但其实,系统中有专门的汇编伪代码实现相同的工作(repstos)Release模式下,编译器对memset进行了优化,编译为如下所示的汇编代码:edi,offsettablerepdwordptr编译器对memset过程处理如下:0offsetfieldRelease的实现效率不同这个现象,可以发现,对程序进行优化是可能的。Debug004133AD004133B0004133B1004133B4004133B5swap004133AD004133B0004133B1004133B4004133B5swap测试调用的函测试调用的函 :inlinevoidswap(int&a,int&b){int 004133BA 0041157D _aligned_free_dbg00411582 00411587 GetStringTypeW0041158C swap00411591 00411592 call+ret语句而变大了。不仅如此,微软Debug模式下会在内存中创建跳转表,可以稍加想象。比如编译器对stl库函数的实现。stl库函数的C++代码层的迭代(stl库函数的调用时可以很直观的理解这一点。所以,在的程序中,应该针对这个问题进行优化。这里,我提供了两种替然不在define块中定义变量(很可能会遇到难以估计的问题但是用全局变量可以解决同样的问题。如下例就巧妙地解决了swap的临时变量问题。intintintmain(){return0;}#include<stdio.h>#include<stdlib.h>intgetRand(){intreturn_t;}#definemax(A,B)int{printf("Getthemaxvalue:%d\n",max(getRand(),getRand()));return0;}运行结果(恒定CallgetRandreturn4461CallgetRandreturn3994Getthemaxvalue:3994ReleaseDebug模式不同的是,在Release0040105B0040105Ereturn0;00401062dwordptr测试void int 除法(求余)求余运算c=a%b等效于c=a-a/b但是,其实现直接使用除法的第eax,dwordptreax,dwordptrdwordptridiv是一种比例时间很大的指令。编译器a/=2(a32位整数)Debug模式下的解释:eax,dwordptrdwordptr接可用位运算代替,使用位运算。法判断变量的特殊性,以至于编译器直接将语句翻译为idiv操作。这样,如果constconst关于数组的性能优)数组数组中的数据。若要数组中的单个元素,可以使用后面跟数组索引(数组索引放在方括号([])中)的数组标识符。若要整个数组,则只需)00411B6Fmov00411B7500411B7800411B7F00411B85eax,dwordptr[i]00411B6Fmov00411B7500411B7800411B7F00411B85eax,dwordptr[i]edx,dwordptr[j]eax,dwordptrreturn0040102E eax,dwordptr00401032 00401035 eax,dwordptr00401039 0040103C 0040103F eax,dwordptrN,那么用type*指针加减操作以及辅助记录要更快一些(省去了乘法操作。下面是实00411B5500411B5A00411B5D00411B6300411B6A

ecx,dwordptr[jdwordptr[a(42B6A0h)],edxeax,dwordptr[ddecx,dwordptrdwordptr[beax,dwordptr[goecx,dwordptr[ptrdwordptr[ptr200411A60mov00411A65eax,dwordptr[ptr2eax,00411A60mov00411A65eax,dwordptr[ptr2eax,dwordptr例:adv1900题意描述数据规模100%的数据中,1≤N,M≤200,时间片段个数(K)≤200,时间长度RMQ等,也是基于“批处理”化的思想。但是,在有了上文的实验结论后,我表3:“行走”表4:非“行走”优化方试题:adv1900试题:adv1900评测结果 时 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 虽然和标准方法的速度(0.3s)有很大差距,但是,使用这种方法,能够四、总汇编语言,是最接近于计算机本质

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论