Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching 使用mov(%rip)、%eax等指令时使用哪个缓存?_Caching_Assembly_X86 - Fatal编程技术网

Caching 使用mov(%rip)、%eax等指令时使用哪个缓存?

Caching 使用mov(%rip)、%eax等指令时使用哪个缓存?,caching,assembly,x86,Caching,Assembly,X86,我查看了x86/i64文档,没有找到他们提到(%rip)使用指令缓存的地方。因此,我不能100%确定情况是否如此 我想知道我是否是对的。如果是这样,我想做的是使用RIP访问4KB缓冲区,因为访问它的代码非常小(好吧,小到足以容纳额外的4000字节)。我知道如何使用g++,但我还没有看到使用cl的方法。这是我非常希望学习的另一件事 使用g++我可以编写如下内容: __asm__ __volatile__ (".align 4 \n\r"

我查看了x86/i64文档,没有找到他们提到(%rip)使用指令缓存的地方。因此,我不能100%确定情况是否如此

我想知道我是否是对的。如果是这样,我想做的是使用RIP访问4KB缓冲区,因为访问它的代码非常小(好吧,小到足以容纳额外的4000字节)。我知道如何使用g++,但我还没有看到使用cl的方法。这是我非常希望学习的另一件事

使用g++我可以编写如下内容:

__asm__ __volatile__ (".align 4                       \n\r"
                      ".big_num:                      \n\r"
                      ".long 0x01020304               \n\r"
                      ".long 0x05060708               \n\r"
                      ".long 0x01020304               \n\r"
                      ".long 0x05060708               \n\r"
                      "movdqa .big_num(%rip), xmm0    \n\r");
在微软的程序中,什么是等效的

__asm {
  mov big_number(%rip), xmm7
  jmp loop
big_number:
  ???
loop:
}
-----更新(2013年1月24日)

实际上,RIP寻址模式仅限于偏移量:

mov offset(%rip), reg
所以这对我没有帮助,因为我需要一个索引,如:

mov offset(%rip, %eax, 4), reg

无论如何,这是不可能的。

据我所知,英特尔手册中的说明和描述,指令缓存用于指令本身(当指令从较远的缓存(L2和L3)以及最终从主存获取时)以及指令内部编码的数据

指令缓存可能会吸收代码中嵌入的一些数据,因为缓存线的粒度为32/64字节。但这可能是无用的,因为mov指令正在访问的数据将通过不同的路径来自数据缓存

总而言之:

  • 一级缓存包含两个独立的部分:一级指令缓存和一级数据缓存
  • 二级缓存是代码和数据的统一缓存
  • L3也统一为L2

若L1 IC和L1 DC都从L2中的同一位置提取数据,那个么L2中的一些表的寿命可能会更长,但仅此而已。您将无法实际将数据移动到一级指令缓存中。

据我所知,指令缓存用于指令本身(当指令从较远的缓存(二级和三级)中提取,最终从主存中提取时)以及指令内部编码的数据

指令缓存可能会吸收代码中嵌入的一些数据,因为缓存线的粒度为32/64字节。但这可能是无用的,因为mov指令正在访问的数据将通过不同的路径来自数据缓存

总而言之:

  • 一级缓存包含两个独立的部分:一级指令缓存和一级数据缓存
  • 二级缓存是代码和数据的统一缓存
  • L3也统一为L2

若L1 IC和L1 DC都从L2中的同一位置提取数据,那个么L2中的一些表的寿命可能会更长,但仅此而已。您将无法实际将数据移动到一级指令缓存中。

最接近您的可能是
\u emit
,但在我看来,这似乎是“错误的”,我建议您使用《英特尔优化指南》第7章中描述的技术:乍一看,我会说这是内存加载,它将通过数据缓存。最接近的可能是
\u emit
,但在我看来,这似乎是“错误的”,我建议使用《英特尔优化指南》第7章中描述的技术:乍一看,我会说这是内存加载,它将通过数据缓存。