2012-02-02 2 views
2

gcc -m64 -O test.c -save-temps을 실행 한 후 생성 된 어셈블리에 mov %edi, %edi 이 나타납니다. 이 지시가 아무 것도하지 않습니까? %edi을 자체로 이동 시키므로 효과적으로 수행하지 못합니다.이 어셈블리가 생성 된 이유 :

일부 최적화 된 수준에서는이 어셈블리가 생성되지만 경우에 따라 다르게 배치됩니다.

추가 컨텍스트를 제공해야하는 경우 알려주십시오. 이 질문을 게시 할 때, 나는 더 이상의 맥락이 필요하다고 생각하지 않지만, 틀릴 수도있다. 절차의

코드 :

subl $400, %edi 
cmpl $20, %edi 
ja  .L4 
mov  %edi, %edi 
jmp  *.L11(,%rdi,8) 

이 switch 문에 대한 점프 테이블을 참조한다.

C 출처 :

64 비트 모드
int main() 
{ 

} 

int thing(int x) 
{ 

    switch(x) 
    { 
     case 400: 
     return 1; 
     break; 
     case 404: 
     return 2; 
     break; 
     case 408: 
     return 3; 
     break; 
     case 412: 
     return 4; 
     break; 
     case 416: 
     return 5; 
     break; 
     case 420: 
     return 6; 
     break; 
    } 

} 
+0

더 높은 최적화 수준을보십시오 (아래 모든 방법을 스크롤)? '-O2'? – Mysticial

+0

사실, 그 명령 주위에 더 많은 어셈블리를 보여줄 수 있습니까? (주소 포함) – Mysticial

+0

음 ...이 스 니펫의 소스도 표시 할 수 있습니까? – Mysticial

답변

5

, 목적지 레지스터의 상위 32 비트를 제로화 할 32 비트 레지스터에서 사용되는 명령어 mov.

그래서 :

mov %edi, %edi 

rdi의 상부 32 비트를 클리어한다.

http://en.wikipedia.org/wiki/MOV_%28x86_instruction%29

+0

Doh! 나는 깨달았어야했다. 도와 줘서 고마워. 이 아키텍처에 적응하려면 잠시 시간이 걸립니다. –

+0

처음부터이 문제를 의심하고 있었지만 문제의 원인을 찾기가 어려웠습니다. 그런 다음 (64 비트 값이없는) 소스를 게시하면 명확 해졌습니다. – Mysticial

+0

** ** ** ** ** 64 비트 모드의 32 비트 명령어는 각각의 레지스터의 상위 (63-32) 비트를 지우는 것으로 설명하면됩니다. 출처 : 인텔 최적화 안내서, 9.2.1 "데이터 크기가 32 비트 일 때 레거시 32 비트 명령어 사용" –

관련 문제