4
A
답변
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 지시어로 생성 할 수 있습니다.
관련 문제
- 1. C++ 전 처리기 결정
- 2. C 전 처리기 라이브러리
- 3. C++ 전 처리기 변수
- 4. & 심볼의 C++ 전 처리기
- 5. C++ 전 처리기 지시문
- 6. C++ 전 처리기 푸시
- 7. C++ #define 전 처리기
- 8. C++ 전 처리기 정의
- 9. C# 전 처리기 클래스 접근성
- 10. C 전 처리기, 매크로 "오버로드"
- 11. 접기 C VIM의 전 처리기
- 12. C- 매크로를 정의하는 전 처리기
- 13. C 전 처리기, 재귀 매크로
- 14. Visual C++ 전 처리기 정의
- 15. 플랫폼 C 전 처리기 정의
- 16. C 컴파일러 전 처리기 출력
- 17. 전 처리기 지시문 conio.h C++
- 18. C# 전 처리기 매크로 대체
- 19. C, Objective-C 전 처리기 출력
- 20. Notepad ++ C/C++ 전 처리기 강조 표시
- 21. 전 처리기 정의
- 22. C 전 처리기 : 인수에서 따옴표 제거
- 23. 전 처리기 지시문
- 24. 이름이 들어있는 문자열을 사용하여 상수에 액세스하는 방법
- 25. SWIG의 전 처리기 매크로
- 26. 외부 어셈블리에서 리소스에 액세스하는 방법
- 27. 클래스 메서드 내에서 상수에 액세스하는 방법
- 28. regularjavascript 함수에서 angularjs 상수에 액세스하는 방법
- 29. 별도의 .swift 파일에서 상수에 액세스하는 방법
- 30. IE의 노드 유형 상수에 액세스하는 방법
매크로가 상수가 아닙니다. 전처리 기가 asm 파일에서 작동합니까? –