在 ICCA VR 中如何编写供 C 调用的汇编子程序
在 ICCA VR 中,参数通过 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指向的软件堆栈传 递。例子如下:
.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