精易论坛

标题: 【蠢新学汇编】量角器 再次优化 [打印本页]

作者: 笨来无一悟    时间: 2024-6-18 04:43
标题: 【蠢新学汇编】量角器 再次优化
本帖最后由 笨来无一悟 于 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



作者: 查过    时间: 2024-6-18 07:43
感谢分享,很给力!~
作者: 豆豆灰常开心    时间: 2024-6-18 07:48
感谢分享,很给力!~
作者: year1970    时间: 2024-6-18 08:07
感谢分享
作者: bianyuan456    时间: 2024-6-18 08:19
已经顶贴,感谢您对论坛的支持!
作者: 一指温柔    时间: 2024-6-18 09:06
感谢发布原创作品,精易因你更精彩!
作者: 396384183    时间: 2024-6-18 09:50
感谢分享,支持开源!!!
作者: jtucar    时间: 2024-6-18 17:40
感谢分享,很给力!~
作者: asasqwwq    时间: 2024-6-18 17:54
编译成模块后调用,结果错误,相同代码直接使用,结果正确。所以,返回结果是否可以写到参数中?
作者: 笨来无一悟    时间: 2024-6-18 18:19
asasqwwq 发表于 2024-6-18 17:54
编译成模块后调用,结果错误,相同代码直接使用,结果正确。所以,返回结果是否可以写到参数中? ...

经测试一切正常你把你说的不正常的例子发来瞅瞅

量角器_模块.e

3.73 KB, 下载次数: 1, 下载积分: 精币 -2 枚

源码

量角器.zip

1.07 KB, 下载次数: 0, 下载积分: 精币 -2 枚

模块


作者: 夏亿    时间: 2024-6-18 21:56
        感谢分享,很给力!~
作者: 查过    时间: 2024-6-19 07:54
感谢发布原创作品,精易因你更精彩!6666666666666
作者: 豆豆灰常开心    时间: 2024-6-19 07:58
感谢发布原创作品,精易因你更精彩!6666666666666
作者: 一指温柔    时间: 2024-6-19 08:40
支持开源~!感谢分享
作者: please    时间: 2024-6-19 09:36
感谢分享,支持开源!!!
作者: kyo9766    时间: 2024-6-19 15:14
学习一下量角器汇编,感谢分享
作者: 1565030103    时间: 2024-6-19 21:01
本帖最后由 1565030103 于 2024-6-19 21:03 编辑

不要将两种指令集混用,这样会存在惩罚
作者: 查过    时间: 2024-6-20 07:05
全都是大佬~
作者: 豆豆灰常开心    时间: 2024-6-20 07:10
感谢您对论坛的支持!
作者: 查过    时间: 2024-6-20 07:26
感谢您对论坛的支持!
作者: 豆豆灰常开心    时间: 2024-6-20 07:31
感谢分享,很给力!~
作者: qq977352880    时间: 2024-6-20 12:30
通俗易懂,没有废话,点个赞!

作者: qq977352880    时间: 2024-6-21 10:30
感谢分享,很给力!~

作者: qq977352880    时间: 2024-6-22 12:30
看完这个,收获很多。

作者: qq977352880    时间: 2024-6-23 08:30
很喜欢这种深入浅出的教学方式。

作者: qq977352880    时间: 2024-6-25 06:30
图文并茂,学习起来更容易。

作者: pq9999    时间: 2024-6-25 10:40
图文并茂,学习起来更容易。
作者: shaojiecn    时间: 2024-7-3 01:49
感谢分享,很给力!~




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