2011-05-05 2 views
13

매번왜 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 코드가 이렇게 컴파일 된 이유는 무엇입니까? 미리 감사드립니다.

답변

7

매우 자주 그 단어는 padding을 사용하여 단어 나 경계에서 다시 시작됩니다. 단어 경계에서 정렬되지 않은 임의의 코드에 대한 액세스는 CPU에 비해 ​​훨씬 비쌉니다.

17

nop이 추가되어 다음 함수를 4 바이트 경계로 강제 설정합니다. (마지막으로 nop 다음의 주소는 4로 나눌 수있는 40047c가됩니다.)

+0

x86_64에서 함수의 중간에 4 바이트의 nop도 발견했습니다.'' 0f 1f 40 00 \t nop DWORD PTR [rax + 0x0]'그게 무슨 좋은 생각이야? '-O3'에서 일어납니다. –

+1

@Kerrek 올바르게 호출하면 프로세서가 캐시를 지우고 지정된 주소의 데이터로 다시로드하도록 지시합니다. 이 경우, 프로세서는'[rax]'에있는 데이터로 캐쉬를 지울 것입니다 (나는 호출이 점프하는 주소라고 가정합니다). 이를 통해 프로세서는 점프하기 전에 올바른 데이터로 캐시를 다시로드하기 시작할 수 있습니다. –

관련 문제