开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2355|回复: 45
收起左侧

[易语言纯源码] 【蠢新学汇编】是否在时间段之内

[复制链接]
结帖率:100% (2/2)
发表于 2024-7-19 13:38:23 | 显示全部楼层 |阅读模式   贵州省毕节市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
本帖最后由 笨来无一悟 于 2024-7-19 21:43 编辑

要不要 PUSH EDX 再 POP EDX 我是懵逼的...小心驶得万年船的原则 保护一下edx 最多就慢点 至少可以确保不会引发其他问题

  
判断 (时始 > 时末)
返回 (现在 > 时始 现在 < 时末)
返回 (现在 > 时始 现在 < 时末)

位运算 异或易语言的命令一下子搞定 汇编反复捣鼓半天

时始>时末A=1否则A=0

现在>时始B=1否则B=0

现在>时末C=1否则C=0

当A=1时 B=0 且 C=0 或 B=1 且 C=1 在时间段之内 利用位异或的特性 相同返回0 BC这时候相同 就是0 由于A是1再异或等于1 也就是真

当A=0时 B=1 且 C=0 返回真 BC异或=1 再和A异或还是1

现在的时间大于时始B=1大于时末C=1 异或之后为假

现在的时间小于时始B=0小于时末C=0 异或之后为假

那么有没有A=0 B=0 C=1的情况导致误判呢?当然没有 因为时始小于时末的时候A才可能是0 现在不可能小于时始的同时大于时末

需要用到时间段判断的小伙伴可以选择下面的写法 经过多次优化的结果

  
子程序名返回值类型公开备 注
时段逻辑型 
参数名类 型参考可空数组备 注
时始整数型时×60×60 + 分×60+秒
时末整数型时×60×60 + 分×60+秒
现在整数型时×60×60 + 分×60+秒
置入代码 ({ 82, 139, 69, 16, 59, 69, 12, 15, 153, 198, 59, 69, 8, 15, 153, 194, 48, 242, 139, 69, 8, 59, 69, 12, 15, 153, 198, 48, 242, 15, 182, 194, 90, 201, 194, 12, 0 })
返回 ()
' PUSH EDX
' MOV EAX, DWORD [EBP+0X10]
' CMP EAX, DWORD [EBP+0X0C]
' SETNS DH
' CMP EAX, DWORD [EBP+0X08]
' SETNS DL
' XOR DL,DH
' MOV EAX, DWORD [EBP+0X08]
' CMP EAX, DWORD [EBP+0X0C]
' SETNS DH
' XOR DL,DH
' MOVZX EAX, DL
' POP EDX
' LEAVE
' RETN 0X000C






来自群组: 热心网友

点评

大佬如果把代码都加上注释的话,那就更好了, 不然大多数人都是看不懂的   广东省深圳市  发表于 2024-7-20 16:42
尽量减少跳转 让代码顺序执行 少跳几次 循环123456789次能提速100+毫秒 以前不太关心跳转的耗时 悲催   贵州省毕节市  发表于 2024-7-20 01:45
位运算的解决方案很巧妙 巧归巧 不够快...   贵州省毕节市  发表于 2024-7-20 01:43
4楼的比7楼还快一丢丢 位运算代码量少了 速度没有直接分支的快 以前没有留意跳转的耗时今晚一测 影响非常大 @bysy   贵州省毕节市  发表于 2024-7-20 01:41
你应该避免 多次读内存 你应该先吧 ebp+8 什么的拿到寄存器   广东省东莞市  发表于 2024-7-20 01:29

评分

参与人数 3好评 +3 精币 +5 收起 理由
光影魔术 + 1 + 1 支持开源~!感谢分享
baitso + 1 + 2 开源精神必须支持~
yuan71058 + 1 + 2 支持开源~!感谢分享

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (5/5)

签到天数: 2 天

发表于 2024-7-19 16:34:08 | 显示全部楼层   广东省佛山市
本帖最后由 7ian 于 2024-7-19 16:47 编辑

加多个条件就这样:{ 49, 192, 139, 77, 8, 59, 77, 12, 126, 18, 139, 77, 16, 59, 77, 8, 127, 26, 139, 77, 16, 59, 77, 12, 124, 18, 235, 17, 139, 77, 16, 59, 77, 8, 126, 9, 139, 77, 16, 59, 77, 12, 125, 1, 64, 201, 194, 12, 0 }
xor eax, eax//给0
mov ecx, dword [ebp+0x08]
cmp ecx, dword [ebp+0x0C]
jle Label1//下面是 始>末
mov ecx, dword [ebp+0x10]
cmp ecx, dword [ebp+0x08]
jnle Label2//变1
mov ecx, dword [ebp+0x10]
cmp ecx, dword [ebp+0x0C]
jl Label2//变1
jmp Label3//结束
Label1://始<=末
mov ecx, dword [ebp+0x10]
cmp ecx, dword [ebp+0x08]
jle Label3//结束
mov ecx, dword [ebp+0x10]
cmp ecx, dword [ebp+0x0C]
jnl Label3//结束
Label2://变1
inc eax
Label3://结束
leave
retn 0x000C


