精易论坛

标题: 汇编实现“到小写” 比核心库快30倍 [打印本页]

作者: 绿色的可达鸭    时间: 2019-5-23 19:00
标题: 汇编实现“到小写” 比核心库快30倍
本帖最后由 绿色的可达鸭 于 2019-5-23 19:06 编辑

看了易语言官论的一个问题贴而写的
实际上就是 ntdll._strlwr 函数 (抽取该函数的汇编代码进行修整)
因为该函数直接对传递的文本指针进行写操作
易语言的静态编译下把静态文本放到常量段(保护:可读不能写)
这种情况下调用该API会导致程序崩溃

什么是静态文本?
如: _strlwr ("ABC")

什么是动态文本?
如:   _strlwr(字符(#A键) + 字符(#B键) + 字符(#C键))

而我写的"到小写"不但解决的这个问题而且比核心库的到小写更快上不少
实际上还可以更快一些,不过也只是微乎其微就没必要再优化了,相信微软的行了









作者: Zangetsu    时间: 2019-5-23 19:20
兄弟准备核心库效率化吗
作者: 379061296    时间: 2019-5-23 19:25
感谢分享   

作者: 全村最帅    时间: 2019-5-23 19:30
骗子,我这里测试的怎么只有29倍
作者: う网淅乄    时间: 2019-5-23 19:39
加油 把核心库的所有基础命令 汇编化
作者: Su·    时间: 2019-5-23 19:48
骗子,明明是37.69倍
作者: Peerless    时间: 2019-5-23 19:49
谢谢分享,学习下
作者: xpvcxx    时间: 2019-5-23 20:09
感谢分享,很给力
作者: 萌新苏苏    时间: 2019-5-23 20:11
#在这里快速回复#而我写的"到小写"不但解决的这个问题而且比核心库的到小写更快上不少 实际上还可以更快一些,不过也只是微乎其微就没必要再优化了,相信微软的行了
作者: 1218947699    时间: 2019-5-23 20:56
卧槽,继续,大佬
作者: cf2006a    时间: 2019-5-23 20:57
本帖最后由 cf2006a 于 2019-5-23 21:19 编辑
  
push esi
mov esi, dword [ebp-0x04]   //第一个变量地址
mov edx, esi                           //第一个变量地址
mov cl, byte [esi]                    //取出第一个字节
jmp Label1                              //无条件跳转到标签1
Label3:
lea eax, dword [ecx-0x41]      //0x41是数值65  拿A举例   A-ascii码  65   a 97  65-65=0
cmp al, 0x19         //0x19是数值25           
jnbe Label2           //大于25    跳转到标签2  
add cl, 0x20           //0x20是数值32   小于25就加32   拿A举例 65+32=97  就是小写a的ascii编码
mov byte [edx], cl
Label2:
inc edx                    //加一
mov cl, byte [edx]  // 取出下一个字节到cl
Label1:
test cl, cl                 // cl 等于0弹出堆栈结束
jne Label3
pop esi

作者: 邪恶的二进制    时间: 2019-5-23 21:00
谢谢分享,学习
作者: pgfgrr    时间: 2019-5-23 21:06
顶楼主啦..支持下
作者: 一尘不染    时间: 2019-5-23 21:26
加油 把核心库的所有基础命令 汇编化
作者: cf2006a    时间: 2019-5-23 21:27
  
子程序名返回值类型公开备 注
文本_小写文本型 
参数名类 型参考可空数组备 注
参_文本文本型
变量名类 型静态数组备 注
局_临时文本型 
局_临时 = 参_文本
置入代码 ({ 86, 139, 117, 252, 137, 242, 133, 210, 116, 23, 138, 14, 235, 15, 141, 65, 191, 60, 25, 119, 5, 128, 193, 32, 136, 10, 66, 138, 10, 132, 201, 117, 237, 94 })
返回 (局_临时)
' push esi
' mov esi, dword [ebp-0x04]   //第一个变量地址
' mov edx, esi                           //第一个变量地址
[color=magenta] ' test edx,edx                                                                     这里要加上这句要不 参数文本为空时会不运行
' je label4[/color]
' mov cl, byte [esi]                    //取出第一个字节
' jmp Label1                              //无条件跳转到标签1
' Label3:
' lea eax, dword [ecx-0x41]      //0x41是数值65  拿A举例   A-ascii码  65   a 97  65-65=0
' cmp al, 0x19         //0x19是数值25
' jnbe Label2           //大于25    跳转到标签2
' add cl, 0x20           //0x20是数值32   小于25就加32   拿A举例 65+32=97  就是小写a的ascii编码
' mov byte [edx], cl
' Label2:
' inc edx                    //加一
' mov cl, byte [edx]  // 取出下一个字节到cl
' Label1:
' test cl, cl                 // cl 等于0弹出堆栈结束
' jne Label3
' label4:
' pop esi


作者: 情殇QAQ    时间: 2019-5-23 21:37
        加油 把核心库的所有基础命令 汇编化
作者: 529512527    时间: 2019-5-23 21:44
支持一下谢谢???
作者: Mr.Yang    时间: 2019-5-23 21:44
请问汇编要怎么学?看到你的帖子 对这个有些兴趣.
作者: 福仔    时间: 2019-5-23 22:15
看看是不是使用位与操作
作者: 54212    时间: 2019-5-23 22:29
谢谢分享,汇编速度快很多啊
作者: 福仔    时间: 2019-5-23 22:41
cf2006a 发表于 2019-5-23 20:57
  
push esi
mov esi, dword [ebp-0x04]   //第一个变量地址
mov edx, esi                            ...[/quote]
大小写转换使用位或和位与就可以实现,到大写把第五位变成0,到小写把第五位变成1
[e=1]
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
_启动子程序整数型 
调试输出 (到小写_asm (“abakjslkakjHHKJA”), 到大写_asm (“abakjslkakjHHKJA”))
返回 (0)
子程序名返回值类型公开备 注
到大写_asm文本型 
参数名类 型参考可空数组备 注
s文本型
变量名类 型静态数组备 注
a文本型 
a = s
置入代码 ({ 139, 77, 252, 139, 193, 138, 25, 128, 227, 223, 136, 25, 65, 132, 219, 117, 244, 139, 77, 252, 201, 194, 4, 0 })
' mov ecx,[ebp-4]
' mov eax,ecx
' s:
' mov bl,[ecx]
' and bl,11011111b
' mov [ecx],bl
' inc ecx
' test bl,bl
' jnz s
' mov ecx,[ebp-4]
' leave
' ret 4
返回 (“”)
子程序名返回值类型公开备 注
到小写_asm文本型 
参数名类 型参考可空数组备 注
s文本型
变量名类 型静态数组备 注
a文本型 
a = s
置入代码 ({ 139, 77, 252, 139, 193, 138, 25, 132, 219, 116, 8, 128, 203, 32, 136, 25, 65, 235, 242, 201, 194, 4, 0 })
' mov ecx,[ebp-4]
' mov eax,ecx
' s:
' mov bl,[ecx]
' test bl,bl
' jz exit
' or bl,00100000B
' mov [ecx],bl
' inc ecx
' jmp s
' exit:
' leave
' ret 4
返回 (“”)


i支持库列表   支持库注释   
spec特殊功能支持库

作者: 福仔    时间: 2019-5-23 22:50
  
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
_启动子程序整数型 
调试输出 (到小写_asm (“abakjslkakjHHKJA”), 到大写_asm (“abakjslkakjHHKJA”))
返回 (0)
子程序名返回值类型公开备 注
到大写_asm文本型 
参数名类 型参考可空数组备 注
s文本型
变量名类 型静态数组备 注
a文本型 
a = s
置入代码 ({ 139, 77, 252, 139, 193, 138, 25, 128, 227, 223, 136, 25, 65, 132, 219, 117, 244, 201, 194, 4, 0 })
' mov ecx,[ebp-4]
' mov eax,ecx
' s:
' mov bl,[ecx]
' and bl,11011111b
' mov [ecx],bl
' inc ecx
' test bl,bl
' jnz s
' leave
' ret 4
返回 (“”)
子程序名返回值类型公开备 注
到小写_asm文本型 
参数名类 型参考可空数组备 注
s文本型
变量名类 型静态数组备 注
a文本型 
a = s
置入代码 ({ 139, 77, 252, 139, 193, 138, 25, 132, 219, 116, 8, 128, 203, 32, 136, 25, 65, 235, 242, 201, 194, 4, 0 })
' mov ecx,[ebp-4]
' mov eax,ecx
' s:
' mov bl,[ecx]
' test bl,bl
' jz exit
' or bl,00100000B
' mov [ecx],bl
' inc ecx
' jmp s
' exit:
' leave
' ret 4
返回 (“”)


i支持库列表   支持库注释   
spec特殊功能支持库


内部错误.....为啥我的回复就不显示呢
作者: 走路有点憨    时间: 2019-5-23 23:14
官方有没有啥专门收集优化整改的帖子。最好提交过去让升升级。。。大家也都能用到

作者: 福仔    时间: 2019-5-23 23:41
  
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
_启动子程序整数型 
调试输出 (到大写_asm (“啊吧从????的额发给和i就看了吗你哦怕去人是他uv我下有在”), 到小写_asm (“啊吧从????的额发给和i就看了吗你哦怕去人是他uv我下有在”))
返回 (0)
子程序名返回值类型公开备 注
到大写_asm文本型 
参数名类 型参考可空数组备 注
s文本型
变量名类 型静态数组备 注
a文本型 
a = s
置入代码 ({ 139, 77, 252, 139, 193, 138, 25, 132, 219, 116, 19, 65, 128, 251, 97, 114, 244, 128, 251, 122, 119, 239, 128, 227, 223, 136, 89, 255, 235, 231, 201, 194, 4, 0 })
' mov ecx,[ebp-4]
' mov eax,ecx
' s:
' mov bl,[ecx]
' test bl,bl
' jz exit ;bl=0 字符串结尾,跳出循环
' inc ecx
' cmp bl,97
' jb s ;bl小于97跳回去重新循环,小写字母在97-122之间
' cmp bl,122
' ja s ;bl大于122,不是小写字母范围内
' and bl,11011111b
' mov [ecx-1],bl
' jmp s ;继续循环
' exit:
' leave
' ret 4
返回 (“”)
子程序名返回值类型公开备 注
到小写_asm文本型 
参数名类 型参考可空数组备 注
s文本型
变量名类 型静态数组备 注
a文本型 
a = s
置入代码 ({ 139, 77, 252, 139, 193, 138, 25, 132, 219, 116, 19, 65, 128, 251, 65, 114, 244, 128, 251, 90, 119, 239, 128, 203, 32, 136, 89, 255, 235, 231, 201, 194, 4, 0 })
' mov ecx,[ebp-4]
' mov eax,ecx
' s:
' mov bl,[ecx]
' test bl,bl
' jz exit ;bl=0 字符串结尾,跳出循环
' inc ecx
' cmp bl,65
' jb s ;bl小于65跳回去重新循环,大写字母在65-90之间
' cmp bl,90
' ja s ;bl大于90,不是大写字母范围内
' or bl,00100000b
' mov [ecx-1],bl
' jmp s ;继续循环
' exit:
' leave
' ret 4
返回 (“”)


i支持库列表   支持库注释   
spec特殊功能支持库

改了一下,广告那个不支持非字母,这个支持有非字母
作者: 轻风影    时间: 2019-5-24 00:49
看起来很牛B

作者: 夜潇    时间: 2019-5-24 08:36
一般用不到吧?

作者: 网络注册络员    时间: 2019-5-24 08:39
这么多大神
作者: orjg    时间: 2019-5-24 08:41
也是一种思路
作者: haduke    时间: 2019-5-24 08:47
看看,学习一下!

作者: cf2006a    时间: 2019-5-24 09:06
福仔 发表于 2019-5-23 22:50
[e=1]
.版本 2
.支持库 spec

Label2:
mov bl, byte [eax]
test bl, bl
je Label1
or bl, 0x20
mov byte [eax], bl
inc eax
jmp Label2
Label1:
pop eax
leave
retn 0x0004

这样更简单
作者: cf2006a    时间: 2019-5-24 09:17
福仔 发表于 2019-5-23 22:41
大小写转换使用位或和位与就可以实现,到大写把第五位变成0,到小写把第五位变成1
[e=1]
.版本 2

请问这是什么原理呢 or  and 第六位是巧合吗?
作者: hezeyu    时间: 2019-5-24 09:49
加油  把核心库 给干下去,,,吴涛这个垃圾,,都没你 这么牛逼 写支持库
作者: 福仔    时间: 2019-5-24 10:46
cf2006a 发表于 2019-5-24 09:17
请问这是什么原理呢 or  and 第六位是巧合吗?

不是巧合,你自己把所有小写字母和大写字母转成二进制,然后输出看一下吧,他们只有一位不同,其他都相同
作者: 吃干饭的锅    时间: 2019-5-24 11:11
感谢分享。
作者: sinewtec    时间: 2019-5-24 13:05
看看和我写的有什么不同
作者: 谁的坏叔叔    时间: 2019-5-24 16:30
看看
作者: fjqisba    时间: 2019-5-24 16:35
为什么不直接用黑月编译
作者: a3960382663    时间: 2019-5-24 21:13
谢谢!分享、...
作者: wangjunjun    时间: 2019-5-25 18:30
谢谢分享 学习了
作者: sdyy111    时间: 2019-5-25 19:47
汇编实现“到小写” 比核心库快30倍 [修改]

作者: z博士    时间: 2019-5-25 19:56
看看         
作者: lyjdgkg    时间: 2019-5-26 02:22
看看中英混合是出错么

作者: shituo    时间: 2019-5-26 17:12
阿斯蒂芬是打发斯蒂芬

作者: shituo    时间: 2019-5-26 17:44
本帖最后由 shituo 于 2019-5-26 17:52 编辑
  
tmp = 欲变换的文本
' _asm{
' push esi
' mov esi , dword [ebp-04h]
' mov edx , esi
' mov cl , byte [esi]
' jmp reten
' next:
' lea eax , dword [ecx-41h]
' cmp cl , 61h
' jl left
' cmp cl , 7Ah
' jg left
' sub cl , 20h
' mov byte [edx] , cl
' left:
' inc edx
' mov cl , byte [edx]
' reten:
' test cl , cl
' jne next
' pop esi
' }
返回 (tmp)


根据你这个写的到大写置入代码 ({ 86, 139, 117, 252, 137, 242, 138, 14, 235, 21, 141, 65, 191, 128, 249, 97, 124, 10, 128, 249, 122, 127, 5, 128, 233, 32, 136, 10, 66, 138, 10, 132, 201, 117, 231, 94 })




作者: cronus    时间: 2019-5-26 22:15
看看,这个很好的

作者: 1946222945    时间: 2019-5-28 17:49
看看怎么样
作者: 8wy721719    时间: 2019-5-28 21:07
谢谢分享,学习了!
作者: Kinoo    时间: 2019-5-31 10:11

谢谢分享 学习了
作者: 懒人定制软件    时间: 2019-5-31 12:43
  先点评加好评再送精币的说
作者: Maclovin    时间: 2019-6-7 23:51
好想学汇编
作者: 果心豆腐酱    时间: 2023-9-21 01:08


天啊,双核服务器,用核心库的居然这么慢啊

作者: 果心豆腐酱    时间: 2023-9-21 01:54
shituo 发表于 2019-5-26 17:44
[e=0].版本 2

tmp = 欲变换的文本

注释的是什么啊
作者: 鸿运    时间: 2024-7-31 16:40
感谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4