正如您所说,这是一个(连续)字节数组:
my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6
这是一个占用 10 MB 的变量(相对于 CPU 缓存来说很大):
wasted_space BYTE 10485760 DUP(?)
这里有几个变量,它们之间有很多浪费的空间:
my_var_1 db 5
spacer_1 BYTE 10485760 DUP(?)
my_var_2 db 2
spacer_2 BYTE 10485760 DUP(?)
my_var_3 db 8
spacer_3 BYTE 10485760 DUP(?)
my_var_4 db 9
spacer_4 BYTE 10485760 DUP(?)
my_var_5 db 1
spacer_5 BYTE 10485760 DUP(?)
my_var_6 db 7
spacer_6 BYTE 10485760 DUP(?)
my_var_7 db 3
spacer_7 BYTE 10485760 DUP(?)
my_var_8 db 0
spacer_8 BYTE 10485760 DUP(?)
my_var_9 db 4
spacer_8 BYTE 10485760 DUP(?)
my_var_10 db 6
这(在数据段中创建变量)是获取一些数据内存地址的一种方法(变量不包含地址......相反,变量位于地址处)。
获取内存地址的另一种方法是调用 O/S API,它从堆中分配内存并返回分配的内存的地址,例如 HeapAlloc 或 VirtualAlloc API。
我不知道你为什么在 ASM 中这样做(学习汇编除外)。如果要学习缓存,我原以为您也可以使用 C 来做到这一点(而且更容易)。
无论如何,我对缓存很好奇:多少空间足以导致缓存未命中?需要多少个不同的变量才能开始导致未命中(假设缓存是拆分的,因此可以包含多个(但只有少数)宽间距的内存缓存)?
显然,多年来,它(缓存)已成为一个复杂的主题。http://lwn.net/Articles/252125/是一篇链接自维基百科的文章。本文包括一些图表,例如图 3.11: Sequential Read for Multiple Sizes。