汇编优化笔记

本文记录了汇编代码优化过程,通过删除不必要的指令如无用的取反和无关的字节操作,实现了清屏功能的精简和效率提升。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:


代码原作者是Icy_Ybk


他把cmd.exe里面的cls指令调用的函数用c语言写了个模块。
在c语言中,system("cls");大概需要90ms左右。
他这个模块能达到3ms左右。


我就是突发奇想想要进一步优化一下速度


正题:



部分汇编码:
	movw	$0, -42(%ebp)        #将[{ebp-42}的地址指向的值]归零
	movw	$0, -40(%ebp)	     #将[{ebp-40}的地址指向的值]归零
	movzwl	-34(%ebp), %eax	     #将[{ebp-34}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -38(%ebp)	     #将[{ax}的值]赋给[{ebp-38}的地址指向的值]
	movzwl	-32(%ebp), %eax	     #将[{ebp-32}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -36(%ebp)	     #将[{ax}的值]赋给[{ebp-36}的地址指向的值]
	movw	$0, -46(%ebp)	     #将[{ebp-46}的地址指向的值]归零
	movzwl	-32(%ebp), %eax	     #将[{ebp-32}的地址指向的值_作0扩展后的4字节]赋给{eax}
	negl	%eax		     #将[{eax}的值]取反
	movw	%ax, -44(%ebp)	     #将[{ax}的值]赋给[{ebp-44}的地址指向的值]
	movw	$32, -50(%ebp)	     #将[{32}]赋给[{ebp-44}的地址指向的值]
	movzwl	-26(%ebp), %eax	     #将[{ebp-26}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -48(%ebp)	     #将[{ax}的值]赋给[{ebp-48}的地址指向的值]
	leal	-50(%ebp), %eax	     #将[{ebp-50}的值]赋给{eax}


仔细看能看见有两条重复的。

->	movzwl	-32(%ebp), %eax	     #将[{ebp-32}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -36(%ebp)	     #将[{ax}的值]赋给[{ebp-36}的地址指向的值]
	movw	$0, -46(%ebp)	     #将[{ebp-46}的地址指向的值]归零
->	movzwl	-32(%ebp), %eax	     #将[{ebp-32}的地址指向的值_作0扩展后的4字节]赋给{eax}
	negl	%eax		     #将[{eax}的值]取反

这两条之间没有对[{eax}的值]和[{ebp-32}的地址指向的值]进行任何操作。则可以删掉其中一条


继续向下看下一行。

            negl %eax         #将[{eax}的值]取反


你一个清屏你取啥反啊...

删掉。


从头再看。

	movw	$0, -42(%ebp)        #将[{ebp-42}的地址指向的值]归零
	movw	$0, -40(%ebp)	     #将[{ebp-40}的地址指向的值]归零
	movzwl	-34(%ebp), %eax	     #将[{ebp-34}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -38(%ebp)	     #将[{ax}的值]赋给[{ebp-38}的地址指向的值]
	movzwl	-32(%ebp), %eax	     #将[{ebp-32}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -36(%ebp)	     #将[{ax}的值]赋给[{ebp-36}的地址指向的值]
	movw	$0, -46(%ebp)	     #将[{ebp-46}的地址指向的值]归零
	movw	%ax, -44(%ebp)	     #将[{ax}的值]赋给[{ebp-44}的地址指向的值]
	movw	$32, -50(%ebp)	     #将[{32}]赋给[{ebp-44}的地址指向的值]
	movzwl	-26(%ebp), %eax	     #将[{ebp-26}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -48(%ebp)	     #将[{ax}的值]赋给[{ebp-48}的地址指向的值]
	leal	-50(%ebp), %eax	     #将[{ebp-50}的值]赋给{eax}


指令movzwl: 作0扩展的2字节复制到4字节

你一个清屏和字节有啥关系啊....删掉。


修改后的部分汇编码:
	movw	$0, -42(%ebp)        #将[{ebp-42}的地址指向的值]归零
	movw	$0, -40(%ebp)	     #将[{ebp-40}的地址指向的值]归零
	movl	-34(%ebp), %eax	     #将[{ebp-34}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -38(%ebp)	     #将[{ax}的值]赋给[{ebp-38}的地址指向的值]
	movl	-32(%ebp), %eax	     #将[{ebp-32}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -36(%ebp)	     #将[{ax}的值]赋给[{ebp-36}的地址指向的值]
	movw	$0, -46(%ebp)	     #将[{ebp-46}的地址指向的值]归零
	movw	%ax, -44(%ebp)	     #将[{ax}的值]赋给[{ebp-44}的地址指向的值]
	movw	$32, -50(%ebp)	     #将[{32}]赋给[{ebp-44}的地址指向的值]
	movl	-26(%ebp), %eax	     #将[{ebp-26}的地址指向的值_作0扩展后的4字节]赋给{eax}
	movw	%ax, -48(%ebp)	     #将[{ax}的值]赋给[{ebp-48}的地址指向的值]
	leal	-50(%ebp), %eax	     #将[{ebp-50}的值]赋给{eax}

编译通过。


结论:


后来事实证明,我的吐槽判断是正确的。
不过取反是有用的。


取反后  数据滚动到缓冲区的上面
未取反  数据滚动到缓冲区的下面


然而达到了同样的效果


刚巧movzwl所指向的被拓展的数据,全是0。


所以说本文中真正能用于汇编优化的只是重复处理
(虽然我这些的确全部起到了优化作用)


时间测试我没做。
至于快没快。
不管你信不信,反正我信了。


附:
原程序 和 修改后程序 下载链接:https://share.weiyun.com/e12aa5e27eed560bd03f852310397010
解压密码:cls

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值