【转载】到底什么指令快?什么指令慢?一个小程序可以告诉你。。。(win32h汇编)
;****************************************************************************************************************;作者:zklhp
;Email:zklhp@
;QQ:493165744
;版权所有 转载请保持完整
;****************************************************************************************************************
这个标题不错。。
以前有一些关于指令优化的文章 讲了一些你应该用什么指令而不应该用什么指令的东西 不过现在CPU发展这么快 运算能力在绝大多数情况下已经过剩了 这些东西已经没人提了 不过什么指令快 什么指令慢的问题还是存在的 简单写了个程序来研究这个问题
程序很简单我就不多说了 感兴趣的可以用这个玩意研究研究指令问题。。
代码如下
程序代码:
;MASMPlus 代码模板 - 控制台程序 ;***************************************************************************************************************** ;作者:zklhp ;Email:zklhp@ ;QQ:493165744 ;Last Update:2011.11.22 ;版权所有 转载请保持完整 ;***************************************************************************************************************** .686 .model flat, stdcall option casemap :none include windows.inc include user32.inc include kernel32.inc include masm32.inc include gdi32.inc includelib gdi32.lib includelib user32.lib includelib kernel32.lib includelib masm32.lib includelib msvcrt.lib include macro.asm printf PROTO C lpszFormat_IN:DWORD,var_IN:VARARG .data dwa dd 5 .data? buffer db MAX_PATH dup(?) dwlm dd ? dqOStart LARGE_INTEGER <> dqOEnd LARGE_INTEGER <> dqTStart LARGE_INTEGER <> dqTEnd LARGE_INTEGER <> dqFreq LARGE_INTEGER <> dqTime1 LARGE_INTEGER <> dqTime2 LARGE_INTEGER <> fTimes REAL8 ? .CODE START: ;最高优先级 invoke GetCurrentThread invoke SetThreadPriority,eax,THREAD_PRIORITY_TIME_CRITICAL invoke QueryPerformanceCounter,offset dqOStart ;********************************************************* mov ecx,08000H ;循环32K次 总共是1G个nop哦 @@: ;以32K个nop repeat 08000H nop endm dec ecx jnz @B ;********************************************************* invoke QueryPerformanceCounter,offset dqOEnd invoke QueryPerformanceCounter,offset dqTStart ;********************************************************* mov ecx,08000H ;循环32K次 总共是1G个指令哦哦 @@: ;以32K个 repeat 08000H add eax,1 endm dec ecx jnz @B ;********************************************************* invoke QueryPerformanceCounter,offset dqTEnd invoke QueryPerformanceFrequency,offset dqFreq mov eax,DWORD ptr dqOStart mov edx,DWORD ptr [dqOStart+4] sub DWORD ptr dqOEnd,eax sub DWORD ptr [dqOEnd+4],edx mov eax,DWORD ptr dqTStart mov edx,DWORD ptr [dqTStart+4] sub DWORD ptr dqTEnd,eax sub DWORD ptr [dqTEnd+4],edx mov dwlm,1000 finit fild dqFreq fild dqOEnd fimul dwlm fdivr fistp dqTime1 ;dqTime中的64位值就是时间间隔(以ns为单位) fild dqFreq fild dqTEnd fimul dwlm fdivr fistp dqTime2 ;dqTime中的64位值就是时间间隔(以ns为单位) fild dqTEnd fild dqOEnd fdiv fstp fTimes invoke printf,CTXT('参比测试用时:%lums',0dh,0ah),[dqTime1] invoke printf,CTXT('指令测试用时:%lums',0dh,0ah),[dqTime2] invoke printf,CTXT('相对nop的比值:%f',0dh,0ah),[fTimes] ;暂停显示,回车键关闭 invoke StdIn,addr buffer,sizeof buffer invoke ExitProcess,0 end START
代码+程序+MasmPlus工程文件:
InsBMT.zip
(9.97 KB)
结束。。