문제

함수를 작성하고 결과 어셈블리를 살펴보면 함수가 개선될 수 있다는 것을 알 수 있습니다.

가독성을 위해 작성한 함수를 유지하고 싶지만 컴파일러의 어셈블리를 자신의 어셈블리로 대체하고 싶습니다.고급 언어 기능과 새 어셈블리 간의 관계를 설정할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

어셈블리를 살펴보면 코드가 어떻게 컴파일되는지 잘 이해하고 있다고 가정하는 것이 공정합니다.이러한 지식이 있으면 변경 사항을 원래 언어로 되돌리는 '역엔지니어링'이 때때로 가능하지만 종종 귀찮게 하지 않는 것이 더 좋습니다.

이러한 변경을 처음 수행하는 데 필요한 시간과 노력에 비해 최적화는 매우 작을 수 있습니다.이런 종류의 작업은 컴파일러에게 맡기고 차 한잔 마시러 가실 것을 제안합니다.변경 사항이 중요하고 성능이 중요한 경우(임베디드 세계에서와 같이) 어떤 방식으로든 일반 코드와 어셈블리를 혼합하고 싶을 수 있지만 대부분의 컴퓨터와 칩에서는 일반적으로 성능이 충분하여 이를 방지할 수 있습니다. 이 두통.

만약 너라면 정말 더 많은 성능이 필요하다면 어셈블리가 아닌 코드를 최적화하세요.

다른 팁

없는 것 같아요.당신은 자신의 작업을 위해 컴파일러의 작업을 거부했습니다.이제 컴파일된 언어로 작성한 함수를 버릴 수도 있습니다. 이제 해당 플랫폼의 어셈블러만 있으면 되기 때문입니다.

프로파일링과 분석을 통해 실제로 변화를 만들고 있다는 확신이 없다면 이런 종류의 최적화에 참여하지 말 것을 적극 권장합니다.

함수를 작성한 언어에 따라 다릅니다.C와 같은 일부 언어는 각 함수 호출이나 명령문을 특정 어셈블리 명령문으로 변환하는 매우 낮은 수준입니다.C를 사용한 경우 함수를 인라인 어셈블리로 대체하여 성능을 향상시킬 수 있습니다.

다른 고급 언어에서는 각 명령문을 매크로 루틴이나 어셈블리 측의 더 복잡한 호출로 변환할 수 있습니다.특정 최적화(예: 테일 재귀, 루프 풀기 등)는 소스 측에서 쉽게 구현할 수 있지만 다른 최적화(레지스터 파일을 보다 효율적으로 사용하는 것과 같은)는 불가능할 수 있습니다(다시 말하지만, 사용하는 언어 및 컴파일러에 따라 다름) 사용).

수정된 어셈블리와 수정되지 않은 버전을 생성한 소스 사이에 어떤 관계가 있다고 말하기는 어렵습니다.확실히 디버깅 도구를 혼란스럽게 할 것입니다:레지스터 내용은 대응해야 하는 소스 변수와 더 이상 일치하지 않습니다.

패킷 처리 코드에는 생성된 어셈블리를 검사한 후 결과를 개선하기 위해 원본 소스 코드를 다시 변경한 여러 위치가 있습니다.소스를 재배열하면 분기 수를 줄일 수 있고, __attribute__ 및 컴파일러 인수는 분기점과 함수를 정렬하여 I$ 누락을 줄일 수 있습니다.절박한 경우에는 약간의 인라인 어셈블리를 사용하여 바이너리를 소스에서 계속 컴파일할 수 있습니다.

시도해 볼 수 있는 방법은 원래 함수를 자체 파일로 분리하고 거기에서 어셈블러를 빌드하는 make 규칙을 제공하는 것입니다.그런 다음 향상된 버전으로 어셈블러 파일을 업데이트하고 어셈블러 파일에서 개체 파일을 빌드하는 make 규칙을 제공합니다.그런 다음 해당 개체 파일을 포함하도록 링크 규칙을 변경합니다.

어셈블러 파일만 변경하면 해당 파일이 계속 사용됩니다.원본 고급 언어 파일을 변경하면 어셈블러 파일이 다시 작성되고 새(개선되지 않은) 버전에서 개체 파일이 작성됩니다.

이는 둘 사이의 관계를 제공합니다.동작에 대해 경고하기 위해 상위 레벨 언어 파일의 맨 위에 경고 주석을 추가하고 싶을 수도 있습니다.어떤 형태의 VCS를 사용하면 여기서 실수한 경우 향상된 어셈블러 파일을 복구할 수 있는 기능이 제공됩니다.

Visual C++에서 네이티브 컴파일된 앱을 작성하는 경우 다음 두 가지 방법이 있습니다.

  1. 사용 __asm { } 거기에 어셈블러를 차단하고 작성하세요.
  2. 함수를 작성하세요 매스엠 어셈블러를 사용하여 .obj로 어셈블하고 이를 정적 라이브러리로 연결합니다.C/C++ 코드에서 다음을 사용하여 함수를 선언합니다. extern "C" 선언.

다른 C/C++ 컴파일러에도 비슷한 접근 방식이 있습니다.

이 상황에서는 일반적으로 두 가지 옵션이 있습니다.코드를 최적화하거나 컴파일러를 다시 작성하십시오.소스와 작업 사이의 연결을 끊는 것이 올바른 해결책이 될 수 있는 곳이 어디인지 알 수 없습니다.

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