前言:
代码原作者是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