2009-02-08 63 views
5

所以我正在教大会,我们有一个任务是找到从内存读取和从缓存中读取之间的时间差。我们必须通过创建2个循环并计时来做到这一点。 (一个从主内存中读取,另一个从缓存中读取)。事情是,我不知道,也找不到任何告诉我如何从缓存或主内存读取的任何内容= /。你们能帮我吗?我在MASM32中做这个。我了解如何使环路和最良好的汇编语言,但我就是不能让它读=/我如何故意从主内存读取缓存?


编辑:

我有一个问题,我已经做到了这一点。 ..

mov ecx, 100 ;loop 100 times 
xor eax, eax ;set eax to 0 
_label: 
mov eax, eax ;according to me this is read memory is that good? 
dec ecx ;dec loop 
jnz _label ;if still not equal to 0 goes again to _label 

......那会好吗?


编辑2:

那好吧,我不打算撬,我很欣赏你的帮助,我只是有一个问题,因为这是两个回路我必须做的。我需要比较它们,我一直在寻找一个计时器指令,但我还没有找到任何我找到的只有:timeGetTime,GetTickCount性能计数器但据我了解这些说明返回系统时间不是循环完成所需的时间。有没有办法实际做我想要的?或者我需要考虑另一种方式?

此外,要从第二个循环中的不同寄存器读取(不从缓存中读取的),如果我给出各种“mov”指令,可以吗?还是我完全脱离基地?

对不起所有这些问题,但再次感谢您的帮助。

回答

7

从缓存读取。有一个循环,从相同(或非常相似)的内存地址上写着:

  • 你从该地址读取的第一次,从内存地址的值(和其他邻近存储器地址)将被转移到缓存
  • 下一个当你读取该相同的地址,值已被缓存,所以你正在读取缓存。

要读取未高速缓存的内存,有一个从许多非常不同(即高于缓存大小)内存地址读取的循环。


要回答你的第二个问题:

  • 的事情你与ECX做和JNZ看起来OK(我不知道如何准确/敏感的计时器,但你可能想循环超过100次)

  • mov eax, eax不是“读取内存”...它是一个无操作,它将eax移入eax中。相反,我认为,从内存中读取MASM语法的东西更像是mov eax,[esi](“从存储器位置,其地址包含在esi阅读”)

  • 根据O/S你使用,你有什么必须从实际存在且可读的内存地址读取。例如,在Windows上,应用程序将不被允许执行mov esi, 0,然后执行mov eax, [esi],因为应用程序不允许读取地址/位置为零的存储器。


要回答你的第三个问题:

timeGetTime,GetTickCount的和性能计数器

你提timeGetTime,GetTickCount的和性能计数器意味着你在Windows下运行。

是的,这些返回当前时间,以各种分辨率/精度:例如,GetTickCount具有约50毫秒的分辨率,所以它无法对持续少于50毫秒的事件计时,对计时事件持续时间不准确只有50-100毫秒。这就是为什么我说你的ecx中的100可能不够大。

QueryPerformanceCounter函数可能是您拥有的最准确的计时器。

要使用这些定时器作为间隔定时器:

  • 获取的时候,你开始循环
  • 之前再次获取的时候,你完成循环
  • 减去这两个时间后:区别在于时间间隔

如果我给出各种“mov”指令可以吗?

是的,我认为是。我想你可以做这样的(注意我不知道/不记得这是否是从名称存储位置读取正确的语法MASM)...

mov eax,[memory1] 
mov eax,[memory2] 
mov eax,[memory3] 
mov eax,[memory4] 
mov eax,[memory5] 

...其中memory1通过memory5是数据段中广泛分布的全局变量的地址。

或者,你可以做...

mov eax,[esi] 
add esi,edx 
mov eax,[esi] 
add esi,edx 
mov eax,[esi] 
add esi,edx 
mov eax,[esi] 
add esi,edx 
mov eax,[esi] 

...其中ESI指向的内存块长的底部,和EDX是一些增量仅此长度的五分之一等于的大块。

相关问题