在单独的.S文件中编写内联汇编

Yun*_*lcu 1 c eclipse assembly arm raspberry-pi3

我试图将我的汇编代码与我的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:
      ^
Run Code Online (Sandbox Code Playgroud)

我尝试在一堆地方放一个分号,但它没有解决我的问题,即使它与这个问题无关,任何帮助都会受到赞赏.这是我的ASM.c和asm.S文件:

ASM.c

#include "asm.S"

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

}
Run Code Online (Sandbox Code Playgroud)

asm.S

mul64x64asm:
      MOVW R0,0x12f4
      MOVT R0,0x5678
Run Code Online (Sandbox Code Playgroud)

更新:我尝试了建议的答案,最后得到了这个

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
Run Code Online (Sandbox Code Playgroud)

我认为eclipse正在将asm.S和ASM.c编译成对象并在此处链接它们.

更新2:所以我按照@fuz的指示更改了我的asm.S文件asm.S

.globl mul64x64asm
mul64x64asm:
          MOVW R0,0x12f4
          MOVT R0,0x5678
Run Code Online (Sandbox Code Playgroud)

我想用尽可能少的代码来解决这个问题,所以我删除了.size符号.

../src/asm.S:2: Error: unrecognised symbol type ""
Run Code Online (Sandbox Code Playgroud)

删除了类型符号,我现在收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

从eclipse中的链接器配置中删除了我的asm.S文件,因此它不会在此行中链接:

arm-linux-gnueabihf-gcc -o ASM src/ASM.o src/asm.o ../src/asm.S
Run Code Online (Sandbox Code Playgroud)

最后让它运作起来.感谢大家的回答/评论.

最后更新:为了在eclipse中调试我的代码,我必须在asm.S文件中包含更多行,这里是我最终的最终版本:

.text
.globl mul64x64asm
.type mul64x64asm,%function 
mul64x64asm:
           mov r0, #2
           mov r1, #3
           bx lr
           .size mul64x64asm,.-mul64x64asm
Run Code Online (Sandbox Code Playgroud)

fuz*_*fuz 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
Run Code Online (Sandbox Code Playgroud)

.globl指令将符号可见性调整为全局..type指令将符号类型标记为函数,这在使用动态链接时很重要.该.size指令将符号大小设置mul64x64asm为here(.)和函数开头之间的差值.这对于调试很有用,但如果你太懒,可以省略.

在非ARM上,.type mul64x64asm,@function将使用,但是@ARM上的注释字符,所以气体使用%.

现在组装它并将其链接到您的程序中,就像任何其他目标文件一样.