开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 903|回复: 30
收起左侧

[易语言纯源码] 【蠢新学汇编】量角器 再次优化

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

小数版本一般用不到 有人反馈上一个版本 尾巴的大于180等于360减...不够纯汇编(不完美) 这个版本又改了改 测速循环12345678次 整数版本比小数版本快120毫秒左右 小数版本比上一个小数版本快20到30毫秒 还有更快的写法 但是调用起来不方便 直接用上上个版本的atan2 两个斜边分开计算再做差取绝对值 再判断是不是大于180大于就360减...麻烦了一点 追求更快的可以用更麻烦的那份
  
子程序名返回值类型公开备 注
量角器双精度小数型 SSE2 + X87
参数名类 型参考可空数组备 注
起点横整数型ebp+08
起点纵整数型ebp+12
角心横整数型ebp+16
角心纵整数型ebp+20
落点横整数型ebp+24
落点纵整数型ebp+28
置入代码 ({ 131, 236, 24, 54, 199, 69, 252, 220, 165, 76, 64, 54, 199, 69, 248, 248, 193, 99, 26, 139, 69, 8, 43, 69, 16, 137, 69, 8, 139, 93, 12, 43, 93, 20, 137, 93, 12, 139, 77, 24, 43, 77, 16, 137, 77, 24, 139, 85, 28, 43, 85, 20, 137, 85, 28, 54, 219, 69, 8, 54, 219, 69, 12, 217, 243, 54, 220, 77, 248, 54, 221, 93, 240, 54, 219, 69, 24, 54, 219, 69, 28, 217, 243, 54, 220, 77, 248, 54, 221, 93, 232, 54, 221, 69, 240, 54, 221, 69, 232, 222, 233, 217, 225, 54, 221, 93, 248, 54, 242, 15, 16, 69, 248, 184, 180, 0, 0, 0, 242, 15, 42, 200, 102, 15, 46, 200, 114, 2, 235, 17, 184, 104, 1, 0, 0, 242, 15, 42, 208, 242, 15, 92, 208, 242, 15, 16, 194, 54, 242, 15, 17, 69, 248, 139, 85, 252, 139, 69, 248, 131, 196, 24, 201, 194, 24, 0 })
返回 (0)
' ;开辟三个双精度局部变量 加载 180÷π到 第一个局部变量
' sub esp, 24
' mov dword ptr ss:[ebp-0x04], 0x404CA5DC
' mov dword ptr ss:[ebp-0x08], 0x1A63C1F8
' ;起点横 = 起点横 - 角心横
' mov eax, dword ptr ss:[ebp+0x08]
' sub eax, dword ptr ss:[ebp+0x10]
' mov dword ptr ss:[ebp+0x08], eax
' ;起点纵 = 起点纵 - 角心纵
' mov ebx, dword ptr ss:[ebp+0x0C]
' sub ebx, dword ptr ss:[ebp+0x14]
' mov dword ptr ss:[ebp+0x0C], ebx
' ;落点横 = 落点横 - 角心横
' mov ecx, dword ptr ss:[ebp+0x18]
' sub ecx, dword ptr ss:[ebp+0x10]
' mov dword ptr ss:[ebp+0x18], ecx
' ;落点纵 = 落点纵 - 角心纵
' mov edx, dword ptr ss:[ebp+0x1C]
' sub edx, dword ptr ss:[ebp+0x14]
' mov dword ptr ss:[ebp+0x1C], edx
' ;起点横纵反正切 方向角 -180 到 180
' fild dword ptr ss:[ebp+0x08]
' fild dword ptr ss:[ebp+0x0C]
' fpatan
' fmul qword ptr ss:[ebp-0x08]
' fstp qword ptr ss:[ebp-0x10]
' ;落点横纵反正切 方向角 -180 到 180
' fild dword ptr ss:[ebp+0x18]
' fild dword ptr ss:[ebp+0x1C]
' fpatan
' fmul qword ptr ss:[ebp-0x08]
' fstp qword ptr ss:[ebp-0x18]
' ;起落方向角 做差 取绝对值
' fld qword ptr ss:[ebp-0x10]
' fld qword ptr ss:[ebp-0x18]
' fsubp st1, st0
' fabs
' fstp qword ptr ss:[ebp-0x08]
' ;角度 > 180 则 角度 = 360 - 角度 JB/JC→DY
' movsd xmm0, qword ptr ss:[ebp-0x08]
' mov eax, 180
' cvtsi2sd xmm1, eax
' ucomisd xmm1, xmm0
' jb DY
' jmp end
' DY:
' mov eax, 360
' cvtsi2sd xmm2, eax
' subsd xmm2, xmm0
' movsd xmm0, xmm2
' end:
' movsd qword ptr ss:[ebp-0x08], xmm0
' ;[ebp-8]位置的双精度结果拆分到edx与eax用作返回
' mov edx, dword ptr ss:[ebp-0x04]
' mov eax, dword ptr ss:[ebp-0x08]
' add esp, 24
' leave
' ret 24
子程序名返回值类型公开备 注
量角器_小数双精度小数型 SSE2 + X87
参数名类 型参考可空数组备 注
起点横双精度小数型EBP+08
起点纵双精度小数型EBP+16
角心横双精度小数型EBP+24
角心纵双精度小数型EBP+32
落点横双精度小数型EBP+40
落点纵双精度小数型EBP+48
变量名类 型静态数组备 注
角度双精度小数型 
置入代码 ({ 54, 199, 69, 252, 220, 165, 76, 64, 54, 199, 69, 248, 248, 193, 99, 26, 54, 242, 15, 16, 69, 8, 54, 242, 15, 92, 69, 24, 54, 242, 15, 17, 69, 8, 54, 242, 15, 16, 77, 16, 54, 242, 15, 92, 77, 32, 54, 242, 15, 17, 77, 16, 54, 242, 15, 16, 85, 40, 54, 242, 15, 92, 85, 24, 54, 242, 15, 17, 85, 40, 54, 242, 15, 16, 93, 48, 54, 242, 15, 92, 93, 32, 54, 242, 15, 17, 93, 48, 54, 221, 69, 8, 54, 221, 69, 16, 217, 243, 54, 220, 77, 248, 54, 221, 93, 24, 54, 221, 69, 40, 54, 221, 69, 48, 217, 243, 54, 220, 77, 248, 54, 221, 93, 32, 54, 221, 69, 32, 54, 221, 69, 24, 222, 233, 217, 225, 54, 221, 93, 248, 242, 15, 16, 69, 248, 184, 180, 0, 0, 0, 242, 15, 42, 200, 102, 15, 46, 200, 114, 2, 235, 17, 184, 104, 1, 0, 0, 242, 15, 42, 208, 242, 15, 92, 208, 242, 15, 16, 194, 242, 15, 17, 69, 248 })
返回 (角度)
' ;加载 180÷π到 局部变量 角度
' mov dword ptr ss:[ebp-0x04], 0x404CA5DC
' mov dword ptr ss:[ebp-0x08], 0x1A63C1F8
' ;起点横 = 起点横 - 角心横
' movsd xmm0, qword ptr ss:[ebp+0x08]
' subsd xmm0, qword ptr ss:[ebp+0x18]
' movsd qword ptr ss:[ebp+0x08], xmm0
' ;起点纵 = 起点纵 - 角心纵
' movsd xmm1, qword ptr ss:[ebp+0x10]
' subsd xmm1, qword ptr ss:[ebp+0x20]
' movsd qword ptr ss:[ebp+0x10], xmm1
' ;落点横 = 落点横 - 角心横
' movsd xmm2, qword ptr ss:[ebp+0x28]
' subsd xmm2, qword ptr ss:[ebp+0x18]
' movsd qword ptr ss:[ebp+0x28], xmm2
' ;落点纵 = 落点纵 - 角心纵
' movsd xmm3, qword ptr ss:[ebp+0x30]
' subsd xmm3, qword ptr ss:[ebp+0x20]
' movsd qword ptr ss:[ebp+0x30], xmm3
' ;起点横纵反正切 方向角 -180 到 180
' fld qword ptr ss:[ebp+0x08]
' fld qword ptr ss:[ebp+0x10]
' fpatan
' fmul qword ptr ss:[ebp-0x08]
' fstp qword ptr ss:[ebp+0x18]
' ;落点横纵反正切 方向角 -180 到 180
' fld qword ptr ss:[ebp+0x28]
' fld qword ptr ss:[ebp+0x30]
' fpatan
' fmul qword ptr ss:[ebp-0x08]
' fstp qword ptr ss:[ebp+0x20]
' ;起落方向角 做差 取绝对值
' fld qword ptr ss:[ebp+0x20]
' fld qword ptr ss:[ebp+0x18]
' fsubp st1, st0
' fabs
' fstp qword ptr ss:[ebp-0x08]
' ;角度 > 180 则 角度 = 360 - 角度 JB/JC→DY
' movsd xmm0, qword ptr ss:[ebp-0x08]
' mov eax, 180
' cvtsi2sd xmm1, eax
' ucomisd xmm1, xmm0
' jb DY
' jmp end
' DY:
' mov eax, 360
' cvtsi2sd xmm2, eax
' subsd xmm2, xmm0
' movsd xmm0, xmm2
' end:
' movsd qword ptr ss:[ebp-0x08], xmm0


