DSP_c与汇编混合编程的一点总结

在C和汇编混合编程的时候,存在C语言和汇编语言的变量以及函数的接口问题。

 

在C程序中定义的变量,编译为.asm文件后,都被放进了.bss区,而且变量名的前面都带了一个下划线。在C程序中定义的函数,编译后在函 数名前也带了一个下划线。例如:

            extern int num就会变成 .bss _num, 1
            extern float nums[5]就会变成.bss _nums, 5
            extern void func ( )就会变成 _func,

       一  汇编和C的相互调用可以分以下几种情况:

            (1) 汇编程序中访问c程序中的变量和函数。
            在汇编程序中,用_XX就可以访问C中的变量XX了。访问数组时,可以用_XX+偏移量来访问,如_XX+3访问了数组中的XX[3]。

                在汇编程序调用C函数时,如果没有参数传递,直接用_funcname 就可以了。如果有参数传递,
            则函数中最左边的一个参数由寄存器A给出,其他的参数按顺序由堆栈给出。返回值是返回到A寄存器或者由A寄存器给出的地址。同时注     意,为了能够让汇编语言能访问到C语言中定义的变量和函数,他们必须声明为外部变量,即加extern  前缀。

            (2) c程序中访问汇编程序中的变量

            如果需要在c程序中访问汇编程序中的变量,则汇编程序中的变量名必须以下划线为首字符,并用global使之成为全局变量。

            如果需要在c程序中调用汇编程序中的过程,则过程名必须以下划线为首字符,并且,要根据c程序编译时使用的模式是stack-based
            model还是register argument model来正确地编写该过程,使之能正确地取得调用参数。

            (3) 在线汇编

            在C程序中直接插入 asm(“  ***
            ”),内嵌汇编语句,需要注意的是这种用法要慎用,在线汇编提供了能直接读写硬件的能力,如读写中断控制允许寄存器等,但编译器并不     检查和分析在线汇编语言,插入在线汇编语言改变汇编环境或可能改变C变量的值可能导致严重的错误。

 

二 汇编和C接口中寻址方式的改变:

            需要注意的是,在C语言中,对于局部变量的建立和访问,是通过堆栈实现的,它的寻址是通过堆栈寄存器SP实现的。而在汇编语言中,为     了使程序代码变得更为精简,TI在直接寻址方式中,地址的低7位直接包含在指令中,这低7位所能寻址的具体位置可由DP寄存器或SP寄存     器决定。具体实现可通过设置ST1寄存器的CPL位实现,CPL=0,DP寻址,CPL=1,SP寻址。在DP寻址的时候,由DP提供高9位地址,     与低7位组成16位地址;在SP寻址的时候, 16位地址是由SP(16位)与低7位直接相加得来。

            由于在C语言的环境下,局部变量的寻址必须通过SP寄存器实现,在混合编程的时候,为了使汇编语言不影响堆栈寄存器SP,通常的方式    是在汇编环境中使用DP方式寻址,这样可以使二者互不干扰。编程中只要注意对CPL位正确设置即可。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
