GCC 인라인 어셈블리의 레이블
GCC 인라인 어셈블리에 대한 진행 중인 실험에서 레이블 및 인라인 코드와 관련된 새로운 문제에 부딪혔습니다.
다음과 같은 단순 점프를 고려합니다.
__asm__
(
"jmp out;"
"out:;"
:
:
);
이것은 점프하는 것 외에는 아무것도 하지 않습니다.out
레이블입니다. 현재 이 코드는 잘 컴파일됩니다.그러나 함수 내부에 배치한 다음 최적화 플래그로 컴파일하면 컴파일러는 "오류: 기호 'out'이 이미 정의되었습니다."라고 불평합니다.
컴파일러가 함수를 인라인화할 때마다 이 어셈블리 코드를 반복하는 것처럼 보입니다.이로 인해 라벨이 생성됩니다.out
중복되어 여러 개로 이어짐out
라벨
어떻게 해결해야 할까요?인라인 어셈블리에서 레이블을 사용하는 것이 정말 불가능합니까?GCC 인라인 어셈블리에 대한 이 튜토리얼에서는 다음과 같이 언급합니다.
따라서 CPP 매크로 및 인라인 C 함수에 어셈블리를 배치하여 누구나 C 함수/매크로로 사용할 수 있습니다.인라인 기능은 매크로와 매우 유사하지만 사용하기에 더 깨끗한 경우도 있습니다.이러한 모든 경우 코드가 중복되므로 해당 ASM 코드에 로컬 레이블(1: 스타일)만 정의해야 합니다.
이러한 "로컬 레이블"에 대한 자세한 정보를 찾으려고 했지만 인라인 어셈블리와 관련된 내용을 찾을 수 없습니다.튜토리얼에서 로컬 레이블이 숫자 뒤에 콜론(예:1:
), 그래서 저는 그런 레이블을 사용해 보았습니다.흥미롭게도 코드는 컴파일되었지만 실행 시에는 단순히 세그멘테이션 오류를 트리거했습니다.음...
그래서 제안, 힌트, 답은...?
로컬 레이블의 선언은 실제로 콜론 뒤에 오는 숫자입니다.그러나 로컬 레이블에 대한 참조에는 다음과 같은 접미사가 필요합니다.f
또는b
앞을 볼 것인지 뒤를 볼 것인지에 따라 달라집니다. 1f
다음을 참조합니다.1:
라벨을 앞으로 향하게 합니다.
라벨을 다음과 같이 선언합니다.1:
맞습니다; 하지만 그것을 참조하려면, 당신은 말해야 합니다.jmp 1f
(이 경우 앞으로 점프하기 때문에).
자, 이 질문은 더 이상 젊어지지 않지만, 다른 두 가지 흥미로운 해결책이 있습니다.
이 예제에서는 %=을(를) 사용합니다. 어셈블리 템플릿의 %=이(가) "전체 컴파일의 각 insn에 적용되는" 숫자로 대체됩니다.이것은 주어진 insn에서 두 번 이상 참조되는 로컬 레이블을 만드는 데 유용합니다."%=을(를) 사용하려면 (아마도) 하나 이상의 입력이 있어야 합니다(실제 사용할 필요는 없을 것입니다.
int a = 3;
asm (
"test %0\n\t"
"jnz to_here%=\n\t"
"jz to_there%=\n\t"
"to_here%=:\n\t"
"to_there%=:"
::"r" (a));
다음 출력은 다음과 같습니다.
test %eax
jnz to_here14
jz to_there14
to_here14:
to_there14:
또는 asmgooto(v4.5에 추가된 것으로 생각됨)를 사용할 수 있습니다.따라서 단순한 sm 레이블 대신 c 레이블로 이동할 수 있습니다.
asm goto ("jmp %l0\n"
: /* no output */
: /* no input */
: /* no clobber */
: gofurther);
printf("Didn't jump\n");
// c label:
gofurther:
printf("Jumped\n");
언급URL : https://stackoverflow.com/questions/3898435/labels-in-gcc-inline-assembly
'programing' 카테고리의 다른 글
리눅스에서 오라클 10gxe를 재구성하는 방법 (0) | 2023.06.17 |
---|---|
ClosedXml을 사용하여 수식 셀에서 Excel 줄 바꿈 텍스트를 만드는 방법 (0) | 2023.06.17 |
Firebase 트리거를 위한 클라우드 기능 제 시간에? (0) | 2023.06.17 |
뷰 라우터 없이 검색 필드 뷰 j에 자동 제안을 구현하려면 어떻게 해야 합니까? (0) | 2023.06.17 |
스크립트 캐시 유형을 정리하는 방법은 무엇입니까? (0) | 2023.06.17 |