Téléphone : 01 64 42 60 45
A+| A-| A
01 0

Publié par  dans 

주의, asm(«  »); (기본 asm으로 알려진 단점 없음) 및 asm(«  »:); (빈 제약, 확장 asm의 형태) 동일하지 않습니다! 다른 차이점 중, 기본 asm에서 단일 백분율 기호 `%`로 레지스터를 접두사해야 하며 확장 된 asm에서 (구속 조건 목록이 비어 있더라도) 어셈블리 템플릿 문자열에서 접두사로 `%%`를 사용해야 합니다. « 오류: 잘못된 레지스터 이름 `%%eax` »와 같은 gcc 오류 메시지가 있으면 닫는 괄호 앞에 콜론(`:`)을 삽입해야 합니다. 확장 asm은 일반적으로 선호, 기본 asm이 필요한 경우가 있지만. 또한 이 레지스터 접두사는 gcc의 기본값인 AT&T 구문 어셈블리에만 적용됩니다. 컴파일러는 C 또는 C++에서 사용할 수 없는 대상 프로세서의 기능에 액세스하는 등 C 또는 C++ 소스 코드에 어셈블리 코드를 작성할 수 있는 인라인 어셈블러를 제공합니다. 위의 예에서, « val »은 출력 진연이며, %0으로 지칭된다. 및 « 아니오 »는 입력 된 나연, %1에 의해 참조 됩니다. « r »은 난산에 대한 제약조건이며, 이는 GCC에 난산자를 저장하기 위한 임의의 레지스터를 사용하라고 말한다. 시스템 호출: 상위 수준 언어에는 임의의 시스템 호출을 수행할 수 있는 직접 기능이 거의 없으므로 어셈블리 코드가 사용됩니다. 당신이 가지고있는 옵션 중 하나는 asm 함수를 작성하고 호출하는 것입니다, 그러나 « 호출 »오버 헤드가 당신을 위해 너무 많은 경우가있을 수 있습니다. 이 경우 필요한 것은 asm() « 함수 »를 사용하여 코드 중간에 임의의 어셈블리 조각을 삽입하는 것을 의미하는 인라인 어셈블리입니다.

이 함수가 작동하는 방식은 컴파일러에 따라 다르며 이 문서에서는 OS 세계에서 가장 많이 사용되는 컴파일러이기 때문에 GCC에서 작동하는 방식을 설명합니다. 기본 인라인 어셈블리의 형식은 매우 간단합니다: clobbered_register_list의 레지스터는 대문자가 아닌 소문자를 사용해야 합니다. clobbered_register_list가 있는 예제 명령은 다음과 같이: GCC는 AT&T 스타일 어셈블리 문을 사용하며 asm 키워드를 사용하여 기본 및 확장어셈블리 명령을 지정할 수 있습니다. 인라인 어셈블리를 사용하면 프로세서에서 실행하는 데 필요한 명령 수를 줄일 수 있습니다. GCD의 예에서 인라인 어셈블리를 사용하여 구현하는 경우 유클리드알고리즘을 사용하는 일반 C 코드에 비해 계산에 필요한 명령 수가 훨씬 적습니다. 마지막 « clobbered 레지스터 » 섹션은 GCC에 코드가 프로세서 레지스터 중 일부를 사용하고 있으며 asm 스니펫을 실행하기 전에 이 레지스터에서 실행 중인 프로그램에서 활성 데이터를 이동해야 한다는 것을 알리기 위해 사용됩니다. 위의 예제에서는 첫 번째 명령에서 eax로 이동하여 콘텐츠를 효과적으로 지우므로 작업 전에 저장되지 않은 데이터에서 이 레지스터를 지우도록 GCC에 요청해야 합니다. input_operand_list는 쉼표로 구분된 입력 된 난산자의 선택적 목록입니다. 입력 된 나산자 출력 나연과 동일한 구문을 사용 합니다. 이 예제에서는 [input_i] « r »(i), [input_j] « r » (j)의 두 가지 입력 피연산자가 있습니다. 목록이 비어 있을 수 있습니다. 이 유용 할 수있는 한 가지 예는, CMPXCHG 명령 (비교 및 스왑 참조)입니다, 이는 리눅스 커널 소스 코드가 다음과 같이 정의 : 예를 들어, CPU를 중지하려면, 당신은 단지 다음 명령을 사용해야합니다 : __asm 키워드는 인라인 어셈블리를 통합 할 수 있습니다 코드는 GNU 인라인 어셈블리 구문을 사용하여 함수에 들어갑니다.

예: 다음 C 코드 예제에서는 GNU 어셈블러를 사용하여 AT&T 어셈블러 구문에서 시스템 호출 래퍼를 보여 주습니다.

'.