搜索
bottom↓
回复: 24
打印 上一主题 下一主题

通过N次试验,终于知道如何编写供C调用的汇编子程序

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2005-11-28 15:44:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过N次试验,终于知道如何编写供C调用的汇编子程序



ICCavr中,参数通过r16/r17,r18/r19传递。

r16/r17是整体的,传递uchar和uint会全部占用,当uchar时,r17空置。

r18/r19同理。

如果还有参数要传递,则是通过Y指针指向的软件堆栈传递。

每一个char和int都占用2个字节,如果是char,高字节空置。

也就是说,参数总要占用偶数个空间。

例如传递参数如下:

uchar *point1,uchar *point2,uchar data1,uchar data2,uchar data3

共5个参数

那么point1通过r16/r17传递,point2通过r18/r19传递

data1通过Y+0指向的软件堆栈传递,data2通过Y+2指向的软件堆栈传递,data3通过Y+4指向的软件堆栈传递。

终于可以把俺的c程序大瘦身了,呵呵呵。

出0入0汤圆

2
发表于 2005-11-28 17:08:45 | 只看该作者
能否给个小小小例子捏~

出0入0汤圆

3
发表于 2005-11-29 14:15:36 | 只看该作者
还是不很清楚,能否来个例子?biansf2001

出0入0汤圆

4
发表于 2005-11-29 14:30:25 | 只看该作者
估計樓主的意思是說,只要程序(變量)按照一定格式書寫,系統就可以最好的優化!! 但也希望樓主給個例子!!

出0入0汤圆

5
 楼主| 发表于 2005-11-29 15:03:46 | 只看该作者
.s汇编文件

;多字节相加

;sum[number]+=add[number]

;void BytesAdd(uchar *sum,uchar *add,uchar number)

_BytesAdd::

        clc                ;c<-0

        mov        r26,r16

        mov        r27,r17        ;x<-sum

        mov        r30,r18

        mov r31,r19        ;z<-add

        ld        r0,y        ;r0<-number

balp:

        ld        r1,x

        ld        r2,z+

        adc        r1,r2        ;sum+=add+c

        st        x+,r1        ;store sum

        dec        r0

        brne balp        ;branch if number!=0

        ret

;******************************************************

;多字节相减

;minuend[number]-=subtrahend[number]

;void BytesSub(uchar *minuend,uchar *subtrahend,uchar number)

_BytesSub::

        clc                ;c=0

        mov        r26,r16

        mov        r27,r17        ;x=minuend

        mov        r30,r18

        mov r31,r19        ;z=subtrahend

        ld        r0,y        ;r0=number

bslp:

        ld        r1,x

        ld        r2,z+

        sbc        r1,r2        ;minuend-=subtrahend+c

        st        x+,r1        ;store minuend

        dec        r0

        brne bslp        ;branch if number!=0

        ret

;*******************************************************



C调用:

uchar sum[5],add[5];

uchar minuend[5],subtrahend[5];

BytesAdd(sum,add,5);//sum+=add,5bytes

BytesSub(minuend,subtrahend,5);//minuend-=subtrahend

出0入0汤圆

6
发表于 2005-11-29 16:39:45 | 只看该作者
我感觉用C写程序在多字节运算上方便,如果这都要用汇编写的话,还用C干吗?

出0入0汤圆

7
 楼主| 发表于 2005-12-1 16:52:59 | 只看该作者
5楼的:

我用到一个5字节的多字节运算,你打算让我用float吗?

那请问5*5的结果你打算用什么?

出0入0汤圆

8
发表于 2005-12-1 17:17:53 | 只看该作者
不可重入。

需要cli,否则可能因为嵌套调用而出错。

例如

    运行该函数时发生了中断,然后中断中偏偏又调用这个函数,结果。。。



C函数的啰嗦代码有一部份是因为增加了 寄存器保护 等,实现可重入性。

出0入0汤圆

9
发表于 2006-9-23 10:39:53 | 只看该作者
差不多

出0入0汤圆

10
发表于 2006-12-5 09:01:00 | 只看该作者
有收获,谢谢.

出0入0汤圆

11
发表于 2006-12-5 11:34:12 | 只看该作者
收藏起来,慢慢学习。

出0入0汤圆

12
发表于 2006-12-5 12:02:26 | 只看该作者
辛苦了。谢谢

出0入0汤圆

13
发表于 2006-12-5 13:15:42 | 只看该作者
有道理

出0入0汤圆

14
发表于 2006-12-6 09:09:25 | 只看该作者
要不断学习.

出0入0汤圆

15
发表于 2007-1-17 16:24:01 | 只看该作者
谢谢,学习

出0入0汤圆

16
发表于 2007-5-8 22:22:00 | 只看该作者
看看马忠梅的书就明白了.

出0入0汤圆

17
发表于 2007-6-28 19:57:09 | 只看该作者
谢谢,辛苦了.程序是看懂了,不知可有机会用.

出0入0汤圆

18
发表于 2007-6-28 20:30:26 | 只看该作者
更喜欢GCC的C嵌套汇编,编译器自动保护寄存器,自动与C接口,还能进行优化。



GCC的头文件中,大量使用了嵌套汇编。

出0入0汤圆

19
发表于 2007-6-29 16:23:05 | 只看该作者
5楼的:

我用到一个5字节的多字节运算,你打算让我用float吗?

那请问5*5的结果你打算用什么?



全部用汇编啊!

出0入0汤圆

20
发表于 2007-9-3 16:44:38 | 只看该作者
谢谢,学习

出0入0汤圆

21
发表于 2007-10-9 14:01:36 | 只看该作者
不错

汇编返回值到c也如此吗?

出0入0汤圆

22
发表于 2007-10-30 14:48:54 | 只看该作者
好,值得学习

出0入0汤圆

23
发表于 2007-12-11 22:23:33 | 只看该作者
有所收获..,不知其它型号的单片机是不是一样道理,看来要看一下,可能以后会有用到

出0入0汤圆

24
发表于 2010-4-20 00:01:18 | 只看该作者
非常不错!狂顶楼主!

出0入0汤圆

25
发表于 2010-5-19 23:29:36 | 只看该作者
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 07:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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