×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-02 发布时间:
|
今天在写一个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 库关联的代码段,在这里指的是后者。

关键字:arm  汇编语言  调用C库函数

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向