当前位置: 代码迷 >> 汇编语言 >> 问一下子,win32汇编的运算。
  详细解决方案

问一下子,win32汇编的运算。

热度:177   发布时间:2016-05-02 04:43:12.0
问一下,win32汇编的运算。。。
刚学win32汇编,看老罗的书,看到Windows时间,计时器这里,书里有一段代码,是关于运算的,计算时间间隔的,看不懂那些指令。。
.data
           dqTickCounter1 dq ?      ;时间点1的计数值
           dqTickCounter2 dq ?      ;时间点2的计数值
           dqFreq         dq ?      ;计数精度
           dqTime         dq ?      ;时间间隔
           dwlm           dd 100000 ;常数
.code
           invoke  QueryPerformanceCounter,addr dqTickCounter1 ;时间点1
           ...
           invoke  QueryPerformanceCounter,addr dqTickCounter2 ;时间点2
           invoke  QueryPerformanceFrequence,addr dqFreq
           mov     eax,dword ptr dqTickCounter1
           mov     edx,dword ptr dqTickCounter1+4
           sub     dword prt dqTickCounter2,eax
           sub     dword ptr dqTickCounter2+4,edx
           finit
           fild    dqFreq
           fild    dqTickCounter2
           fimul   dwlm    ;乘以1000000
           fdivr
           fistp   dqTime   ;dqtime中的64位值就是时间间隔(以微秒为单位)


那个sub指令我懂是减,但后面那两句不太理解,为什么dword prt dqTickCounter2,还有下一句的
+4??还有下面那些finit,fild是什么指令。。望大神讲解一下,或者能给个有关一系列指令的文档什么的,可以看。。。老罗这本书没解释那些指令= = 
------解决方案--------------------
因为dqTickCounter1、dqTickCounter2是qword类型(64位),用eax、edx两次访问它的低、高32位部分就需要强制类型转换为dword。这部分就是做dqTickCounter2=dqTickCounter2-dqTickCounter1
浮点运算部分就是dqTickCounter2*1000000/dqFreq。
dqTickCounter1、dqTickCounter2是计数值,dqFreq是计算频率(单位为Hz),(dqTickCounter2-dqTickCounter1)/dqFreq就是秒数,再乘以一百万就是微秒数。

------解决方案--------------------
dqFreq是计频率(单位为Hz)

------解决方案--------------------
64位数,先取低32位,再取高32位。不过程序中:
           sub     dword prt dqTickCounter2,eax
           sub     dword ptr dqTickCounter2+4,edx
这个有一些问题,应该是:
           sub     dword prt dqTickCounter2,eax
           sbb     dword ptr dqTickCounter2+4,edx
高32位减应该带借位减,因为低32位减可能产生借位。

------解决方案--------------------
也可能是印刷问题。
sub,add,div这些是整数运算,fadd,fsub,fdiv是浮点运算,差别是运算范围和精度,对你的例子,(dqTickCounter2-dqTickCounter1)*1000000/dqFreq的结果是微秒,如果做整数运算的话误差就比较大了,能差将近一秒,所以例子里面用浮点运算。

  相关解决方案