> 백엔드 개발 > C++ > 기본 포인터 레지스터를 사용하는 C 인라인 어셈블리는 어떻게 함수 호출 오버헤드를 피할 수 있습니까?

기본 포인터 레지스터를 사용하는 C 인라인 어셈블리는 어떻게 함수 호출 오버헤드를 피할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2024-12-26 15:02:10
원래의
510명이 탐색했습니다.

How Can C   Inline Assembly with the Base Pointer Register Avoid Function Call Overhead?

C 인라인 어셈블리의 기본 포인터 레지스터를 사용하여 함수 호출 오버헤드 방지

C 인라인 어셈블리 내에서 기본 포인터 레지스터(%rbp)를 활용하려면 , 이 수정된 코드를 따르세요 snippet:

void Foo(int &x) {
    int tmp;
    long tmplong;
    asm volatile(
        "lea -16 + %[mem1], %%rbp\n\t"
        "imul , %%rbp, %q[reg1]\n\t"  // Register allocated to tmplong
        "add %k[reg1], %k[reg1]\n\t"    // Register allocated to tmp
        "movl , %[mem1]\n\t" // Store value in memory pointed to by tmp
        : [mem1] "=&m"(tmp), [reg1] "=r"(tmplong)
        :
        : "%rbp"
    );
    x = 5;
}
로그인 후 복사

설명:

  • %RSP 아래의 빨간색 영역을 수정하는 대신 로컬 변수 tmp를 인라인 ASM용 버퍼로 사용합니다. .
  • 스크래치 메모리는 레드존에서 제공되며, 다음을 통해 액세스할 수 있습니다. %[mem1], %rbp(기본 포인터 레지스터)를 참조하여 올바른 주소를 계산합니다.
  • "=m" 제약 조건(메모리 피연산자)은 컴파일러가 %[mem1이 가리키는 메모리에 tmp를 저장하도록 보장합니다. ].
  • 레지스터는 %[reg1]에 대해 컴파일러에 의해 할당됩니다.
  • ": %rbp" 클로버 list는 %rbp가 인라인 어셈블리 내에서 수정되어 복원이 가능함을 컴파일러에 알립니다.

추가 참고 사항:

  • 인라인 어셈블리를 단순하게 유지하세요. 주로 컴파일러가 내보낼 수 없는 명령어에 대한 것입니다. 명시적인 mov 명령어 대신 제약 조건을 사용하세요.
  • 함수 프롤로그 및 에필로그에 인라인 어셈블리를 사용하는 것보다 어셈블리에서 전체 함수를 작성하는 것을 선호합니다.
  • 인라인 어셈블리 태그 wiki와 같은 다른 인라인 어셈블리 리소스 사용을 고려하세요. 그리고 GNU C 매뉴얼.

위 내용은 기본 포인터 레지스터를 사용하는 C 인라인 어셈블리는 어떻게 함수 호출 오버헤드를 피할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