新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > Thumb指令集之: ARM和Thumb的混合编程

Thumb指令集之: ARM和Thumb的混合编程

作者:时间:2013-09-30来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257035.htm

(2)C语言的互交实例

下面的例子显示了一个Thumb状态下的代码通过互交调用子程序;而后又在子程序中调用的库函数printf()。

/*********************

*thumbmain.c*

**********************/

#includestdio.h>

externvoidarm_function(void);

intmain(void)

{

printf(HellofromThumbWorldn);

arm_function();

printf(AndgoodbyefromThumbWorldn);

return(0);

}

/*********************

*armsub.c*

**********************/

#includestdio.h>

voidarm_function(void)

{

printf(HelloandGoodbyefromworldn);

}

使用下面的命令对程序进行编译连接。

①编译生成带互交的Thumb代码。

armcc--thumb-c-g--apcs/interwork-othumbmain.othumbmain.c

②编译生成带互交的ARM代码。

armcc-c-g--apcs/interwork-oarmsub.oarmsub.c

③连接目标文件。

armlinkthumbmain.oarmsub.o-othumbtoarm.axf

另外,可以使用--info选项使连接器输出由于互交所增加的代码大小。

armlinkarmsub.othumbmain.o-othumbtoarm.axf--infoveneers

输出信息如下所示。

Addingstotheimage

AddingTAveneer(4bytes,Inline)forcallto'arm_function'fromthumbmain.o(.text).

AddingATveneer(8bytes,Inline)forcallto'__0printf'fromarmsub.o(.text).

AddingATveneer(8bytes,Inline)forcallto'__rt_lib_init'fromkernel.o(.text).

AddingATveneer(12bytes,Long)forcallto'__rt_lib_shutdown'fromkernel.o(.text).

AddingTAveneer(4bytes,Inline)forcallto'__rt_memclr_w'fromstdio.o(.text).

AddingTAveneer(4bytes,Inline)forcallto'__rt_raise'fromstdio.o(.text).

AddingTAveneer(8bytes,Short)forcallto'__rt_exit'fromexit.o(.text).

AddingTAveneer(4bytes,Inline)forcallto'__user_libspace'fromfree.o(.text).

AddingTAveneer(4bytes,Inline)forcallto'_fp_init'fromlib_init.o(.text).

AddingTAveneer(4bytes,Inline)forcallto'__heap_extend'frommalloc.o(.text).

AddingATveneer(8bytes,Inline)forcallto'__raise'fromrt_raise.o(.text).

AddingTAveneer(4bytes,Inline)forcallto'__rt_errno_addr'fromftell.o(.text).

12(s)(total72bytes)addedtotheimage.

(3)Thumb状态下的功能指针

任何指向Thumb函数(由Thumb指令完成的功能函数并且其返回状态也为Thumb状态)的指针,其最低有效位(LSB)必为1。

当重定位Thumb代码中的地址标号时,连接器将自动设置地址的最低有效位。如果在程序中使用绝对地址,连接器将无法完成该设置。因此,如果在Thumb代码中使用绝对地址时,必须手工设置为其地址加1。

下面的例子显示了Thumb代码的功能指针的使用。

typedefint(*FN)();

myfunc(){

FNfnptrs[]={

(FN)(0x8084+1), //有效的Thumb地址

(FN)(0x8074) //无效的Thumb地址

};

FN*myfunctions=fnptrs;

myfunctions[0](); //调用成功

myfunctions[1](); //调用失败

}

c++相关文章:c++教程



上一页 1 2 3 4 5 6 下一页

评论


相关推荐

技术专区

关闭