新闻中心

EEPW首页>嵌入式系统>设计应用> arm汇编语言中调用C库函数printf

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

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

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

area |hello$code|,code,readonly
code32
entry
import _printf
import ||Lib
R equest
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


评论


技术专区

关闭