2017-05-16 2 views
1

컴파일러에서 수행 한 x64 어셈블리 최적화를 이해하려고합니다."nop dword ptr [rax + rax]"x64 어셈블리 명령어의 기능은 무엇입니까?

작은 C++ 프로젝트를 IDE로 빌드하고 Windows 8.1에서는 Release으로 컴파일했습니다.

그리고 선 중 하나

는 다음 어셈블리 코드를 포함 :

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

을 그리고 여기 스크린 샷입니다 : 나는 그 자체로 nopdo nothing 알고 마찬가지로 지금까지

enter image description here

,하지만 난 ' 그런 피연산자를 본적도 없어요.

누군가가 설명 할 수 있습니까?

+4

멀티 바이트 NOP입니다. Set Set 레퍼런스는 다음을 설명합니다 : http://www.felixcloutier.com/x86/NOP.html –

+0

@MichaelPetch : 고마워요. 궁금한 점이 있다면, 그 명령을'Release' 빌드에 추가하는 목적은 무엇입니까? – c00000fd

+3

일반적으로 정렬. 16 또는 32 바이트 경계에 정렬하기 위해 루프 앞에 표시되는 경우가 종종 있습니다 (16은 종종 기본값입니다). 이렇게하면 루프의 성능을 향상시킬 수 있습니다. –

답변

0

주석에서 지적한대로이 명령어는 루프의 첫 번째 명령어 인 경우 보통 후속 명령어를 16 바이트 경계로 정렬하는 데 사용되는 multi-byte NOP입니다.

이러한 정렬은 명령 인출 대역폭이 16 바이트 단위로 자주 발생하므로 루프 상단을 정렬하면 병목 현상없이 디코딩이 수행 될 가능성이 가장 큽니다.

이러한 정렬의 중요성은 일단 정렬에 덜 민감 루프 버퍼 도입하고 UOP 캐시과, 틀림없이보다 덜 중요하다. 경우에 따라서는 특히 루프가 거의 실행되지 않을 때 이러한 최적화가 비관적 일 수도 있습니다.

관련 문제