如何编写供C调用的汇编子程序

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

r16/r17是整体的,传递ucharuint会全部占用,当uchar时,r17空置。
r18/r19
同理。
如果还有参数要传递,则是通过Y指针指向的软件堆栈传递。
每一个charint都占用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程序大瘦身了。


.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-=subtrahen
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值