2017-11-20 4 views
0

내가 때문에 또 다른 질문에 대한 제안의 내 C 코드에서 내 어셈블리 코드를 분리하기 위해 노력하고있어하지만 난이 오류 받고 있어요 :쓰기 인라인 어셈블리

arm-linux-gnueabihf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -mfpu=neon -o src/ASM.o ../src/ASM.c 
In file included from ../src/ASM.c:1:0: 
../src/asm.S:1:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token 
mul64x64asm: 
    ^

내가 퍼팅 시도를 한 무리의 장소에서 세미콜론하지만 내 문제를 해결하지 않았다면이 문제와 관련이 없더라도 도움을 받으실 수 있습니다.

ASM.c

#include "asm.S" 

int main(void) { 
    extern void mul64x64asm(); 
    mul64x64asm(); 
    return 1; 

} 

asm.S

mul64x64asm: 
     MOVW R0,0x12f4 
     MOVT R0,0x5678 

UPDATE : 내가 제안 된 답변을 시도하고이 함께 결국 은 여기 내 ASM.c 및 asm.S 파일입니다

arm-linux-gnueabihf-as -g --gstabs -o src/asm.o ../src/asm.S 
arm-linux-gnueabihf-gcc -O0 -g3 -Wall -c -fmessage-length=0 -mfpu=neon -o src/ASM.o ../src/ASM.c 
arm-linux-gnueabihf-gcc -o ASM src/ASM.o src/asm.o ../src/asm.S 
src/ASM.o: In function `main': 
/home/yunus/eclipse-workspace/ASM/Debug/../src/ASM.c:4: undefined reference to `mul64x64asm' 
collect2: error: ld returned 1 exit status 

이클립스가 asm.S와 ASM.c를 모두 obj로 컴파일한다고 생각합니다. 여기에서 그들을 연결하고 연결합니다. 업데이트 2

: 그래서 나는 @fuz의 지시를 따라 내 asm.S 나는 가능한 한 적은 코드로 작업이를 얻기 위해 원 조금을 제기 asm.S

.globl mul64x64asm 
mul64x64asm: 
      MOVW R0,0x12f4 
      MOVT R0,0x5678 

변경 내가 너무 .size 기호를 제거했습니다.

../src/asm.S:2: Error: unrecognised symbol type "" 

는 유형 기호를 제거하고 지금은이 오류 받고 있어요 : 그것은이 라인에 연결되지 않도록

arm-linux-gnueabihf-as -g --gstabs -o src/asm.o ../src/asm.S 
arm-linux-gnueabihf-gcc -o ASM src/ASM.o src/asm.o ../src/asm.S 
/tmp/ccYM9smZ.o: In function `mul64x64asm': 
(.text+0x0): multiple definition of `mul64x64asm' 
src/asm.o:../src/asm.S:3: first defined here 
collect2: error: ld returned 1 exit status 

제거 내 asm.S 이클립스에서 링커 구성에서 파일을 :

arm-linux-gnueabihf-gcc -o ASM src/ASM.o src/asm.o ../src/asm.S 

마침내 제대로 작동합니다. 답변/의견을 보내 주신 모든 분들께 감사드립니다.

최종 업데이트 :

.text 
.globl mul64x64asm 
.type mul64x64asm,%function 
mul64x64asm: 
      mov r0, #2 
      mov r1, #3 
      bx lr 
      .size mul64x64asm,.-mul64x64asm 
+3

어셈블리 코드를 #include하는 대신 별도로 어셈블 링하고 결과 객체 파일을 최종 이진 파일에 연결해야합니다. 포함 할 내용은 어셈블리 코드에서 전역 심볼을 선언하는 헤더입니다. – Michael

+0

함께 연결할 수 없습니까? – klutt

+0

또한 포함하지 않고 함께 링크를 시도했지만 정의되지 않은 참조 오류로 끝납니다. @klutt –

답변

5

거의 다 왔어. 프로그램에 어셈블리로 작성된 함수를 추가하려면 이미 수행 한 것과 같이 별도의 파일에 배치하십시오. 연결하면서

하면 글로벌로 다른 프로그램에서 사용하고자하는 모든 기호를 표시해야합니다 그래서 링커를 고려 :

.globl mul64x64asm 
    .type mul64x64asm,%function 
mul64x64asm: 
    MOVW R0,0x12f4 
    MOVT R0,0x5678 
    bx lr      @ don't forget to return instead of fallthrough 
    .size mul64x64asm,.-mul64x64asm 

.globl 지시어는 글로벌 에 기호 표시를 조정합니다..type 지시문은 기호 유형을 으로 표시합니다. 기능은이며 동적 연결을 사용할 때 중요합니다. .size 지시문은 mul64x64asm의 기호 크기를 여기 (.)와 기능 시작 간의 차이로 설정합니다. 이것은 디버깅에 유용하지만 너무 게으른 경우 생략 할 수 있습니다.

ARM이 아닌 경우 .type mul64x64asm,@function이 사용되지만 @은 ARM의 설명 문자이므로 가스는 %을 대신 사용합니다.

이제 이것을 조합하여 다른 오브젝트 파일과 같이 프로그램에 연결하십시오.

2

preporocessor과 #include : 이클립스 내 코드를 디버깅하기 위해 내가 함께 결국 최종 버전 인 asm.S에서 좀 더 라인 파일을 여기에 포함했다 지침은 잘못된 것입니다. 포함 된 파일의 코드를 문자 그대로 #include 파일에 붙여 넣습니다.

전처리 한 후, 코드 확실히 유효한 C 코드가 아닙니다

mul64x64asm: 
     MOVW R0,0x12f4 
     MOVT R0,0x5678 

int main(void) { 
    extern void mul64x64asm(); 
    mul64x64asm(); 
    return 1; 

} 

같이 보일 것입니다.

인라인 어셈블리를 수행하려면 컴파일러에서 이해하는 방식으로 수행해야합니다. Find the documentation for your version of GCC 및 이에 대해 자세히 읽어보십시오.

asm.S 소스 파일을 어셈블러를 사용하여 오브젝트 파일에 빌드하는 것이 좋습니다. 그런 다음 기본 프로그램을이 오브젝트 파일과 링크하여 실행 가능 프로그램을 작성하십시오.

2

어셈블리에서 .o을 만들어야합니다.그런 다음 C 코드를 다음과 같이 컴파일합니다.

gcc main.c asm.o