누구나 내게 다음 C++ 코드의 GCC에 의해 생성 된 어셈블리를 설명 할 수 있습니까? espeically, 코드에서 setg와 test의 의미. 고마워!도움이 생성 된 어셈블리 코드의 부분을 이해하십시오
의 .cpp 코드 :
1 /*for loop*/
2 int main()
3 {
4 int floop_id;
5 for(floop_id=100;floop_id>=1;floop_id--)
6 {}
7 return 0;
8 }
어셈블리 코드 : 그것은 g reater의 경우
3 push %ebp
3 mov %esp, %ebp
3 sub $0x10,%esp
5 movl $0x64,-0x4(%ebp)
5 jmp 8048457<main+0x13>
5 subl $0x1,-0x4(%esp)
5 cmpl $0x0,-0x4(%esp)
5 setg %al
5 test %al, %al
7 mov $0x0,%eax
8 leave
8 ret
답장을 보내 주셔서 감사합니다. 나는 하나 개의 흥미로운 점을 발견 : 나는 위와 같은 코드를 사용하여 GCC와 C 코드를 컴파일 할 때, 생성 된 어셈블리 코드가 다른 : 80483a3 이 cmpl의 $ 0x0으로, -0x4 (특히 %) JG setg 및 테스트 지침이 없습니다. 그러나 다른 것은 동일합니다. 가능한 이유를 아십니까? 고마워! –
martin
@martin : C 프론트 엔드는 C++ 프론트 엔드와 달리 빈 루프 본문을 "제거"하지 않기로했습니다. :-) 다른 최적화 플래그 (예 :'-O1','-O2')로 컴파일 해보십시오. 극적으로 다른 결과가 나타납니다. –
다른 최적화 플래그로 시도했지만 어셈블리는 동일합니다. 미안 해요, 빈 루프 몸체를 벗겨 내면 어떨까요? 어셈블리 코드에 어떤 영향을 줍니까? 정말 고마워! – martin