精易论坛

标题: 【蠢新学汇编】(整数) → 二数/三数/数组 取最大最小 CMOV版 [打印本页]

作者: 笨来无一悟    时间: 2025-4-11 11:55
标题: 【蠢新学汇编】(整数) → 二数/三数/数组 取最大最小 CMOV版
本帖最后由 笨来无一悟 于 2025-4-11 12:00 编辑

如何用最少的代码取出3个整数中最大的一个
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14853251
(出处: 精易论坛)





CMOV指令 比 JCC指令 最少提速百分之25流水线减少分支预测


看了一下之前的 三数 二数 数组 取最大最小 还有优化空间 于是优化了一下


  
子程序名返回值类型公开备 注
三整最大整数型 
参数名类 型参考可空数组备 注
整参数一整数型
整参数二整数型
整参数三整数型
置入代码 ({ 139, 69, 8, 57, 69, 12, 15, 77, 69, 12, 57, 69, 16, 15, 77, 69, 16, 201, 194, 12, 0 })
返回 (0)
' MOV EAX,[EBP+8]
' CMP [EBP+12], EAX
' CMOVGE EAX, [EBP+12]
' CMP [EBP+16], EAX
' CMOVGE EAX, [EBP+16]
' LEAVE
' RET 12
子程序名返回值类型公开备 注
三整最小整数型 
参数名类 型参考可空数组备 注
整参数一整数型
整参数二整数型
整参数三整数型
置入代码 ({ 139, 69, 8, 59, 69, 12, 15, 77, 69, 12, 59, 69, 16, 15, 77, 69, 16, 201, 194, 12, 0 })
返回 (0)
' MOV EAX,[EBP+8]
' CMP EAX,[EBP+12]
' CMOVGE EAX, [EBP+12]
' CMP EAX,[EBP+16]
' CMOVGE EAX, [EBP+16]
' LEAVE
' RET 12
子程序名返回值类型公开备 注
二整最大整数型 
参数名类 型参考可空数组备 注
整参数一整数型
整参数二整数型
置入代码 ({ 139, 69, 8, 57, 69, 12, 15, 77, 69, 12, 201, 194, 8, 0 })
返回 (0)
' MOV EAX,[EBP+8]
' CMP [EBP+12], EAX
' CMOVGE EAX,[EBP+12]
' LEAVE
' RET 8
子程序名返回值类型公开备 注
二整最小整数型 
参数名类 型参考可空数组备 注
整参数一整数型
整参数二整数型
置入代码 ({ 139, 69, 8, 59, 69, 12, 15, 77, 69, 12, 201, 194, 8, 0 })
返回 (0)
' MOV EAX,[EBP+8]
' CMP EAX, [EBP+12]
' CMOVGE EAX, [EBP+12]
' LEAVE
' RET 8
子程序名返回值类型公开备 注
最大整数整数型 
参数名类 型参考可空数组备 注
整数数组整数型
置入代码 ({ 139, 117, 8, 139, 54, 131, 198, 4, 139, 14, 133, 201, 116, 13, 139, 4, 142, 59, 4, 142, 15, 78, 4, 142, 73, 117, 246, 201, 194, 4, 0 })
返回 (0)
' MOV ESI,[EBP+8]
' MOV ESI,[ESI]
' ADD ESI,4
' MOV ECX,[ESI]
' TEST ECX,ECX
' JE 退出
' MOV EAX,[ESI+ECX*4]
' 循环:
' CMP EAX,[ESI+ECX*4]
' CMOVLE EAX,[ESI+ECX*4]
' DEC ECX
' JNE 循环
' 退出:
' LEAVE
' RET 4
子程序名返回值类型公开备 注
最小整数整数型 
参数名类 型参考可空数组备 注
整数数组整数型
置入代码 ({ 139, 117, 8, 139, 54, 131, 198, 4, 139, 14, 133, 201, 116, 13, 139, 4, 142, 59, 4, 142, 15, 77, 4, 142, 73, 117, 246, 201, 194, 4, 0 })
返回 (0)
' MOV ESI,[EBP+8]
' MOV ESI,[ESI]
' ADD ESI,4
' MOV ECX,[ESI]
' TEST ECX,ECX
' JE 退出
' MOV EAX,[ESI+ECX*4]
' 循环:
' CMP EAX,[ESI+ECX*4]
' CMOVGE EAX,[ESI+ECX*4]
' DEC ECX
' JNE 循环
' 退出:
' LEAVE
' RET 4



其中 CMOVLE 改做 CMOVL CMOVGE 改做 CMOVG 也是一样的效果
[groupid=227]热心网友[/groupid]
作者: quary    时间: 2025-4-11 13:42
谢谢楼主分享!好人一生平安!!!
作者: pipicool    时间: 2025-4-11 14:46
学习一下
作者: 神一样的人猫腻    时间: 2025-4-11 15:26
感谢分享
作者: 1184798949    时间: 2025-4-11 17:22
感谢分享
作者: 杨明煜    时间: 2025-4-11 17:45
学习进步!......
作者: 亿万    时间: 2025-4-11 20:27
感谢分享
作者: wh1234567    时间: 2025-4-12 00:11
老师写个打印机墨水切换例子吧
作者: renhe2018    时间: 2025-4-12 00:22
不错,值得学一学。
作者: 豆豆灰常开心    时间: 2025-4-12 07:09
感谢楼主分享!
作者: 查过    时间: 2025-4-12 07:13
下个学习一下
作者: year1970    时间: 2025-4-12 09:12
感谢分享
作者: 胖子葛格    时间: 2025-4-12 09:46
感谢大神分享~!




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