您的位置 首页 基础

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

今天在写一个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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/275657.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部