汇编优化工具「建议收藏」

汇编优化工具

大家好,又见面了,我是全栈君。

/*
汇编优化工具
使汇编代码更具可读性,并提高汇编速度
优化15000行大约须要30秒
*/

import rfile.h

main
{
	name=getsl
	s=rfile.read_all_n(name)

	s=s.replace('\n','\r\n')
	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('\r\n\r\n\r\n','\r\n\r\n')
}

//符号替换
rstr sym_replace(rstr s)
{
	rbuf<rstr> arr
	r_split_e<rstr>(s,'\r\n',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+='\r\n'
			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+='\r\n'
				continue
		ret+=temp
		ret+='\r\n'
	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,'\r\n',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+='\r\n'
	return ret
}

//jmp后接一个跳转符号
rstr opt_jmp(rstr s)
{
	rbuf<rstr> arr
	r_split_e<rstr>(s,'\r\n',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+='\r\n'
	return ret
}

//连续2个jmp,后一个jmp不可能被运行
rstr opt_two(rstr s)
{
	rbuf<rstr> arr
	r_split_e<rstr>(s,'\r\n',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+='\r\n'
			i++
			continue
		ret+=temp
		ret+='\r\n'
	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==`_
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116563.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux内核使用的编程语言_linux内核模块编程

    linux内核使用的编程语言_linux内核模块编程1、内核编程不能访问C库2、内核编程时必须使用GNUC3、内核编程时缺乏像用户空间那样的内存保护机制4、内核编程时浮点数很难使用5、内核只有一个很小的定长堆栈6、由于内核支持异步中断,抢占和SMP,因此必须时刻注意同步和并发7、要考虑可移植性的重要性

    2022年10月8日
    3
  • java jar 没有主清单属性_Spring Boot jar中没有主清单属性的解决方法「建议收藏」

    java jar 没有主清单属性_Spring Boot jar中没有主清单属性的解决方法「建议收藏」使用SpringBoot微服务搭建框架,在eclipse和Idea下能正常运行,但是在打成jar包部署或者直接使用java-jar命令的时候,提示了xxxxxx.jar中没有主清单属性:D:\hu-git\spring-xxx-xxx\target>java-jarspring-cloud-eureka-0.0.1-SNAPSHOT.jarspring-xxx-xxx-0.0.1-S…

    2025年9月13日
    7
  • cs与bs模式的优缺点_什么是cs什么是bs

    cs与bs模式的优缺点_什么是cs什么是bscs与bs模式关于CS(Client-Server)模式和BS(Browser-Server)模式的水很深,盆地自己也认为对此了解不够透彻,但作为手机客户端设计,如果不对CS、BS做一定程度的了解,是很容易出现一些方向性的错误、走一些弯路抑或在实现性价比上付出过多代价。本文偏向于基础知识,产品人员很多情况下不仅仅要了解表现、交互,还需要一定程度上了解可实现性、实现代价、实现形式、实现限制等…

    2025年10月11日
    6
  • gamma校正什么意思_伽马校正系数

    gamma校正什么意思_伽马校正系数UNDERSTANDINGGAMMACORRECTIONGammaisanimportantbutseldomunderstoodcharacteristicofvirtuallyalldigitalimagingsystems.Itdefinestherelationshipbetweenapixel’snumericalvalueand

    2022年9月22日
    5
  • 关于python的论文参考文献_java毕业论文参考文献

    关于python的论文参考文献_java毕业论文参考文献java论文参考文献英文时间:2015-06-12来源:未知本文字数:14132字作者:小韩单位:在写java毕业论文或高水平java学术论文时,要求参考一些java英文参考文献,外文文献一般体现了国际最新研究进展,让我们写的java论文与国际接轨,为了方便大家,这里学术堂整理了150篇Java论文参考文献英文。更多2020年最新java论文参考文献英文,请在文章末尾处查看。java论文参考…

    2022年9月28日
    2
  • shell编程中if语句_linux shell if语句

    shell编程中if语句_linux shell if语句read-n1-p”Let’sgo(yorn):”if[“$REPLY”x=”y”x-o”$REPLY”x=”Y”x];then#dosomethingfi①、注意空格。eg. if   [  $REPLY  =  “Y”  ]示例中为了看的明显,输入了连续的空格,写shell脚本时,只需一个空格即可

    2022年8月18日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号