点评

为什么分开调用Atan2可以更快呢 因为量角器的实际应用 几乎都是固定两个点 移动一个点 大大的减少了重复计算 所以更快 但是调用起来相对麻烦   贵州省毕节市  发表于 2024-6-18 04:57

评分

参与人数 5好评 +1 精币 +6 收起 理由
wa690602724 + 1 感谢分享,很给力!~
kyo9766 + 1 感谢分享,很给力!~
財財 + 1 感谢分享,很给力!~
inat + 1 + 2 感谢分享,很给力!~
多多帅吧 + 1 感谢发布原创作品,精易因你更精彩!

查看全部评分


结帖率:60% (3/5)

签到天数: 17 天

发表于 2024-7-3 01:49:40 | 显示全部楼层   甘肃省兰州市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:0% (0/5)
发表于 2024-6-25 10:40:59 | 显示全部楼层   辽宁省丹东市
图文并茂,学习起来更容易。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-6-25 06:30:05 | 显示全部楼层   福建省泉州市
图文并茂,学习起来更容易。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-6-23 08:30:04 | 显示全部楼层   福建省泉州市
很喜欢这种深入浅出的教学方式。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-6-22 12:30:05 | 显示全部楼层   福建省泉州市
看完这个,收获很多。
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-6-21 10:30:07 | 显示全部楼层   福建省泉州市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2024-6-20 12:30:07 | 显示全部楼层   福建省泉州市
通俗易懂,没有废话,点个赞!
回复 支持 反对

使用道具 举报

结帖率:98% (46/47)

签到天数: 26 天

发表于 2024-6-20 07:31:28 | 显示全部楼层   山东省青岛市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:98% (103/105)

签到天数: 26 天

发表于 2024-6-20 07:26:42 | 显示全部楼层   山东省青岛市
感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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