This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

调用x264中arm汇编文件arm.S文件,编译报错

我想调用x264中的arm.S文件,我创建了一个test.S文件,在改文件中定义如下:

#include "asm.S"

.text

function x264_prefetch_ref_arm

    sub         r2, r2, #1

    add         r0, r0, #64

    and         r2, r2, r1

    add         r0, r0, r2, lsl #3

    add         r2, r1, r1, lsl #1

    pld         [r0]

    pld         [r0, r1]

    pld         [r0, r1, lsl #1]

    add         r3, r0, r1, lsl #2

    pld         [r0, r2]

    pld         [r3]

    pld         [r3, r1]

    pld         [r3, r1, lsl #1]

    pld         [r3, r2]

    bx          lr

endfunc

编译的时候报错:

bad instruction `endfunc'

bad instruction `function x264_prefetch_ref_arm'

这个是跟编译器有关系吗?

我用的是的linaro编译器gcc-linaro-arm-linux-gnueabihf-4.9-2014.09。

另外有个疑问,汇编中直接使用#include<>的对吗?不是应该用.include<>吗?

我吧#改成.后,发现编译错误又变成:

bad instruction `elf .hidden EXTERN_ASMx264_prefetch_ref_arm'

bad instruction `elf .size x264_prefetch_ref_arm,.-x264_prefetch_ref_arm'

bad instruction `elf .type EXTERN_ASMx264_prefetch_ref_arm,%function'

bad instruction `func .endfunc'

bad instruction `func .func EXTERN_ASMx264_prefetch_ref_arm'

麻烦帮我解答下,谢谢。

Parents
  • 1、GAS汇编中其实不支持function与endfunc这两个关键字,如果你所实现的函数需要被外部引用,
       则需要使用.globl关键字来声明。
       function与endfunc可以使用macro来实现:
       .macro function _name
       .globl \_name
       \_name:
       .endm
      
       .macro endfunc _name
       .type \_name, %fuction
       .size \_name, . - \_name
       .endm

    2、汇编文件中使用#include <> 时,在as之前,会先调用预处理器来进行预处理(宏替换啥的)。
       注意此时汇编文件名需要以.S作为结尾。
       汇编文件中也可以使用.include <>, 此种include不会调用预处理器。
      
      

Reply
  • 1、GAS汇编中其实不支持function与endfunc这两个关键字,如果你所实现的函数需要被外部引用,
       则需要使用.globl关键字来声明。
       function与endfunc可以使用macro来实现:
       .macro function _name
       .globl \_name
       \_name:
       .endm
      
       .macro endfunc _name
       .type \_name, %fuction
       .size \_name, . - \_name
       .endm

    2、汇编文件中使用#include <> 时,在as之前,会先调用预处理器来进行预处理(宏替换啥的)。
       注意此时汇编文件名需要以.S作为结尾。
       汇编文件中也可以使用.include <>, 此种include不会调用预处理器。
      
      

Children