有人可以解释为什么只使用一个结果时连续调用GetTickCount三次吗?

这不仅仅是装配的全部功能,而是多次具有GetTickCount的部分。 我认为谁不会这样做是人为的编程错误? 是某种优化技巧还是某种编译器搞砸了?

下面的输出来自OllyDbg

00412EB0  /$ 81EC F4010000  SUB ESP,1F4
00412EB6  |. 53             PUSH EBX
00412EB7  |. 55             PUSH EBP
00412EB8  |. 56             PUSH ESI
00412EB9  |. 8B35 14B24D00  MOV ESI,DWORD PTR DS:[<&KERNEL32.GetTick>;  kernel32.GetTickCount
00412EBF  |. 57             PUSH EDI
00412EC0  |. FFD6           CALL ESI                                 ; [GetTickCount
00412EC2  |. FFD6           CALL ESI                                 ; [GetTickCount
00412EC4  |. FFD6           CALL ESI                                 ; [GetTickCount
00412EC6  |. 8BC8           MOV ECX,EAX
00412EC8  |. B8 CDCCCCCC    MOV EAX,CCCCCCCD
00412ECD  |. F7E1           MUL ECX
00412ECF  |. C1EA 03        SHR EDX,3
00412ED2  |. 895424 14      MOV DWORD PTR SS:[ESP+14],EDX
00412ED6  |. FFD6           CALL ESI                                 ; [GetTickCount
00412ED8  |. FFD6           CALL ESI                                 ; [GetTickCount
00412EDA  |. FFD6           CALL ESI                                 ; [GetTickCount
00412EDC  |. 8BD0           MOV EDX,EAX
00412EDE  |. B8 CDCCCCCC    MOV EAX,CCCCCCCD
00412EE3  |. F7E2           MUL EDX
00412EE5  |. C1EA 03        SHR EDX,3
00412EE8  |. 895424 1C      MOV DWORD PTR SS:[ESP+1C],EDX
00412EEC  |. FFD6           CALL ESI                                 ; [GetTickCount
00412EEE  |. 8B0D A87C4300  MOV ECX,DWORD PTR DS:[437CA8]
00412EF4  |. 33C0           XOR EAX,EAX
00412EF6  |. 3BC8           CMP ECX,EAX
00412EF8  |. 894424 18      MOV DWORD PTR SS:[ESP+18],EAX
00412EFC  |. A3 20594D00    MOV DWORD PTR DS:[4D5920],EAX

Hex-Ray的反编译结果

  DWORD GetTickCountDivideddBy10; // [sp+14h] [bp-1F0h]@1
  unsigned int v41; // [sp+18h] [bp-1ECh]@1
  DWORD GetTickCountDividedBy10; // [sp+1Ch] [bp-1E8h]@1

  GetTickCount();
  GetTickCount();
  GetTickCountDivideddBy10 = GetTickCount() / 0xA;
  GetTickCount();
  GetTickCount();
  GetTickCountDividedBy10 = GetTickCount() / 0xA;
  GetTickCount();
  v41 = 0;
  dword_4D5920 = 0;

可执行文件: http : //www.mediafire.com/download/qnqb00q4yk4kq6v/

  ask by user3435580 translate from so

本文未有回复,本站智能推荐:

1回复

如何使用gettickcount()每隔x间隔时间在switch中调用case

我有此开关,我需要在C ++中使用gettickcount()每隔x秒执行一次case。 在此先感谢,对不起我的西班牙文:D
2回复

使用C ++挂钩GetTickCount

我不擅长C ++,更像是C#和PHP人。 我被分配了一个项目,要求我使用GetTickCount并挂钩到一个应用程序。 我需要一些帮助,因为它没有按计划工作......这是挂钩的代码,我知道它有效,因为我以前在项目中使用它。 我唯一不确定的是它的GetTickCount部分。 我试过Ge
1回复

在Delphi中使用getTickCount创建等待

我正在创建一个需要运行的程序,然后等待10分钟,然后继续 我遇到的问题是,当我到达if语句时,它将检查它是否为真,并继续执行该操作,以使其停留并等待直到该语句为真?
6回复

GetTickCount函数

我有一个关于GetTickCount函数的问题,我在代码中有两个对此函数的调用,它们之间有多个命令,两个调用中的函数返回相同的计数。 即 var1和var2具有相同的值。 有人可以帮忙吗?
1回复

使用Python和C ++的GetTickCount64错误

我试图将python模块嵌入到较大的c ++程序中(相关详细信息:VS2005,WinXP Python 2.7)。 当我创建一个包含“ python.h”的类的新实例并尝试运行我的程序时,出现错误消息“过程入口点GetTickCount64不能位于动态链接库KERNEL32.ll中”。 我
1回复

GetTickCount()用于int main中的多个函数

我试图在一个非常大的代码段中分别使用GetTickCount()对多个函数进行计时,以找出瓶颈的确切位置。 我可以成功地计时整个代码。 我要努力解决的是在哪里添加计时功能以测量每个功能的时间。 我在定义函数或定义函数时或在调用函数的main()中插入计时器吗? 任何帮助将非常感激。 谢
2回复

Ruby中的Windows GetTickCount

是否可以在Ruby中获取当前的Windows TickCount? ( http://msdn.microsoft.com/en-us/library/ms724408%28v=vs.85%29.aspx )
1回复

找不到GetTickCount()标识符

我不确定为什么在尝试编译此代码时会出现错误“找不到GetClickCount标识符”。 (我与GetClickCount64遇到相同的错误)。 我希望有人能够解释。 我对这个问题的大多数询问似乎都表明代码缺少#include,但这显然不是我的问题。
3回复

为什么GetTickCount和timeGetTime具有不同的分辨率?

默认情况下,GetTickCount和timeGetTime具有相同的分辨率-15.625ms,但是在我调用timeBeginPeriod(1)之后,GetTickCount仍然每15.625 ms更新一次,而timeGetTime却每1ms更新一次,为什么呢? 在等待计时器中的错误?
3回复

最少组装或编译至少三个值

我正在查看GCC-4.8为x86_64生成的代码,并想知道是否有更好(更快)的方法来计算三个值的最小值。 这是Python的集合模块的摘录,它计算m , rightindex+1和leftindex的最小值: GCC使用CMOV生成依赖于序列的依赖代码: 是否有更快的代码可