5449|9

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请问c中调用汇编的时候,写汇编函数应该是什么格式? [复制链接]

我是用S3C44B0X那个板子。在看demo程序的时候感到很困惑,有的汇编函数是前面加了下划线。有的却什么标示都没有,然后在C程序中稍加声明就可以直接调用了。
哪位大虾能不能说一下c中调用arm汇编函数,在编写的时候有什么格式和注意的吗?同样,如果汇编里面调用C函数呢?

最新回复

不小心找到了ADS1.2的编译器,看了看它的文档见到这个,拷过来整理了一下!!呵呵 LZ应该多看看编译器提供的手册,里面讲得很详尽... 这就不用我再翻译过来了吧?  详情 回复 发表于 2007-3-29 15:27
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
不同的编程平台,语法不一样。
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
具体看编译器手册...

像VC下的_asm{};
还见过的:asm();

 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
_asm{}这个是在c中内嵌汇编用到的吧。我是想问调用函数的时候,汇编函数编写的格式。
ads中的话是什么格式呢
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
哦这种的话我一般的解决办法是:

先把函数框架准备好

然后编译成汇编源文件,然后把汇编函数的功能填进去.

这样就省了,不同语言间的接口问题...
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

6
 
lbing7大虾,那就再麻烦一下 在ads下怎么把函数编译成汇编源文件?
不胜感激
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

7
 
其实也容易,你需要知道的是,所谓函数调用的本质,也就是call 了一个地址,在源代码一级,不会有立即数表示的地址,而是用symbol来表示,这个symbol在c代码里就是函数名,在汇编里就是一个标号(标号总会用吧,你在汇编里jmp,jz,jnc等等都要用到标号的)。
唯一需要注意的地方:汇编程序里的标号通常都只具有本地scope,也就是说,其他文件无法直接引用它,c文件当然也不例外。那么就需要用一些汇编伪指令来改变这个标号的属性,使之具有全局scope。这个伪指令应当是不同编译器有不同语法了,在gcc tool chain里面是用“.global”来指定的。
一旦你指定了一个标号的属性为具有全局scope,连接器就可以找到这个标号来进行连接了。

当然,为了让编译器也满意,你应当在c代码里声明一个函数原型,该原型的函数名就是汇编代码里的标号。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 
反过来在汇编里调用c函数,需要考虑的问题有些不同。由于c函数默认就具有全局属性,因此在连接上不需要考虑太多的问题,麻烦在于,你需要根据c函数的声明,在汇编调用它时为它准备好所需要的参数(入栈或者放到一些寄存器中),调用完成后可能还需要清理栈中的参数。

在实际开发中,推荐使用的方式还是lbing7所说的方法,否则确实麻烦。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

9
 
Calling assembly language from C

Example 4-9 and Example 4-10 on page 4-21 show a C program that uses a call to an
assembly language subroutine to copy one string over the top of another string.

Example 4-9 Calling assembly language from C
#include
extern void strcopy(char *d, const char *s);
int main()
{
    const char *srcstr = "First string - source ";
    char dststr[] = "Second string - destination ";

    /* dststr is an array since we’re going to change it */
    printf("Before copying:\n");
    printf(" %s\n %s\n",srcstr,dststr);
    strcopy(dststr,srcstr);
    printf("After copying:\n");
    printf(" %s\n %s\n",srcstr,dststr);
    return (0);
}

Example 4-10 Assembly language string copy subroutine
    AREA SCopy, CODE, READONLY
    EXPORT strcopy
    strcopy ; r0 points to destination string.
    ; r1 points to source string.
    LDRB r2, [r1],#1 ; Load byte and update address.
    STRB r2, [r0],#1 ; Store byte and update address.
    CMP r2, #0 ; Check for zero terminator.
    BNE strcopy ; Keep going if not.
    MOV pc,lr ; Return.
    END

Example 4-9 on page 4-20 is located in install_directory\examples\asm as strtest.c
and scopy.s. Follow these steps to build the example from the command line:
1. Type armasm -g scopy.s to build the assembly language source.
2. Type armcc -c -g strtest.c to build the C source.
3. Type armlink strtest.o scopy.o -o strtest to link the object files
4. Type armsd -e strtest execute the example.
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
不小心找到了ADS1.2的编译器,看了看它的文档见到这个,拷过来整理了一下!!呵呵

LZ应该多看看编译器提供的手册,里面讲得很详尽...

这就不用我再翻译过来了吧?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表