C 인라인 ASM에서 기본 포인터 레지스터 사용
질문:
시도 중입니다. 인라인 어셈블리 내에서 기본 포인터 레지스터(%rbp)를 사용합니다. 그러나 인라인 asm 이후에 변수에 액세스하면 프로그램 세그먼트 오류가 발생합니다. 아래 코드 조각은 문제를 보여줍니다.
void Foo(int &x) { asm volatile ("pushq %%rbp;" "movq %%rsp, %%rbp;" "subq , %%rsp;" "movl , -12(%%rbp);" "movq %%rbp, %%rsp;" "popq %%rbp;" : : : ); x = 5; }
문제 진단:
코드 세그먼트 오류는 RSP 아래의 "빨간색 영역"에 저장된 값을 덮어쓰기 때문에 발생합니다. , GCC가 저장하는 데 사용하는 것 value.
해결책:
이 문제를 방지하려면 "=m" 출력 피연산자를 사용하여 인라인 asm에 스크래치 공간을 할당하거나 다음을 사용하여 빨간색 영역을 명시적으로 건너뜁니다. 하위 $-128, %rsp 명령어. 또는 처음부터 스크래치 공간을 사용하지 말고 컴파일러가 레지스터를 할당하고 저장하도록 하십시오.
인라인 ASM 모범 사례:
추가 팁:
위 내용은 기본 포인터 레지스터(%rbp)를 사용하는 인라인 어셈블리가 C에서 세그먼트 오류를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!