문제

C/C ++ 컴파일러 (제 경우에는 Borland/Turbo)에 의해 생성 된 어셈블리 출력을 분석 해야하는 경우 (적어도 나에게 적어도 나에게) 시간 전 (32 비트 비트 인텔 프로세서)의 몇 가지 규칙을 기억합니다. 성능 병목 현상을 찾고 C/C ++ 코드와 어셈블리 루틴을 안전하게 혼합합니다. SI 레지스터를 사용하는 것과 같은 것들 이것 포인터, 도끼는 반환 값에 사용되는 도끼, 조립 루틴이 반환 될 때 레지스터를 보존해야합니다.

이제 더 인기있는 C/C ++ 컴파일러 (Visual C ++, GCC, Intel ...) 및 프로세서 (Intel, Arm, ...)에 대한 참조가 있는지 궁금합니다. 하나. 아이디어?

도움이 되었습니까?

해결책

"Application Binary Interface"(ABI) 및 전화 컨벤션에 대해 묻습니다. 이들은 일반적으로 운영 체제 및 라이브러리에 의해 설정되며 컴파일러 및 링커에 의해 시행됩니다. "ABI"또는 "Call Convention"을위한 Google. 일부 출발점 위키 백과 그리고 팔에 대한 데비안.

다른 팁

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)에서 반환 및/또는 매개 변수 전송을 가정하는 인라인 어셈블리에 함수를 작성하면 컴파일러에 의해 함수가 인쇄되는 경우/가 손상됩니다.

Open Watcom C/C ++ 컴파일러는 레지스터 기반 (기본값) 및 스택 기반 (다른 컴파일러가 사용하는 것과 매우 가깝음)을 지원합니다. 이 컴파일러에 대한 사용자 안내서는 둘 다 설명하며 무료로 사용할 수 있습니다. 온라인, 컴파일러와 함께 그 자체. 사용자 가이드에서 이러한 주제를 특히 유용 할 수 있습니다.

  • 10.4.1 레지스터 기반 전화 규칙을 사용한 인수 전달
  • 10.4.6 스택 기반 통화 규칙 사용
  • 10.5 80x87 기반 응용 프로그램에 대한 컨벤션 전화

글쎄, 오늘 최적화가 켜져 있다면 아무것도 없습니다. 그러나 GCC를 사용하면 조립 지침이 등록에 있든 없든 관계없이 특정 변수를 사용해야한다고 선언하거나 GCC TU를 강제로 사용하여 해당 변수를 명령어로 사용할 수있는 레지스터에 넣습니다. 또한 인라인 어셈블리 블록 매장량을 자체적으로 등록하는 것을 선언 할 수도 있습니다 (따라서 컴파일러는 필요한 경우 인라인 조각 주위에 적합한 저장/복원 코드를 생성해야합니다).

나는 믿지만 GCC가 이타늄 아비 대부분의 기능에 대해; 그것과 그것이 사용하는 ABI 사이의 무능주의는 문서화.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top