arm汇编语言中调用C库函数printf[原]

今天在写一个ARM汇编代码时,本来想在程序中显示字符串信息,结果不成功,开始以为是C库中printf的实现的原因,下午终于解决问题,原来是没有在汇编程序中初始化C库。

遇到这个问题时,为了简单起见,我直接用汇编写了一个调用printf函数显示字符串hello的程序,如下:

    area    |hello$code|,code,readonly
    code32
    entry
    import _printf
    import ||Lib$$Request$$armlib||,weak
   
hello
    adr r0,strhello
    bl _printf

strhello
    dcb    "hello!/n/0"
    end

结果,在调试时,尽管能够调用_printf函数,但是不能在控制台输出字符串。但是后来我把汇编的这一段代码改写为一个过程(去掉entry,增加入口处的寄存器以及lr保护,在返回前再恢复保护的寄存器),然后增加了一个C原程序(main),在main中调用这个过程,发现可以在控制台输出字符串。
于是又查了一些资料(Google),终于发现了问题所在,原来是在汇编代码中没有初始化C库。于是将汇编代码改为如下:
    area    |.text|,code,readonly
    code32
    export main            ;导出main, 主函数,
    import _printf
    import __main      ;C Library Entry
    import ||Lib$$Request$$armlib||,weak
   
main
    stmfd sp!,{lr}
    adr r0,strhello
    bl _printf
   
    ldmfd sp!,{pc}

strhello
    dcb    "hello!/n/0"
  
    end
调试成功,可以在控制台成功输出字符串信息。

这个程序有一个主函数main,因此需要导出main符号,另外还要那么要引入标号__main(import __main),代表C库初始化的开始;由于程序中调用_printf函数,使用ARM C库,因此需要import |Lib$Request$armlib|,后面的weak表示表示本行的标号如果找不到,不会报告连接错误。
|.text|的含义:表示由 C 编译程序产生的代码段,或用于以某种方式与 C 库关联的代码段,在这里指的是后者。

参考资料:
1. ARM汇编优化, http://blog.csdn.net/guanchanghui/archive/2007/06/27/1669513.aspx
2.RealView编译工具2.0 版汇编程序指南, http://infocenter.arm.com/help/index.jsp

你可能感兴趣的:(嵌入式)