从c调用程序集
我已经为CCS V5中的FIR实现编写了这段代码 调试时从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
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?