OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13798|回复: 15

如何C语言与汇编混编

[复制链接]

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
发表于 2012-3-17 11:38:45 | 显示全部楼层 |阅读模式
我想用汇编写SD卡与TFT的底层函数,封装成头文件形式,让C文件调用,需要设置什么吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2200
金钱
2200
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-17 11:41:44 | 显示全部楼层
没这个必要吧,这样程序维护起来会比较痛苦啊。。。

非要这么做的话,
可以在MDK的帮助文档里搜索 inline asm
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2200
金钱
2200
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-17 11:43:09 | 显示全部楼层
 


https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2200
金钱
2200
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-17 11:55:36 | 显示全部楼层
我试了下遇到错误了。。。

void A()
{
__asm DSB
}

..\main\cpp_Test.cpp(12): error:  #1113: Inline assembler not permitted when generating Thumb code

照着原子哥的sys.c里的方式写吧

__asm void DataSyncro()
{
DSB
}
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2200
金钱
2200
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-17 12:03:21 | 显示全部楼层


 
https://github.com/roxma
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-3-17 13:33:44 | 显示全部楼层
汇编的可以节省代码,但是只是这样听他们说,没用过呵呵
努力,前进。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-3-17 16:01:20 | 显示全部楼层
能少用就尽量少用吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

597

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2115
金钱
2115
注册时间
2011-9-3
在线时间
121 小时
发表于 2012-3-17 21:37:24 | 显示全部楼层
只是一些底层的关键点用汇编而已,其它尽量用C。
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
发表于 2012-3-19 20:48:14 | 显示全部楼层
这个比较专业了哈,需要配置个合理的空间,一部份放汇编代码,一部分放C,然后写个上位机把汇编和C的烧录文件组合起来下载到芯片中去。C通过地址跳转到汇编函数地址来使用汇编。
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-8-8
在线时间
9 小时
发表于 2016-8-21 18:51:09 | 显示全部楼层
我也遇到类似的问题,你把问题解决了吗,我的qq1264511336,可以一起学习讨论
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-8-23
在线时间
5 小时
发表于 2016-8-27 09:03:35 | 显示全部楼层
pathfinder 发表于 2016-8-21 18:51
我也遇到类似的问题,你把问题解决了吗,我的qq1264511336,可以一起学习讨论

居然有人挖坟,顺便回答下,混编非常方便,举个栗子

1、C 调用汇编函数
假如汇编文件“aaa.s”是这样的,注意 EXPORT AAA是必须的,这样C编译器才能找到
[mw_shl_code=asm,true]
EXPORT     AAA
AAA   ...
      bx      lr[/mw_shl_code]

然后C语言是这样调用的
[mw_shl_code=asm,true]
extern        int AAA(int  a);

main()
{
int b;
b=AAA(1);
}
[/mw_shl_code]

2、汇编 调用C函数
假如汇编文件“aaa.s”是这样的,注意 IMPORT AAA是必须的,这样让汇编知道AAA这个函数不在本文件内部
[mw_shl_code=asm,true]
IMPORT AAA
   ldr    r0,=AAA
   blx   r0
[/mw_shl_code]
C函数无需做特殊处理


**************
整体而言,混编时要注意内存分配,C语言中的变量地址是由编译器分配的,有一定的不可控性,建议位汇编和C单独划分内存块

另外要注意参数传递,正常是r0 - r3,这个相关资料有详细解释
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-8-8
在线时间
9 小时
发表于 2016-8-27 11:17:55 | 显示全部楼层
86806 发表于 2016-8-27 09:03
居然有人挖坟,顺便回答下,混编非常方便,举个栗子

1、C 调用汇编函数

建议位汇编和C单独划分内存块??汇编中确实很好把控内存分配问题,但是C中如何分配?
一般C中是编译器自动分配,但是如何划分内存呢?我是第一次尝试混编,请多指教!!谢谢
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-8-8
在线时间
9 小时
发表于 2016-8-27 11:18:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-8-23
在线时间
5 小时
发表于 2016-8-27 15:49:51 | 显示全部楼层
新建位图图像.jpg
改下内存起始地址就好,把低端留给汇编,或者改下长度,高端留给汇编,或者再插入一行,中间段留给汇编,自行理解了
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2016-3-20
在线时间
12 小时
发表于 2016-10-13 20:55:59 | 显示全部楼层
86806 发表于 2016-8-27 09:03
居然有人挖坟,顺便回答下,混编非常方便,举个栗子

1、C 调用汇编函数

你好,我在尝试混编的时候在C文件中调用汇编里面写的函数,可是依然是undifined,如果你有空的话能指导我下吗
回复 支持 反对

使用道具 举报

15

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2015-3-12
在线时间
18 小时
发表于 2016-12-3 12:07:33 | 显示全部楼层
比如,我要把C语言里的循环移位函数。换成效率高一些的汇编函数,如何做?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 23:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表