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

汇编优化工具

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

/*
汇编优化工具
使汇编代码更具可读性,并提高汇编速度
优化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)
上一篇 2022年1月19日 下午6:00
下一篇 2022年1月19日 下午7:00


相关推荐

  • c++用socket,ftp进行文件传输,实现上传与下载文件功能

    c++用socket,ftp进行文件传输,实现上传与下载文件功能

    2021年3月12日
    233
  • matlab2c使用c++实现matlab函数系列教程-sinc函数

    matlab2c使用c++实现matlab函数系列教程-sinc函数全栈工程师开发手册(作者:栾鹏)matlab2c动态链接库下载matlab库函数大全matlab2c基础教程matlab2c开发全解教程matlab2c调用方法:1、下载matlab2c动态链接库2、将matlab2c.dll、matlab2c.lib和matlab2c.h放到项目头文件目录下3、在cpp文件中引入下面的代码#include”Matlab2c.h”#pra

    2025年6月2日
    5
  • smtp邮件服务器配置,配置SMTP服务器[通俗易懂]

    smtp邮件服务器配置,配置SMTP服务器[通俗易懂]原标题:配置SMTP服务器的全称是“SimpleMailTransferProtocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。配置SMTP服务器SMTP认证,简单地说就是要求必须在提供了账户名和密码…

    2022年10月3日
    3
  • navicat激活码2021-激活码分享

    (navicat激活码2021)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    448
  • 最好用的USDT钱包

    最好用的USDT钱包最好的用的 USDT 钱包该怎么定义 我认为一定是可以解决用户使用过程中痛点的才算 而在 USDT 的诸多使用场景里 困扰大家最多的莫过于 1 如何安全便捷的买 USDT 2 我要准备多个地址进行转币却不想注册多个钱包怎么办 3 发币提示 BTC ETH 不足 发送失败 怎么办 等等 今天要给大家介绍的比特派钱包就做到了一个钱包解决上述所有痛点 从而为经常使用 USDT 的用户解决了一大批麻烦 痛点一 安全买

    2026年3月26日
    3
  • 「 数学模型 」“使用SPSS软件主成分分析”实例

    「 数学模型 」“使用SPSS软件主成分分析”实例本文主要讲解软件使用技巧 1 SPSS 软件下载地址 https pan baidu com s 1TosjO2SPolm 提取码 4sqa2 软件使用过程 点击 文件 打开 数据 上面过程也可以将数据键盘敲进去 点击 分析 降维 因子分析 点击 继续 可以查看分析结果

    2026年3月17日
    2

发表回复

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

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