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.

关于CCS环境下的DSP的立即数



毕业后玩的DSP都是汇编,自从VC33后就很少亲自编程了。最近因为工作原因不得不接触CCS5.2,看了一些案例程序,突然意识到一个问题,就是在CCS中用difine定义的数,在程序中使用时会保留多少精度呢?学过单片机的人都知道,立即数寻址方式下的立即数是精度有限的,如果F28335的指令码是32位,那么立即数寻址的精度必然低于32位。那么具体是多少呢?比如:
#define   sanfenzhiyi    0.3333333333333333333333333333333333
在程序中有:
a=1;
b=a*sanfenzhiyi;
那么此条语句从汇编的角度来讲应该算立即数寻址,后面的3能保留多少位呢,谢谢。
  • define是宏,编译时是要直接替换到调用的地方,所以取决于上b的类型。

  • 您好,多谢答复。
    宏定义和直接替换,我是知道的。大概是我搞汇编太久了,所以我思路还是凝聚在汇编的阶段。C语言在CCS里应该是先转换成汇编语言,才最终成为机器码。那么在汇编系统里,对于语句中的立即数(这个立即数无论怎么来的,直接写的还是宏定义的),都应该属于该机器码中的一部分。如在VC33的汇编系统中,其立即数寻址时,BIT0~BIT15是给指令中的立即数的,也就是说,VC33的系统中的立即数只有16位的有效精度,无论是整型还是小数。
    不知道我上面的认识是否有错?
    谢谢指导。
  • 我在CCS上编译了一下,对照下面产生的汇编代码,可以看出不是产即数寻址,是先把值取到寄存器,再对寄存器的值做运算。从下面看,是用的双精度。

    #define constant 0.33333333333333333333
    int main(void) {
    int a, b;
    a = 1;
    b = a*constant;

    return 0;
    }

    对应的汇编如下:

    MVK .L2 1,B4 ; |8|
    STW .D2T2 B4,*+SP(4) ; |8|
    .dwpsn file "../main.c",line 9,column 2,is_stmt,isa 0
    INTDP .L2 B4,B5:B4 ; |9|
    MVKL .S2 0x3fd55555,B7
    MVKL .S2 0x55555555,B6
    MVKH .S2 0x3fd55555,B7
    MVKH .S2 0x55555555,B6
    MPYDP .M2 B7:B6,B5:B4,B5:B4 ; |9|
    NOP 9

  • 这样就明白了,感谢。