일부 C 프로그램을 디스 어셈블하여 생성 된 일부 어셈블리를보고 있는데 자주 반복되는 단일 최적화로 혼란 스럽습니다.GCC에서 빼기를 위해 "sub"대신 "lea"를 방출하는 이유는 무엇입니까?
나는 GCC 컴파일러에 더 최적화가없는 뺄셈의 subl
명령을 사용하지만, 내가 가진 않을 때 최적화 컴파일러가 대신 뺄셈의 leal
명령을 사용한다 (정확히 말하면 -O3
) 켜져 아래 예 :
없이 최적화 : 최적화와
83 e8 01 subl $0x1, %eax
8d 6f ff leal -0x1(%edi), %ebp
이 두 명령어는 모두 길이가 3 바이트이므로 여기서 최적화를 보지 않을 것입니다. 누군가 나를 도우려고 컴파일러의 선택을 설명하려고 할 수 있습니까?
도움을 주시면 감사하겠습니다.
최적화되지 않은 버전은 빼기에 즉시 값만 사용하므로이 관점에서는 고려하지 않았습니다. 고마워, 이것은 매우 도움이되었다. –