|
通过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程序大瘦身了,呵呵呵。
.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
|