2017-05-16 324 views
1

我想了解由编译器完成的x64程序集优化。“nop dword ptr [rax + rax]”x64汇编指令是做什么的?

我编译了一个小的C++项目,编号为Release,在Windows 8.1上使用Visual Studio 2008 SP1 IDE编译。

而行的一个包含下面的汇编代码:

B8 31 00 00 00 mov   eax,31h 
0F 1F 44 00 00 nop   dword ptr [rax+rax] 

这里是截图:

enter image description here

据我所知nop本身是do nothing,但我我从来没有见过这样的操作数。

有人可以解释它是做什么的?

+4

它是一个多字节的NOP。指令设置参考解释了这个:http://www.felixcloutier.com/x86/NOP.html –

+0

@MichaelPetch:谢谢。只是好奇,在'Release'版本中添加该指令的目的是什么? – c00000fd

+3

通常用于对齐。通常你会在循环之前看到它们在16或32字节的边界上对齐(16通常是默认值)。这可以改善循环的性能。 –

回答

0

正如在注释中指出的那样,当该指令是循环中的第一条指令时,通常用于将后续指令对齐到16字节边界的位置是multi-byte NOP

这样的对齐可以帮助取指令带宽,因为指令取指通常以16字节为单位发生,因此对齐循环的顶端给出了解码发生时没有瓶颈的最大机会。

这种对准的重要性可以说是较不重要的比以前,与引进的循环缓冲器UOP缓存这对对准不敏感。在某些情况下,这种优化甚至可能是一种悲观,尤其是当循环执行次数很少时。

相关问题