Для чтения из кеша. есть цикл, который читает с того же (или очень похожего) адреса памяти:
- При первом чтении с этого адреса значения этого адреса памяти (и другого соседнего адреса памяти) будут перемещены в кэш
- В следующий раз, когда вы читаете с этого того же адреса, значения уже кэшированы, и поэтому вы читаете из кеша.
Чтобы читать не кэшированную память, создайте цикл, который считывает многие, очень разные (то есть, помимо размера кэша) адреса памяти.
Чтобы ответить на ваш второй вопрос:
Вещи, которые вы делаете с ecx и jnz, выглядят нормально (я не знаю, насколько точен / чувствителен ваш таймер, но вы, возможно, захотите выполнить цикл более 100 раз)
mov eax, eax
- это не "чтение памяти" ... это неоперация, которая перемещает eax в eax. Вместо этого я думаю, что синтаксис MASM для чтения из памяти является чем-то вроде mov eax,[esi]
(«чтение из памяти, адрес которой содержится в esi
»)
В зависимости от того, какую операционную систему вы используете, вы должны прочитать адрес памяти, который действительно существует и доступен для чтения. Например, в Windows приложению не разрешено делать mov esi, 0
, за которым следует mov eax, [esi]
, поскольку приложению не разрешено читать память, адрес / местоположение которой равен нулю.
Чтобы ответить на ваш третий вопрос:
timeGetTime, GetTickCount и счетчик производительности
Упоминание 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 - это некоторое приращение, равное примерно одной пятой длины фрагмента.