2009-09-04 2 views
0

는)C++ 프로그램에서 ASM 파일의 함수에 액세스합니까? 내 머리 오늘을 두드리는

Over here 나는 C에 ASM 파일을 변환에 대한 질문, 그리고 그것을 할 수있는 합리적인 방법이 없었다처럼 응답에서 보였다. 벌금. 따라서 응답 중 하나가 제안한 기능을 그대로 사용하고 완료 할 것을 제안했습니다. 좋은 소리.

하지만 어떻게?

거룩한 허튼 소리 나는 생각할 수있는 모든 것을 시도했습니다! 저는 마이크로 칩 브랜드 인 MCU (PIC18F4480)와 마이크로 칩 브랜드 IDE (MPLAB IDE)를 사용하고 있으며, ASM 파일은 마이크로 칩이 제작 한 것입니다 ... 그래서 당신은 내가 그들을 사용할 수있는 방법을 찾을 수있을 것 같아요! 지금까지 전혀 운이 없다.

ASM (어셈블리)에 대해 아무것도 알지 못합니다. 나는 C++로 코드하고 솔직히 변하지 않을 것입니다. 새로운 언어로 모든 코드를 다시 작성하지 않고도 Microchip ASM 파일의 기능에 액세스 할 수있는 방법이 필요합니다.

누구나 살펴보고 싶은 경우 ASM 파일과 애플리케이션 노트는 here입니다.

답변

6

PIDInt.asm을 보면 C/C++에서 함수를 호출하는 것이 상당히 간단해야합니다. 당신은이 모든 것들에 대한 통근 함수를 선언, 그리고

extern unsigned char error0, error1; /* etc */ 

을 : 첫째, 당신은 변수 정의에 나열된 모든 것을 통근 변수를 선언 "기능"의견을, 인수를 고려하지 않고 결과를 반환하지 :

extern void Proportional(); // extern "C" for C++ 

중 하나를 호출하려면 입력 변수를 채우고 함수를 호출 한 다음 출력 변수를 읽어야합니다.

+0

C++의 경우 함수 선언에 'extern "C"'가 필요하다. –

+0

@Pavel : 감사합니다. –

+0

그리고 다른 대답 링크에 obj 파일을 함께 언급했다. – simon

5

어셈블리 코드에서 개체 (.o) 파일을 만든 다음 C++ 파일을 해당 개체 파일에 연결해야합니다. 이러한 함수를 C++에서 호출하려면 extern "C"으로 선언해야 할 수 있습니다.

여기에 대한 자세한 내용은 PIC와 같은 마이크로 컨트롤러의 경우 C++과 어셈블리 간의 호출 규칙에 문제가있을 수 있습니다.

정말 마이크로 컨트롤러의 전체 C++ 기능 세트, 즉 개체, 가상 기능, 오버로드 등을 사용하고 있습니까? 그건 ... 나쁘지는 않지만 대부분의 PIC 개발은 여전히 ​​평이한 C (물론 어셈블리)라고 생각했습니다.

+0

부주의 한 사용. 그냥 C이다. – Steven

2

일반적인 방법은 어셈블러와 C/C++ 컴파일러가있는 빌드 환경과 도구를 사용하는 것입니다. 컴파일러 (및 어셈블러)는 소스 파일을 가져 와서 중간 개체 파일 형식을 생성합니다. Microsoft Windows에서 Microsoft 도구를 사용하면 .obj 파일이됩니다.

링커는 fortran, cobol, C++, c, objective-c, assembly 등 다양한 언어로 생성 된 .obj 파일을 단일 응용 프로그램 이진 파일로 연결하는 데 사용됩니다.

오브젝트 파일은 기본적으로 작은 바이트의 레이블 및 미해결 된 심볼의 콜렉션으로, 다른 오브젝트 파일의 내용을 가리 키기 위해 링크 중에 패치해야하는 바이트의 청크를 레이블링합니다.

이제는 거의 익숙하지 않은 경험이있는 플랫폼에서 C++ 컴파일러는 어떤 종류의 크로스 언어 바이너리 호환성도 염두에 두지 않았습니다. 반면에 C 컴파일러는 있습니다. 따라서 C++ 컴파일러는 매개 변수 및 반환 유형에 대한 모든 종류의 정보를 심볼 이름에 통합하는 고도로 변형 된 심볼을 만듭니다. 이 메커니즘은 운영자 과부하를 가능하게합니다.

어쨌든, 요점은,

  • 당신은 ASM 파일을 구축 할 필요가있다. 어셈블러가 없다면, 당신은 운이 좋을 것입니다. 그리고 아마도 당신의 c/C++ 툴셋과 같은 벤더가 필요합니다.
  • 외부 기호의 이름을 C++ 프로그램에 알려줘야합니다. 호환되는 방식으로. 이것은 헤더 파일이 일반적으로 사용되는 것입니다.

는 그래서 PID 코드에 대한 함수 선언을 개최하고이 같은 뭔가 배치 할 헤더 파일을 만듭니다

통근자 "C"무효 PidMain (무효);

이제 C++ 프로그램에서 헤더 파일을 # 포함하고 어셈블러에서 생성 된 오브젝트 파일이 환경 링크 단계에 포함되어 있는지 확인하십시오.

어떤 종류의 호출 규칙이 관련되어있을 수 있습니다. 일부 환경은 스택에 푸시 된 명령 및 스택 정리를 담당하는 명령과 다른 표준을가집니다. 대부분의 ms windows 도구 모음은 적어도 __pascal 및 __cdecl 호출 규칙을 지원하므로 선언은 다음과 같습니다.

extern "C"void __pascal PidMain (void);

특정 환경에서 여러 호출 규칙이있는 경우 구체적인 지식이 없습니다. 그래서 나는 이것이 얼마나 도움이되었는지 모른다. 나는 행운을 비네.