今天在写一个ARM汇编代码时,原本想在程序中显现字符串信息,成果不成功,开端以为是C库中printf的完成的原因,下午总算解决问题,原来是没有在汇编程序中初始化C库。
遇到这个问题时,为了简略起见,我直接用汇编写了一个调用printf函数显现字符串hello的程序,如下:
area |hello$code|,code,readonly
code32
entry
import _printf
import ||Lib
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
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