This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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



Dear TI colleagues!

在一个例程里,有一个函数用汇编语言定义,并且在另一个C语言的文件中被调用,如: DualFIRCalc_V1(DualFilter);

但是让我不明白是是,这个汇编函数是怎样得到参数DualFilter地址的?

本来在汇编文件中有这样的语句:

;; XAR4+0 => *coeff;
;; XAR4+2 => *data;

但是这些语句却是被注释掉的呀,除了这里外再也找不到其他地方有像似的语句了,所以不明白XAR4寄存器怎么得到参数地址的。

谢谢!

  • 请问能否给出具体的例程路径?我们具体看一下,谢谢

    另外目前使用的芯片/开发板是什么?
  • 已发私信。使用F280049C.
    谢谢!
  • 好的,我会在确认后给您回复
  • 在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");
    struct  DUAL_FILTER_PARAMATERS DualFilter;
    
    #ifdef Algorithm2
    #pragma DATA_SECTION(DualFilter2, "dual_filter_data");
    struct  DUAL_FILTER_PARAMATERS DualFilter2;
    #endif
    
    void    InitDualFilterParameters(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 Algorithm2
        DualFilter2.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
    }

  • 这些只是给结构体DualFilter赋值,以及把结构体定义在某个section中.
    但找不到在哪里把相应的地址赋给了XAR4寄存器呢?
  • 请问您现在情况如何了?我使用280049 launchpad 测了一下,在CCS内使用反汇编查看,在下面的语句可以看到

            ZeroDualFilterData():
    00a978:   BE00        MOVB         XAR6, #0x00
    281         uint32_t *data_ptr = &dual_fir_data_i16_i16[0].all;
    00a979:   8F00B8C0    MOVL         XAR4, #0x00b8c0
    283         for(i=0; i < FILTER_LENGTH; i++)
    00a97b:   9A00        MOVB         AL, #0x0
            C$L1:
    00a97c:   9C01        ADDB         AL, #1
    285             *data_ptr++ = 0;
    00a97d:   C284        MOVL         *XAR4++, XAR6
    283         for(i=0; i < FILTER_LENGTH; i++)
    00a97e:   522A        CMPB         AL, #0x2a
    00a97f:   64FD        SB           C$L1, LT
    289         data_ptr = &dual_fir_data_i16_i16_2[0].all;
    00a980:   8F00B840    MOVL         XAR4, #0x00b840
    290         for(i=0; i < FILTER_LENGTH2; i++)
    00a982:   9A00        MOVB         AL, #0x0
            C$L2:
    00a983:   9C01        ADDB         AL, #1
    292             *data_ptr++ = 0;
    00a984:   C284        MOVL         *XAR4++, XAR6
    290         for(i=0; i < FILTER_LENGTH2; i++)
    00a985:   522A        CMPB         AL, #0x2a
    00a986:   64FD        SB           C$L2, LT
    00a987:   0006        LRETR        
    308         DualFilter.coeff = dual_fir_coeff_i16_i16;
            InitDualFilterParameters():
    00a988:   76C0B1C0    MOVL         XAR7, #0x00b1c0
    00a98a:   761F02E0    MOVW         DP, #0x2e0
    316         DualFilter2.coeff = dual_fir_coeff_i16_i16_2;
    00a98c:   8F40B240    MOVL         XAR5, #0x00b240
    309         DualFilter.data  = dual_fir_data_i16_i16;
    00a98e:   7680B8C0    MOVL         XAR6, #0x00b8c0
    317         DualFilter2.data  = dual_fir_data_i16_i16_2;
    00a990:   8F00B840    MOVL         XAR4, #0x00b840
    308         DualFilter.coeff = dual_fir_coeff_i16_i16;
    00a992:   C300        MOVL         @0x0, XAR7
    316         DualFilter2.coeff = dual_fir_coeff_i16_i16_2;
    00a993:   A00C        MOVL         @0xc, XAR5
    309         DualFilter.data  = dual_fir_data_i16_i16;
    00a994:   C202        MOVL         @0x2, XAR6
    317         DualFilter2.data  = dual_fir_data_i16_i16_2;
    00a995:   A80E        MOVL         @0xe, XAR4

  • 目前程序运行正常,只是我想做一些改变, 这才发现好像没有参数地址的传递.
    所以这个程序的设计者是先看了前面汇编的结果,直接在后面的汇编中用了这个寄存器?
    一般编译器的结果是一样的,但也不排除改动一些程序后,编译器会把地址赋给别的寄存器?
    所以保险的做法还是要明确传递一下参数的地址?
    谢谢!
  • 我同意您的看法。但对于软件开发者的意图也不是很了解。若是使用的官方例程的话,建议您去英文论坛确认一下,谢谢