TI中文支持网
TI专业的中文技术问题搜集分享网站

汇编中函数的参数是怎样传递的?

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:

我同意您的看法。但对于软件开发者的意图也不是很了解。若是使用的官方例程的话,建议您去英文论坛确认一下,谢谢

赞(0)
未经允许不得转载:TI中文支持网 » 汇编中函数的参数是怎样传递的?
分享到: 更多 (0)