点评

保护寄存器的值再各种跳转 比易语言自带的还慢 用位运算和你的这个相比只是代码更少了 速度几乎一样...惨   贵州省毕节市  发表于 2024-7-19 21:30
套两层位异或 满足的时候一定返回真 等下测试测试不满足的时候 有没有可能也返回真 如果没有 那就成了 没成那就算了   贵州省毕节市  发表于 2024-7-19 17:13
.版本 2 .支持库 spec 调试输出 (位异或 (0, 位异或 (1, 0))) 调试输出 (位异或 (1, 位异或 (1, 1))) 调试输出 (位异或 (1, 位异或 (0, 0))) 好像成功了 等下试试   贵州省毕节市  发表于 2024-7-19 17:11
位运算比较快,指令也少   广东省佛山市  发表于 2024-7-19 16:42
现在还在学习比较之后的各种标志位 感觉是不是可以用位运算进行判断 如果能成功 这样就可以免去分支跳转了   贵州省毕节市  发表于 2024-7-19 16:38
功德无量   贵州省毕节市  发表于 2024-7-19 16:36
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 12 天

 楼主| 发表于 2024-7-19 20:51:27 | 显示全部楼层   贵州省毕节市
最终优化版本及其示例
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕 年月日 时分秒 自己随意设定 判断当前时间 是否在指定时间段以内
调试输出 (时段 (23, 6, 8), “早8点是否在晚23点到早6点之间”)
调试输出 (时段 (23, 6, 5), “早5点是否在晚23点到早6点之间”)
调试输出 (时段 (7, 21, 9), “早9点是否在早7点到晚21点之间”)
调试输出 (时段 (7, 21, 6), “早6点是否在早7点到晚21点之间”)
调试输出 (时段 (8 × 60 + 35, 21 × 60 + 40, 12 × 60 + 30), “中午12点半是否在早上8点35到晚上21点40之间”)
调试输出 (时段 (8 × 60 + 35, 21 × 60 + 40, 22 × 60 + 35), “晚上22点35是否在早上8点35到晚上21点40之间”)
子程序名返回值类型公开备 注
时段逻辑型 
参数名类 型参考可空数组备 注
时始整数型时×60×60 + 分×60+秒
时末整数型时×60×60 + 分×60+秒
现在整数型时×60×60 + 分×60+秒
置入代码 ({ 82, 139, 69, 16, 59, 69, 12, 15, 153, 198, 59, 69, 8, 15, 153, 194, 48, 242, 139, 69, 8, 59, 69, 12, 15, 153, 198, 48, 242, 15, 182, 194, 90, 201, 194, 12, 0 })
返回 ()
' PUSH EDX
' MOV EAX, DWORD [EBP+0X10]
' CMP EAX, DWORD [EBP+0X0C]
' SETNS DH
' CMP EAX, DWORD [EBP+0X08]
' SETNS DL
' XOR DL,DH
' MOV EAX, DWORD [EBP+0X08]
' CMP EAX, DWORD [EBP+0X0C]
' SETNS DH
' XOR DL,DH
' MOVZX EAX, DL
' POP EDX
' LEAVE
' RETN 0X000C



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

点评

不保护EDX寄存器就可以再快一丁点 昨晚研究双精度数组求和搞怕了担心引发未知事故 循环123456789次只比自带的快200毫秒捣鼓半天提升很小算了将就着用   贵州省毕节市  发表于 2024-7-19 22:58
我喜欢又短又快的,虽然比我短,但是还不够快,希望能更快   广东省佛山市  发表于 2024-7-19 22:41
相比旧版提速25-30%   贵州省毕节市  发表于 2024-7-19 20:57
回复 支持 反对

使用道具 举报

签到天数: 26 天

发表于 2024-9-4 08:29:53 | 显示全部楼层   湖北省武汉市
感谢分享!
回复 支持 反对

使用道具 举报

签到天数: 11 天

发表于 2024-9-2 21:36:27 | 显示全部楼层   广西壮族自治区北海市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

发表于 2024-8-28 17:54:21 | 显示全部楼层   江苏省苏州市
相当好用!!!!
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2024-7-29 21:54:38 | 显示全部楼层   湖北省十堰市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:78% (7/9)

签到天数: 28 天

发表于 2024-7-29 17:14:00 | 显示全部楼层   福建省泉州市
谢谢分享,学习学习
回复 支持 反对

使用道具 举报

签到天数: 27 天

发表于 2024-7-22 09:39:39 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 15 天

发表于 2024-7-22 09:34:57 | 显示全部楼层   广西壮族自治区柳州市
感谢分享源码
回复 支持 反对

使用道具 举报

签到天数: 27 天

发表于 2024-7-21 09:38:00 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)

签到天数: 2 天

发表于 2024-7-21 08:44:16 | 显示全部楼层   山东省潍坊市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表