2014-01-22 3 views

답변

5

GNU 툴체인을 사용하는 경우 gcc는 기본적으로 .S 확장자 (대문자 'S')가있는 파일에서 전 처리기를 실행합니다. 따라서 어셈블리 파일에서 모든 cpp 기능을 사용할 수 있습니다. 방법에

  • 가있을 수 있습니다 차이 어셈블러 및 입력 토큰 화 전처리 :

    몇 가지주의 사항이 있습니다.

  • #include 헤더 파일의 경우 함수 프로토 타입과 같은 C 사전 태그가 아닌 전 처리기 지시문 만 포함해야합니다.
  • 설명문은 전 처리기에서 해석하므로 # 주석을 사용하면 안됩니다.

예 :

파일 definitions.h

#define REGPARM 1 

파일 asm.S

#include "definitions.h" 

.text 
.globl relocate 

    .align 16 
    .type relocate,@function 
relocate: 
#if !REGPARM 
    movl 4(%esp),%eax 
#endif 
    subl %ecx,%ecx 
    ... 

당신은 GCC를 사용하지 않는 경우에도, 당신은을 사용할 수 있습니다 어셈블러의 구문이 C 전처리 기와 합리적으로 호환되는 한 동일한 접근법을 사용합니다 (위의주의 사항 참조). 대부분의 C 컴파일러는 입력 파일 (예 : gcc에서 -E) 만 사전 처리하거나 사전 처리기를 별도의 실행 파일로 사용할 수 있습니다. 빌드 도구에 어셈블리를 만들기 전에이 전처리 과정을 포함시킬 수 있습니다.

2

특정 개발 체인에서 허용하지 않는 한 할 수 없습니다. 하지만 20 년 정도의 임베디드 프로그래밍으로 나는 결코 하나도 보지 못했습니다.

일반적으로 어셈블리와 C가 통신하는 유일한 방법은 링커입니다. 즉 C/C++에서 정의 된 레이블은 어셈블리 내에서 액세스 할 수 있으며 반대의 경우도 마찬가지입니다.

C/C++과 asm 사이에서 정의를 공유해야 할 때 일반적으로 사용자 지정 코드 생성기로 정의했습니다.

높은 수준의 데이터가 어셈블리와 교환되는 경우는 드물기 때문에 몇 가지 외부 참조가 일반적으로 충분하므로 코드 생성기를 만드는 것이 매우 쉽습니다.

예를 들어 perl이나 awk를 사용하여 매우 간단한 공통 상수 목록을 구문 분석하고 한 쌍은 #define으로, 다른 한 쌍은 동등한 EQU 지시어로 생성 할 수 있습니다.