매번왜 gcc가 출력 기계 코드는 NOP 명령이 있는가 나는 항상 NOP 명령 (아무것도하지 않는 명령)의 배치와 ASM 코드를 볼 -d objdump를 할
예를 들어이 같은 프로그램을 가지고 :
을 exampe에 대한#include <stdio.h>
#include <math.h>
int main()
{
printf("Hello World!\n");
printf("cos: %f\n", cos(1));
return 1;
}
은 objdump는 진입 점
0000000000400450 <_start>:
400450: 31 ed xor %ebp,%ebp
400452: 49 89 d1 mov %rdx,%r9
400455: 5e pop %rsi
400456: 48 89 e2 mov %rsp,%rdx
400459: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
40045d: 50 push %rax
40045e: 54 push %rsp
40045f: 49 c7 c0 00 06 40 00 mov $0x400600,%r8
400466: 48 c7 c1 70 05 40 00 mov $0x400570,%rcx
40046d: 48 c7 c7 34 05 40 00 mov $0x400534,%rdi
400474: e8 bf ff ff ff callq 400438 <[email protected]>
400479: f4 hlt
40047a: 90 nop
40047b: 90 nop
의 끝에서 2 NOP를있다 그리고 그 많은 사례 중 하나에 불과하지만 당신은 아이디어를 얻을. C 코드가 이렇게 컴파일 된 이유는 무엇입니까? 미리 감사드립니다.
x86_64에서 함수의 중간에 4 바이트의 nop도 발견했습니다.'' 0f 1f 40 00 \t nop DWORD PTR [rax + 0x0]'그게 무슨 좋은 생각이야? '-O3'에서 일어납니다. –
@Kerrek 올바르게 호출하면 프로세서가 캐시를 지우고 지정된 주소의 데이터로 다시로드하도록 지시합니다. 이 경우, 프로세서는'[rax]'에있는 데이터로 캐쉬를 지울 것입니다 (나는 호출이 점프하는 주소라고 가정합니다). 이를 통해 프로세서는 점프하기 전에 올바른 데이터로 캐시를 다시로드하기 시작할 수 있습니다. –