2017-05-16 374 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緩存這對對準不敏感。在某些情況下,這種優化甚至可能是一種悲觀,尤其是當循環執行次數很少時。

相關問題