zoukankan      html  css  js  c++  java
  • 汇编优化工具

    /*
    汇编优化工具
    使汇编代码更具可读性,并提高汇编速度
    优化15000行大约须要30秒
    */
    
    import rfile.h
    
    main
    {
    	name=getsl
    	s=rfile.read_all_n(name)
    
    	s=s.replace('
    ','
    ')
    	s=s.replace('dword esp','esp')
    	s=s.replace('dword ebp','ebp')
    	s=s.replace('dword edi','edi')
    	s=s.replace('dword esi','esi')
    	s=s.replace('dword ebx','ebx')
    	s=s.replace(',ecx',', ecx')
    	s=s.replace('ebx,0','ebx , 0')
    	s=s.replace('ecx,[','ecx , [')
    	s=s.replace('mov dword [ edi ] , esi','mov [ edi ] , esi')
    	s=opt_sym(s)
    	s=line_del(s)
    	s=opt_jmp(s)
    	s=line_del(s)
    	s=opt_two(s)
    	s=line_del(s)
    	s=sym_replace(s)
    	s=line_del(s)
    
    	rfile.write_all_n(name,s)	
    }
    
    rstr line_del(rstr& s)
    {
    	return s.replace('
    
    
    ','
    
    ')
    }
    
    //符号替换
    rstr sym_replace(rstr s)
    {
    	rbuf<rstr> arr
    	r_split_e<rstr>(s,'
    ',arr)
    	rstr ret
    	for i in arr
    		temp=arr[i]
    		if temp.get_top==`:&&is_symbol(temp.sub(0,temp.count-1))
    			ret+=sym_trans(temp.sub(0,temp.count-1))+':'
    			ret+='
    '
    			continue
    		if (temp.sub(0,5)=='	jmp '||
    			temp.sub(0,6)=='	call '||
    			temp.sub(0,5)=='	jnz '||
    			temp.sub(0,4)=='	jg '||
    			temp.sub(0,4)=='	jl '||
    			temp.sub(0,5)=='	jae '||
    			temp.sub(0,4)=='	jz ')
    			index=temp.find(' ')
    			symbol=temp.sub(index+1)
    			if is_symbol(symbol)
    				ret+=temp.sub(0,index+1)+sym_trans(symbol)
    				ret+='
    '
    				continue
    		ret+=temp
    		ret+='
    '
    	return ret
    }
    
    rstr sym_trans(rstr s)
    {
    	rstr ret
    	for i in s
    		two=s.sub(i,i+2)
    		if two=='28'||two=='29'//()
    			i++
    			ret+='_'
    		elif two=='2E'||two=='2C'||two=='5F'//.,_
    			i++
    			ret+='_'
    		elif two=='26'
    			i++
    			ret+='q'
    		elif two=='7E'
    			i++
    			ret+='d'
    		elif two=='7C'
    			i++
    			ret+='h'
    		elif two=='5B'
    			i++
    			ret+='i'
    		elif two=='5D'
    			i++
    			ret+='j'
    		elif two=='3D'//=
    			i++
    			ret+='a'
    		elif two=='2B'
    			i++
    			ret+='b'
    		elif two=='2D'//-
    			i++
    			ret+='s'
    		elif two=='2A'//*
    			i++
    			ret+='t'
    		elif two=='2F'
    			i++
    			ret+='f'
    		elif two=='25'
    			i++
    			ret+='e'
    		elif two=='21'//!
    			i++
    			ret+='o'
    		elif two=='3E'//>
    			i++
    			ret+='x'
    		elif two=='3C'//<
    			i++
    			ret+='y'
    		else
    			ret+=s[i]
    	return seq_replace(ret)
    }
    
    rstr seq_replace(rstr s)
    {
    	//s=s.replace('__','_')
    	if s.get_top==`_
    		s.pop
    	if s.get_top==`_
    		s.pop
    	return s
    }
    
    //无引用符号删除
    rstr opt_sym(rstr s)
    {
    	rbuf<rstr> arr
    	r_split_e<rstr>(s,'
    ',arr)
    	rstr ret
    	for i in arr
    		temp=arr[i]
    		full=temp.sub(0,temp.count-1)
    		if temp.get_top==`:&&is_symbol(full)
    			symbol=get_symbol(full)
    			ifn symbol.empty
    				if get_count(arr,i,symbol,full)==1
    					continue
    		ret+=temp
    		ret+='
    '
    	return ret
    }
    
    //jmp后接一个跳转符号
    rstr opt_jmp(rstr s)
    {
    	rbuf<rstr> arr
    	r_split_e<rstr>(s,'
    ',arr)
    	rstr ret
    	for i in arr
    		temp=arr[i]
    		a=arr.get(i+1)
    		full=a.sub(0,a.count-1)
    		if temp.sub(0,5)=='	jmp '&&temp.sub(5)==full&&a.get_top==`:
    			symbol=get_symbol(full)
    			ifn symbol.empty
    				if get_count(arr,i,symbol,full)==2
    					i++
    					continue
    				else
    					continue
    		ret+=temp
    		ret+='
    '
    	return ret
    }
    
    //连续2个jmp,后一个jmp不可能被运行
    rstr opt_two(rstr s)
    {
    	rbuf<rstr> arr
    	r_split_e<rstr>(s,'
    ',arr)
    	rstr ret
    	for i in arr
    		temp=arr[i]
    		a=arr.get(i+1)
    		if temp.sub(0,5)=='	jmp '&&a.sub(0,5)=='	jmp '
    			ret+=temp
    			ret+='
    '
    			i++
    			continue
    		ret+=temp
    		ret+='
    '
    	return ret
    }
    
    int get_count(rbuf<rstr>& arr,int i,rstr& symbol,rstr& full)
    {
    	for j=i-1;j>=0;j--
    		if arr[j].sub(0,arr[j].count-1)==symbol&&`:==arr[j].get_top
    			break
    	for k=i+1;k<arr.count;k++
    		if arr[k].empty
    			break
    	return find_count(arr,j,k,full)
    }
    
    rstr get_symbol(rstr s)
    {
    	for i=s.count-1;i>=0;i--
    		if s[i]==`_&&s.sub(i+1).is_number
    			return s.sub(0,i)
    	return ''
    }
    
    int find_count(rbuf<rstr>& arr,int left,int right,rstr& symbol)
    {
    	count=0
    	for i=left;i<=right;i++
    		count+=find_count(arr[i],symbol)
    	return count
    }
    
    int find_count(rstr src,rstr dst)
    {
    	count=0
    	for i in src
    		if src.sub(i,i+dst.count)==dst
    			count++
    	return count	
    }
    
    bool is_symbol(rstr s)
    {
    	for i in s
    		ifn is_symbol(s[i])
    			return false
    	return true
    }
    
    bool is_symbol(char ch)
    {
    	return ch>=`A&&ch<=`Z||ch>=`a&&ch<=`z||ch>=`0&&ch<=`9||ch==`_
    }
    

  • 相关阅读:
    SQLite数据库如何存储和读取二进制数据
    JS常用代码
    获取内容第一张图片地址的函数
    我对App_Code的理解
    VS2008中Web项目的App_Code目录问题
    jQuery 浮动广告实现代码
    常用的倒计时脚本
    IE8 CSS hack
    精典的网吧常用批处理收集
    ASP.NET中App_Code,App_Data等文件夹的作用
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5073934.html
Copyright © 2011-2022 走看看