几个c程序,希望有用 include <math.h> /* In the VMS compiler, M_PI is not defined in math.h */ #ifdef vms #define M_PI 3.14159265358979323846 #endif #ifndef KR #define M_PI 3.14159265358979323846 #endif #define FALSE 0 #define TRUE 1 #define BIG 1e10 #define SMALL 1e-10 #define ORDER5 1e-5 #define ORDER4 1e-4 #define ABS(x) ((x) >= 0 ? (x) : -(x)) #define MIN(a,b) ((a) <= (b) ? (a) : (b)) #define MAX(a,b) ((a) >= (b) ? (a) : (b)) /* Table of constant values */ static long neg_i1 = -1; static long pos_i1 = 1; static long pos_i2 = 2; static long pos_i4 = 4; static long pos_i5 = 5; static float neg_f1 = -1.0; static float pos_f2 = 2.0; static double pos_d10 = 10.0; typedef struct { float r, i; } complex; typedef struct { double r, i; } doublecomplex; /* .................End of include file.................*/ /* SPBFCT 11/14/85 */ /* GENERATES (I1)!/(I1-I2)!=I1*(I1-1)*...*(I1-I2+1). */ /* NOTE: 0!=1 AND SPBFCT(I,I)=SPBFCT(I,I-1)=I!. */ #ifndef KR double spbfct(long *i1, long *i2) #else double spbfct(i1, i2) long *i1, *i2; #endif { /* Local variables */ long i; double ret_val; ret_val = 0.0; if (*i1 < 0 || *i2 < 0 || *i2 > *i1) { return(ret_val); } ret_val = 1.0; for (i = *i1 ; i >= (*i1 - *i2 + 1) ; --i) { ret_val *= (double) i; } return(ret_val); } /* spbfct */ /* SPBILN 11/13/85 */ /* CONVERTS ANALOG H(S) TO DIGITAL H(Z) VIA BILINEAR TRANSFORM */ /* ANALOG TRANSFER FUNCTION DIGITAL TRANSFER FUNCTION */ /* D(L)*S**L+.....+D(0) B(0)+......+B(L)*Z**-L */ /* H(S)=--------------------- H(Z)=---------------------- */ /* C(L)*S**L+.....+C(0) 1+.......+A(L)*Z**-L */ /* H(S) IS ASSUMED TO BE PRE-SCALED AND PRE-WARPED */ /* LN SPECIFIES THE LENGTH OF THE COEFFICIENT ARRAYS */ /* FILTER ORDER L IS COMPUTED INTERNALLY */ /* WORK IS AN INTERNAL ARRAY (2D) SIZED TO MATCH COEF ARRAYS */ /* IERROR=0 NO ERRORS DETECTED IN TRANSFORMATION */ /* 1 ALL ZERO TRANSFER FUNCTION */ /* 2 INVALID TRANSFER FUNCTION; Y(K) COEF=0 */ #ifndef KR void spbiln(float *d, float *c, long *ln, float *b, float *a, float *work, long *error) #else void spbiln(d, c, ln, b, a, work, error) long *ln, *error; float *d, *c, *b, *a, *work; #endif { /* Local variables */ long i, j, l, zero_func, work_dim1; float scale, tmp; double atmp; zero_func = TRUE; for (i = *ln ; i >= 0 && zero_func ; --i) { if (c[i] != 0.0 || d[i] != 0.0) { zero_func = FALSE; } } if ( zero_func ) { *error = 1; return; } work_dim1 = *ln + 1; l = i + 1; for (j = 0 ; j <= l ; ++j) { work[j * work_dim1] = 1.0; } tmp = 1.0; for (i = 1 ; i <= l ; ++i) { tmp = tmp * (float) (l - i + 1) / (float) i; work[i] = tmp; } for (i = 1 ; i <= l ; ++i) { for (j = 1 ; j <= l ; ++j) { work[i + j * work_dim1] = work[i + (j - 1) * work_dim1] - work[i - 1 + j * work_dim1] - work[i - 1 + (j - 1) * work_dim1]; } } for (i = l ; i >= 0 ; --i) { b[i] = 0.0; atmp = 0.0; for (j = 0 ; j <= l ; ++j) { b[i] += work[i + j * work_dim1] * d[j]; atmp += (double) work[i + j * work_dim1] * c[j]; } scale = (double) atmp; if (i != 0) { a[i - 1] = (double) atmp; } } if (scale == 0.0) { *error = 2; return; } b[0] /= scale; for (i = 1 ; i <= l ; ++i) { b[i] /= scale; a[i - 1] /= scale; } if (l < *ln) { for (i = l + 1 ; i <= *ln ; ++i) { b[i] = 0.0; a[i - 1] = 0.0; } } *error = 0; return; } /* spbiln */ /* SPBSSL 11/13/85 */ /* GENERATES ANALOG FILTER COEFFICIENTS FOR LTH ORDER */ /* NORMALIZED LOWPASS BESSEL FILTER */ /* COEFFICIENTS ARE RETURNED IN ARRAYS D AND C */ /* LN SPECIFIES ARRAY SIZE (LN>=L) */ /* WSCL CONTROLS FREQUENCY SCALING SUCH THAT RESPONSE AT 1 RAD/SEC */ /* IS EQUAL TO THAT OF UNSCALED H(S) AT WSCL RAD/SEC */ /* IERROR=0 NO ERRORS DETECTED */ /* 1 INVALID FILTER ORDER (L<=0 OR L>=LN) */ /* 2 INVALID SCALE PARAMETER (WSCL<=0) */ #ifndef KR void spbssl(long *l, float *wscl, long *ln, float *d, float *c, long *error) #else void spbssl(l, wscl, ln, d, c, error) long *l, *ln, *error; float *d, *c, *wscl; #endif { /* Builtin functions */ long pow_ii(); double pow_ri(); /* Local variables */ double spbfct(); long k, ll, tmp_int1, tmp_int2; if (*l <= 0 || *l > *ln) { *error = 1; return; } if (*wscl <= 0.0) { *error = 2; return; } for (ll = 0 ; ll <= *ln ; ++ll) { d[ll] = 0.0; c[ll] = 0.0; } for (k = 0 ; k <= *l ; ++k) { tmp_int1 = (*l * 2) - k; tmp_int2 = *l - k; c[k] = pow_ri(wscl, &k) * spbfct(&tmp_int1,&tmp_int1) / (pow_ii(&pos_i2, &tmp_int2) * spbfct(&k,&k) * spbfct(&tmp_int2,&tmp_int2)); } d[0] = c[0]; *error = 0; return; } /* spbssl */ /* SPBWCF 11/13/85 */ /* GENERATES KTH SECTION COEFFICIENTS FOR LTH ORDER NORMALIZED */ /* LOWPASS BUTTERWORTH FILTER */ /* SECOND ORDER SECTIONS: K<=(L+1)/2 */ /* ODD ORDER L: FINAL SECTION WILL CONTAIN 1ST ORDER POLE */ /* LN DEFINES COEFFICIENT ARRAY SIZE */ /* ANALOG COEFFICIENTS ARE RETURNED IN D AND C */ /* IERROR=0 NO ERRORS DETECTED */ /* 1 INVALID FILTER ORDER L */ /* 2 INVALID SECTION NUMBER K */ #ifndef KR void spbwcf(long *l, long *k, long *ln, float *d, float *c, long *error) #else void spbwcf(l, k, ln, d, c, error) long *l, *k, *ln, *error; float *d, *c; #endif { /* Local variables */ long i; float tmp; if (*l <= 0) { *error = 1; return; } if (*k <= 0 || *k > ((*l + 1) / 2)) { *error = 2; return; } d[0] = 1.0; c[0] = 1.0; for (i = 1 ; i <= *ln ; ++i) { d[i] = 0.0; c[i] = 0.0; } tmp = (float) *k - (*l + 1.0) / 2.0; if (tmp == 0.0) { c[1] = 1.0; } else { c[1] = (float) (-2.0 * cos((double) ((*k * 2) + *l - 1) * M_PI / (double) (*l * 2))); c[2] = 1.0; } *error = 0; return; } /* spbwcf */ 还有其它的几个例子
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值