???? 本來(lái)沒什么好寫的,因?yàn)檫@實(shí)在是太簡(jiǎn)單了。只有一條指令。但即使是一條指令,在易里面也不是容易的。
?
??? 在C里面 可以用
????__asm?{
????????RDTSC
????};
????它的內(nèi)容全部保存在 EAX,EDX中(EDX)是高位。 也就是說是一個(gè)長(zhǎng)整數(shù)了。
?
?? 在易里面 可以用置入代碼。先寫了一個(gè)易語(yǔ)言的返回值為長(zhǎng)整數(shù)的函數(shù),然后編譯??纯此臋C(jī)器碼。
????????????00403232?? mov???????? edx,0
????????????00403237?? mov???????? eax,64h
????????????00403242?? mov???????? esp,ebp
????????????00403244?? pop???????? ebp
????很好,它也是通過 EDX:EAX 返回的。這下不用我返回值了。不要奇怪。易語(yǔ)言生成的機(jī)器碼效率就是這么的不行,我沒有定義局部變量 但 "mov???????? esp,ebp"這條指令還是出現(xiàn)了。
剩下的好辦,寫個(gè)匯編,編譯好。取機(jī)器碼。然后填進(jìn)去就是。代碼如下:
????????????00401357 0F31???????????????????? rdtsc
????????????00401359 89EC???????????????????? mov???? esp,ebp
????????????0040135B 5D?????????????????????? pop???? ebp
????????????0040135C C3?????????????????????? ret
因?yàn)?易的返回長(zhǎng)整數(shù)和 rdstc都是用 EDX:EAX的。所以無(wú)須操心了。ret返回就可以了。
生成的機(jī)器碼是 15, 49, 137, 236, 93, 195 。置入代碼寫進(jìn)去,
?
????會(huì)編譯不過。不過不用擔(dān)心。在后面加入一個(gè) 返回(0) 這里是執(zhí)行不到的。欺騙一下易編譯器而已。這樣一個(gè)取CPU時(shí)間戳的函數(shù)就寫出來(lái)了。
?
.子程序 取CPU時(shí)間戳, 長(zhǎng)整數(shù)型, 公開, 取得CPU經(jīng)過的時(shí)鐘周期數(shù)
????置入代碼 ({ 15, 49, 137, 236, 93, 195 })
????返回 (0)