Косвенный доступ к памяти в сборке
Чтобы рассматривать байты в массиве как адреса памяти, вам необходимо загрузить их в регистр, который может служить базовым адресом, а затем получить доступ к памяти, указанной регистром:
MOV AX, [MY_ARR+3] ; Element 3 in array, that is 9
MOV BX, [AX] ; Read from that address
О кешах
Обратите внимание, что ваш кэш, вероятно, намного больше, чем диапазон адресов памяти, охватываемых этим массивом, поэтому все будет помещаться в кэш.
Кроме того, учтите, что ваш кеш, вероятно, является ассоциативным, а это означает, что адреса, расположенные очень далеко друг от друга, могут помещаться вместе в кеш, если они не находятся в одинаковых (полных) строках кэша.
Чтобы фактически запустить кеш и гарантировать, что вам придется обращаться к памяти напрямую, вы должны получить доступ (в цикле) к ряду последовательных областей памяти, больших, чем ваш кеш. То есть создать массив размером с ваш кеш. Также примите во внимание, что, возможно, существует несколько уровней кэша (L1, L2, возможно, L3 и далее), поэтому насколько большим вам должно быть, зависит от того, какой кэш вы хотите переполнить.
Я однажды написал программу на языке C для доступа к памяти и кэш-памяти, и с некоторыми статистическими вычислениями и компенсацией накладных расходов при измерении времени (что немаловажно в таких коротких временных масштабах) получил действительно точные результаты ( который можно сделать настолько точным, насколько это необходимо, запустив тест подольше и ожидая снижения стандартного отклонения).
Моя программа, однако, была не самым эффективным способом сделать это, а также не особо намекала на ассоциативность кэша (мне пришлось бы измерять это отдельно, зная схему раскраски). Тем не менее, оба были сделаны довольно эффективно относительно независимым от архитектуры способом с несколькими продуманными уловками в работе SIGMETRICS 2005 Ларри Маквой и Карлом Стейлином .