如何在汇编代码中调用C语言函数?

[复制链接]
4251|3
 楼主| george3023 发表于 2007-9-24 20:50 | 显示全部楼层 |阅读模式
小弟用的是TMS320LF2407,编译器是CCS2.2。小弟尝试在汇编的中断服务子程序中调用C语言函数,发现程序运行不正常。于是将相关C文件生成汇编代码,发现只要是在C中使用了右移或除法指令,在相应生成的汇编代码中就会出现RSXM这条指令,屏蔽除法和右移指令就不会产生RSXM这条指令,并且程序可以正常运行。不知道哪位大哥在汇编代码中调用过c语言函数,请不吝赐教!
 楼主| george3023 发表于 2007-9-26 18:54 | 显示全部楼层

TI的回复

以下是TI给我的回复:<br />Regarding&nbsp;your&nbsp;inquiry,&nbsp;To&nbsp;call&nbsp;a&nbsp;C&nbsp;subroutine&nbsp;from&nbsp;assembly&nbsp;you&nbsp;have&nbsp;to&nbsp;follow&nbsp;below&nbsp;mentioned&nbsp;steps:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />1)&nbsp;Declare&nbsp;and&nbsp;define&nbsp;the&nbsp;C&nbsp;subroutine&nbsp;in&nbsp;a&nbsp;.c&nbsp;file<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />2)&nbsp;To&nbsp;access&nbsp;a&nbsp;C&nbsp;function&nbsp;or&nbsp;object&nbsp;from&nbsp;assembly&nbsp;language,&nbsp;declare&nbsp;the&nbsp;C&nbsp;object&nbsp;with&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />.global&nbsp;or&nbsp;.ref.&nbsp;This&nbsp;creates&nbsp;an&nbsp;undeclared&nbsp;external&nbsp;reference&nbsp;that&nbsp;the&nbsp;linker&nbsp;resolves.&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />3)When&nbsp;you&nbsp;call&nbsp;a&nbsp;C&nbsp;function&nbsp;from&nbsp;assembly&nbsp;language,&nbsp;push&nbsp;any&nbsp;arguments&nbsp;onto&nbsp;the&nbsp;stack&nbsp;in&nbsp;<br />reverse&nbsp;order.&nbsp;Pop&nbsp;them&nbsp;off&nbsp;after&nbsp;calling&nbsp;the&nbsp;function.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />4)&nbsp;The&nbsp;compiler&nbsp;adds&nbsp;an&nbsp;underscore&nbsp;(&nbsp;_&nbsp;)&nbsp;to&nbsp;the&nbsp;beginning&nbsp;of&nbsp;all&nbsp;identifiers(that&nbsp;is,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />labels).&nbsp;In&nbsp;assembly&nbsp;language&nbsp;modules,&nbsp;you&nbsp;must&nbsp;use&nbsp;an&nbsp;underscore&nbsp;prefix&nbsp;for&nbsp;all&nbsp;objects&nbsp;&nbsp;<br />that&nbsp;are&nbsp;to&nbsp;be&nbsp;accessible&nbsp;from&nbsp;C.&nbsp;For&nbsp;example,&nbsp;a&nbsp;C&nbsp;object&nbsp;named&nbsp;x&nbsp;is&nbsp;called&nbsp;_x&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />assembly&nbsp;language.&nbsp;So&nbsp;if&nbsp;you&nbsp;have&nbsp;to&nbsp;call&nbsp;the&nbsp;C&nbsp;subroutine&nbsp;&quot;func_c&quot;&nbsp;in&nbsp;assembly&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />declare&nbsp;the&nbsp;subroutine&nbsp;as&nbsp;.global&nbsp;_func_c&nbsp;and&nbsp;then&nbsp;call&nbsp;the&nbsp;subroutine.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />5)Functions&nbsp;must&nbsp;return&nbsp;values&nbsp;in&nbsp;the&nbsp;accumulator.&nbsp;16-bit&nbsp;integer&nbsp;values&nbsp;and&nbsp;pointers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />must&nbsp;be&nbsp;loaded&nbsp;in&nbsp;the&nbsp;accumulator&nbsp;with&nbsp;proper&nbsp;sign&nbsp;extension.
 楼主| george3023 发表于 2007-9-26 18:56 | 显示全部楼层

我的实际经验

我在调试过程中发现按如下方法可以完成在汇编代码中调用C语言函数:<br /><br />/*C&nbsp;file&nbsp;&nbsp;Begin&nbsp;*/<br /><br />void&nbsp;func_a();<br /><br />void&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;func_a();<br />}<br />/*C&nbsp;file&nbsp;&nbsp;End&nbsp;*/<br /><br />/*ASM&nbsp;file&nbsp;Begin*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ref&nbsp;_func_a<br />....<br />....<br />....&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;mar&nbsp;*,ar1<br />&nbsp;&nbsp;&nbsp;&nbsp;mar&nbsp;*+<br />&nbsp;&nbsp;&nbsp;&nbsp;sst&nbsp;#1,*+<br />&nbsp;&nbsp;&nbsp;&nbsp;sst&nbsp;#0,*+<br />&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;_func_a<br />&nbsp;&nbsp;&nbsp;&nbsp;mar&nbsp;*-<br />&nbsp;&nbsp;&nbsp;&nbsp;lst&nbsp;#0,*-<br />&nbsp;&nbsp;&nbsp;&nbsp;lst&nbsp;#1,*-&nbsp;<br />....<br />....<br />....<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />/*ASM&nbsp;file&nbsp;&nbsp;End&nbsp;*/
 楼主| george3023 发表于 2007-9-26 18:58 | 显示全部楼层

请高手批评指正

上面的做法如有问题,还请高手指正!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

68

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部