所以我正在学习汇编,我们有一个任务是找到从内存读取和从缓存读取之间的时间差。我们必须通过创建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”指令,那么从第二个循环中的不同寄存器(不从缓存读取的那个)中读取是否可以?还是我完全不在这里?
对不起所有这些问题,但再次感谢您的帮助。
答案 0 :(得分:7)
从缓存中读取。有一个从相同(或非常相似)的内存地址读取的循环:
要读取未缓存的内存,请设置一个循环,该循环可以读取许多非常不同的内容(即,比缓存大小更远的内存)。
回答你的第二个问题:
你用ecx和jnz做的事情看起来不错(我不知道你的计时器有多准确/敏感,但你可能想要循环超过100次)
mov eax, eax
不是“读取内存”......它是一个无操作,它将eax移动到eax中。相反,我认为用于从内存中读取的MASM语法更像是mov eax,[esi]
(“从内容位置读取,其地址包含在esi
中”)
根据您正在使用的操作系统,您必须从实际存在且可读的内存地址中读取。例如,在Windows上,不允许应用程序执行mov esi, 0
后跟mov eax, [esi]
,因为不允许应用程序读取地址/位置为零的内存。
回答你的第三个问题:
timeGetTime,GetTickCount和Performance Counter
您提及timeGetTime,GetTickCount和Performance Counter意味着您在Windows下运行。
是的,它们将当前时间返回到各种分辨率/精度:例如,GetTickCount具有大约50毫秒的分辨率,因此它无法计时持续时间少于50毫秒的事件,在仅仅持续时间事件时不准确50-100毫秒。这就是为什么我说100
ecx
可能不够大。
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是一些增量,大约相当于大块长度的五分之一。