从c调用程序集

从c调用程序集,c,assembly,signal-processing,C,Assembly,Signal Processing,我已经为CCS V5中的FIR实现编写了这段代码 调试时 LDH .D1 *A4,A2 ; A2=x[n-k] k=1,...,N LDH .D2 *B4++,B2 ; B2=h[k] k=1,...,N 这段代码被忽略,或者说A2和B2的值保持不变。我尝试过给参数赋予常量值数组,但没有帮助。我猜它在浮点格式上有一些问题 感谢您的帮助 #include<stdio.h> #include<stdlib.h> #define N 4 extern FIR_asm_fu

我已经为CCS V5中的FIR实现编写了这段代码

调试时

LDH  .D1 *A4,A2 ; A2=x[n-k] k=1,...,N
LDH  .D2 *B4++,B2 ; B2=h[k] k=1,...,N
这段代码被忽略,或者说A2和B2的值保持不变。我尝试过给参数赋予常量值数组,但没有帮助。我猜它在浮点格式上有一些问题

感谢您的帮助

#include<stdio.h>
#include<stdlib.h>
#define N 4
extern FIR_asm_func();

int main()
{
    int y;//,h;
    float out;
    float x[N+1]={20,0,0,0,0};
    FILE *fip,*fop;
    char signal[]="signal";
    char output[]="output";
    float coeff[]={1,1,1,1,1};
    fip = fopen('signal',"r"); // read mode
    fop = fopen('output',"w");  // write mode
    y=201;
    while(y--)
    {
        fscanf(fip,"%f",&x[0]);
        //printf("%d\n",x[0]);
        out = FIR_asm_func(x,coeff,5);
        fprintf(fop,"%f,",out);
    }
        fclose(fip);
        fclose(fop);
        printf("End");
    return 0;
}


; FIR_asm_func.asm
; asm function called from C to implement fixed-point FIR
; A4 = x[n] address, B4 = h[0] address, A6 = filter order N
; input samples organized as x(n)...x(n-N)
; coefficients as h[0]...h[N]


        .global _FIR_asm_func

_FIR_asm_func:
        MV    .L1   A6,A1       ; setup loop count in A1
        ZERO  .S1   A8          ;   initialization  A8 for accumulation
        LDH   .D1   *A4++,A2        ;       x[n]
        LDH   .D2   *B4++,B2        ;       h[0]    
        MPY   .M1   A2,B2,A7        ; A7=x[n]*h[0]      

        ADD   .L1 A7,A8,A8          ; accumlate in A8
LOOP:
        MV   .L1 A2,A3          ; making space for newer sample
        LDH  .D1 *A4,A2 ; A2=x[n-k] k=1,...,N
        LDH  .D2 *B4++,B2 ; B2=h[k] k=1,...,N

        STH .D1 A3,*A4++ ;      
        MPY .M1 A2,B2,A7 ; A7=h[k]*x[n-k]

        ADD .L1 A7,A8,A8 ; accumulate in A8
        SUB .S1 A1,1,A1  ; decrement loop count A1

    [A1]   B    .S2   LOOP ; branch to loop if A1 # 0

        NOP 

        MV .L1 A8,A4 ; result returned in A4
        B .S2 B3 ; return addr to calling routine
        NOP 
        .end
#包括
#包括
#定义n4
外部FIR_asm_func();
int main()
{
int y;/,h;
浮出水面;
浮点x[N+1]={20,0,0,0};
文件*fip,*fop;
字符信号[]=“信号”;
字符输出[]=“输出”;
浮点数系数[]={1,1,1,1};
fip=fopen('signal','r');//读取模式
fop=fopen('output','w');//写入模式
y=201;
而(y--)
{
fscanf(fip、%f、&x[0]);
//printf(“%d\n”,x[0]);
out=FIR_asm_func(x,系数,5);
fprintf(fop,“%f”,out);
}
fclose(fip);
fclose(fop);
printf(“结束”);
返回0;
}
; FIR_asm_func.asm
; 从C调用asm函数以实现定点FIR
; A4=x[n]地址,B4=h[0]地址,A6=过滤器顺序n
; 按x(n)…x(n-n)组织的输入样本
; 系数为h[0]…h[N]
.global\u FIR\u asm\u func
_FIR_asm_func:
中压L1 A6,A1;设置A1中的循环计数
零。S1 A8;用于累积的初始化A8
LDH.D1*A4++,A2;x[n]
LDH.D2*B4++,B2;h[0]
MPY.M1 A2、B2、A7;A7=x[n]*h[0]
增补.L1 A7、A8、A8;积累在A8中
循环:
MV.L1 A2,A3;为新样品腾出空间
LDH.D1*A4,A2;A2=x[n-k]k=1,…,n
LDH.D2*B4++,B2;B2=h[k]k=1,…,N
D1 A3、*A4++;
MPY.M1 A2、B2、A7;A7=h[k]*x[n-k]
增补.L1 A7、A8、A8;在A8中累积
子条款S1 A1,1,A1;递减循环计数A1
[A1]B.S2回路;如果A1#0,则分支到循环
不
中压L1 A8,A4;结果以A4格式返回
B.S2 B3;将addr返回到调用例程
不
.完

这是哪个DSP?TMS320C?