![]() |
#2
zklhp2011-11-23 12:09
|
;作者: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工程文件:
只有本站会员才能查看附件,请 登录
结束。。