因此,我正在教会我们有一个任务是找到之间的时间差从阅读存储器和读取高速缓存。我们必须做到这一点通过创建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业绩计数 但据我理解这些指示返回系统的时间不需要的时间循环,以完成。有没有办法实际上做什么我想要什么?我需要考虑的另一种方式?

此外,以从中读取的不同登记册第二循环(一个不会阅读,从高速缓存)是这"确定"如果我给各种"章"指示?或者我完全关闭基地在这里?

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

有帮助吗?

解决方案

阅读从高速缓存。有一个循环,其内容从相同的(或者非常相似的)存储地址:

  • 你第一次读从该地址,值得记忆的地址(和从其他附近存储地址)将移动进入缓存
  • 时间你读这 地址的价值已经缓和,所以你正在读从高速缓存。

阅读非缓存,有一个循环,其内容从许多非常不同(即此外,除了于超高速缓冲存储器大小)存储的地址。


来回答你的第二个问题:

  • 你正在做的与ecx和jnz看起来确定(我不知道准确性/敏感你的计时器是的,但是你可能想要回路超过100次)

  • mov eax, eax 是不是"读存储器"...这是一个没有作,其中移动eax入eax.相反,我认为,MASM语法用于从存储器读取的是更多的东西喜欢 mov eax,[esi] ("阅读,从存储位置的地址载于 esi")

  • 根据什么O/S你使用的你必须从中读取存储器地址,实际存在和可读。在窗户,例如,应用程序不会允许这样做 mov esi, 0 随后通过 mov eax, [esi] 因为一个应用程序不允许阅读存储器,其地址/位置为零。


来回答你的第三个问题:

timeGetTime,GetTickCount和业绩计数

你提到timeGetTime,GetTickCount和业绩计数意味着你下运行的窗口。

是的,这些返回前时,各决议/精度:例如,GetTickCount有决议的约50毫秒,因此它失败时事件的这最后一小于50毫秒,是不准确的,当时的事件,最后只有50至100毫秒。这就是为什么我说 100 在你 ecx 可能是不够大。

QueryPerformanceCounter 功能可能是最精确的计时器,你有。

使用任何这些计时器作为一个间隔时:

  • 获得时间,在你开始之前向环
  • 获得一次又一次,在你完成的循环
  • 减去这两次:差异是时间间隔

那是正确的,如果我得到的各种"章"指示?

是的我想是这样。我想你可以这样做(当心我不知道/不记得这是否是正确的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是一些增量,相当于大约五分之一的长度块。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top