MASM32内存位置

时间:2009-02-15 00:44:45

标签: assembly x86 masm32

我正在尝试使用masm32程序集从主内存中读取,为了做到这一点,我创建了(如前面在我的另一个问题的答案中建议的那样)一个包含大大分离的内存位置的数组(为了避免从缓存中读取)。 我已设法创建数组并将其读取,但是,我有一个问题。我已经测试过的这个数组正在处理我给它的数据(即数字),一切正常。但我需要内存位置,我找不到任何地图或对它们的引用。我的意思是我需要这样的东西:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

但不是使用数字我应该使用相应的内存位置保留字。但是我找不到它们(或者甚至不知道还有什么要找。


修改

让我检查一下是否正确,你告诉我,我可以(而不是使用数组使用中间所有空格的变量,以强制从主内存读取权利?

2 个答案:

答案 0 :(得分:0)

这是一个(连续的)字节数组,如你所说:

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:多个尺寸的连续读取

答案 1 :(得分:0)

汇编中的间接内存访问

要将数组中的字节视为内存地址,您需要将它们加载到可用作基址的寄存器中,然后访问寄存器指向的内存:

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 work of Larry McVoy and Carl Staelin中有一些经过深思熟虑的技巧。