주요 C/C ++ 컴파일러가 생성 한 코드에 할당 규칙 등록
-
05-07-2019 - |
문제
C/C ++ 컴파일러 (제 경우에는 Borland/Turbo)에 의해 생성 된 어셈블리 출력을 분석 해야하는 경우 (적어도 나에게 적어도 나에게) 시간 전 (32 비트 비트 인텔 프로세서)의 몇 가지 규칙을 기억합니다. 성능 병목 현상을 찾고 C/C ++ 코드와 어셈블리 루틴을 안전하게 혼합합니다. SI 레지스터를 사용하는 것과 같은 것들 이것 포인터, 도끼는 반환 값에 사용되는 도끼, 조립 루틴이 반환 될 때 레지스터를 보존해야합니다.
이제 더 인기있는 C/C ++ 컴파일러 (Visual C ++, GCC, Intel ...) 및 프로세서 (Intel, Arm, ...)에 대한 참조가 있는지 궁금합니다. 하나. 아이디어?
다른 팁
Agner Fog의 "Calling Conventions"문서는 무엇보다도 Windows와 Linux 64 및 32 비트 ABI를 요약합니다. http://www.agner.org/optimize/calling_conventions.pdf. 등록 사용 요약은 P.10의 표 4를 참조하십시오.
개인적인 경험으로부터의 한 가지 경고 : 인라인 어셈블리에 ABI에 대한 가정을 포함시키지 마십시오. 특정 레지스터 (EG EAX, RDI, RSI)에서 반환 및/또는 매개 변수 전송을 가정하는 인라인 어셈블리에 함수를 작성하면 컴파일러에 의해 함수가 인쇄되는 경우/가 손상됩니다.
글쎄, 오늘 최적화가 켜져 있다면 아무것도 없습니다. 그러나 GCC를 사용하면 조립 지침이 등록에 있든 없든 관계없이 특정 변수를 사용해야한다고 선언하거나 GCC TU를 강제로 사용하여 해당 변수를 명령어로 사용할 수있는 레지스터에 넣습니다. 또한 인라인 어셈블리 블록 매장량을 자체적으로 등록하는 것을 선언 할 수도 있습니다 (따라서 컴파일러는 필요한 경우 인라인 조각 주위에 적합한 저장/복원 코드를 생성해야합니다).