Dear TI colleagues!
在一个例程里,有一个函数用汇编语言定义,并且在另一个C语言的文件中被调用,如: DualFIRCalc_V1(DualFilter);
但是让我不明白是是,这个汇编函数是怎样得到参数DualFilter地址的?
本来在汇编文件中有这样的语句:
;; XAR4+0 => *coeff;
;; XAR4+2 => *data;
但是这些语句却是被注释掉的呀,除了这里外再也找不到其他地方有像似的语句了,所以不明白XAR4寄存器怎么得到参数地址的。
谢谢!
Susan Yang:
请问能否给出具体的例程路径?我们具体看一下,谢谢
另外目前使用的芯片/开发板是什么?
,
jjl3:
已发私信。使用F280049C.
谢谢!
,
Susan Yang:
好的,我会在确认后给您回复
,
Susan Yang:
在main.c内可以看到
// Initialize FIR filter Coef & Zero Out Data & Initialize Parameters:
InitDualFilterCoef(); ZeroDualFilterData(); InitDualFilterParameters();
以及
DualFIRCalc_V1(DualFilter);
而在DualFilter.c内可以看到
#pragma DATA_SECTION(DualFilter, "dual_filter_data"); structDUAL_FILTER_PARAMATERS DualFilter;#ifdef Algorithm2 #pragma DATA_SECTION(DualFilter2, "dual_filter_data"); structDUAL_FILTER_PARAMATERS DualFilter2; #endifvoidInitDualFilterParameters(void) {DualFilter.coeff = dual_fir_coeff_i16_i16;DualFilter.data= dual_fir_data_i16_i16;DualFilter.CircPtr.half.index = 0;DualFilter.CircPtr.half.size = (FILTER_LENGTH-1)*2;DualFilter.InFilter1 = 0;DualFilter.InFilter2 = 0;#ifdef Algorithm2DualFilter2.coeff = dual_fir_coeff_i16_i16_2;DualFilter2.data= dual_fir_data_i16_i16_2;DualFilter2.CircPtr.half.index = 0;DualFilter2.CircPtr.half.size = (FILTER_LENGTH2-1)*2;DualFilter2.InFilter1 = 0;DualFilter2.InFilter2 = 0; #endif }
,
jjl3:
这些只是给结构体DualFilter赋值,以及把结构体定义在某个section中.
但找不到在哪里把相应的地址赋给了XAR4寄存器呢?
,
Susan Yang:
请问您现在情况如何了?我使用280049 launchpad 测了一下,在CCS内使用反汇编查看,在下面的语句可以看到
ZeroDualFilterData(): 00a978:BE00MOVBXAR6, #0x00 281uint32_t *data_ptr = &dual_fir_data_i16_i16[0].all; 00a979:8F00B8C0MOVLXAR4, #0x00b8c0 283for(i=0; i < FILTER_LENGTH; i++) 00a97b:9A00MOVBAL, #0x0C$L1: 00a97c:9C01ADDBAL, #1 285*data_ptr++ = 0; 00a97d:C284MOVL*XAR4++, XAR6 283for(i=0; i < FILTER_LENGTH; i++) 00a97e:522ACMPBAL, #0x2a 00a97f:64FDSBC$L1, LT 289data_ptr = &dual_fir_data_i16_i16_2[0].all; 00a980:8F00B840MOVLXAR4, #0x00b840 290for(i=0; i < FILTER_LENGTH2; i++) 00a982:9A00MOVBAL, #0x0C$L2: 00a983:9C01ADDBAL, #1 292*data_ptr++ = 0; 00a984:C284MOVL*XAR4++, XAR6 290for(i=0; i < FILTER_LENGTH2; i++) 00a985:522ACMPBAL, #0x2a 00a986:64FDSBC$L2, LT 00a987:0006LRETR308DualFilter.coeff = dual_fir_coeff_i16_i16;InitDualFilterParameters(): 00a988:76C0B1C0MOVLXAR7, #0x00b1c0 00a98a:761F02E0MOVWDP, #0x2e0 316DualFilter2.coeff = dual_fir_coeff_i16_i16_2; 00a98c:8F40B240MOVLXAR5, #0x00b240 309DualFilter.data= dual_fir_data_i16_i16; 00a98e:7680B8C0MOVLXAR6, #0x00b8c0 317DualFilter2.data= dual_fir_data_i16_i16_2; 00a990:8F00B840MOVLXAR4, #0x00b840 308DualFilter.coeff = dual_fir_coeff_i16_i16; 00a992:C300MOVL@0x0, XAR7 316DualFilter2.coeff = dual_fir_coeff_i16_i16_2; 00a993:A00CMOVL@0xc, XAR5 309DualFilter.data= dual_fir_data_i16_i16; 00a994:C202MOVL@0x2, XAR6 317DualFilter2.data= dual_fir_data_i16_i16_2; 00a995:A80EMOVL@0xe, XAR4
,
jjl3:
目前程序运行正常,只是我想做一些改变, 这才发现好像没有参数地址的传递.
所以这个程序的设计者是先看了前面汇编的结果,直接在后面的汇编中用了这个寄存器?
一般编译器的结果是一样的,但也不排除改动一些程序后,编译器会把地址赋给别的寄存器?
所以保险的做法还是要明确传递一下参数的地址?
谢谢!
,
Susan Yang:
我同意您的看法。但对于软件开发者的意图也不是很了解。若是使用的官方例程的话,建议您去英文论坛确认一下,谢谢