왜 GCC 방출"lea"대신에"하위"빼기위한?
-
12-12-2019 - |
문제
내가 찾는 일부에서는 어셈블리에 의해 생성된 분해 일부는 C 프로그램과 나는 혼동하여 하나의 최적화를 참조하는 것이다.
말할 수 없는 최적화에서 GCC 컴파일러 사용 subl
지시 빼기위한 경우는 최적화 설정(-O3
정확한 수)컴파일러 사용 leal
교육 대신 뺄셈,아래 예제:
없이 최적화:
83 e8 01 subl $0x1, %eax
최적화
8d 6f ff leal -0x1(%edi), %ebp
이 두 지시는 3 바이트의 길이를,그래서 나는 보지 않는 최적화 here.할 수 있는 사람이 있었 저를 도와주고 설명하려고 컴파일러의 선택입니까?
어떤 도움을 감사하겠습니다.
해결책
그것이 어렵게 말하지 않고 보는 원래 C 는 코드를 생산하고 이것이다.
하지만 나는 생각했다 경우,기 때문에 그것이 leal
할 수 있습 빼기를 할 수 밖의 위치를 파괴하지 않고 소스에 등록합니다.
이 저장할 수 있습니다 추가 등록을 이동합니다.
첫 번째 예제:
83 e8 01 subl $0x1, %eax
덮어 %eax
이로써 파괴합니다.
두 번째 예제:
8d 6f ff leal -0x1(%edi), %ebp
점 %edi - 1
로 %ebp
. %edi
보존을 위해 사용 가능합니다.
다른 팁
또한 명심하십시 즉 lea
에 영향을 미치지 않는 반면,플래그 sub
는 않습니다.그렇다면 계속되는 지침에 의존하지 않는 것에 의해 업데이트 뺄셈 다음 지 업데이트 플래그를 좀 더 효율적으로 될 것입니다.
제휴하지 않습니다 StackOverflow