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.

[参考译文] TMS320F28035:有关使用 CLA 汇编指令的问题

Guru**** 2613355 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/694357/tms320f28035-question-about-using-cla-assembly-instruction

器件型号:TMS320F28035

您好!

我的问题是关于这个 CLA 汇编指令'MCDD'。

通常情况下、它的用法如下所示:

MMOV32   MR0、@状态
MCMPF32 MR0、#0.1;
MNOP
MNOP
MNOP
MBCNDD Skip1、NEQ

因此、如果 State 不等于0.1、则会分支到"Skip1"。

但我还看到了类似这样的代码:

MMOV32   MR0、@μ_LED_IS _ON
MNOP
MNOP
MNOP
MBCNDD Skip1、NEQ

在检查分支指令的条件之前、没有使用比较指令(MCMPF32)。  

为什么允许使用此代码? 它是如何工作的? 什么会影响标志?

谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 James:

    您能告诉我们您在哪里找到了第二个代码片段吗?

    比较指令不需要紧跟在分支指令之后。 分支指令检查先前比较指令设置的 ZF 标志

    例如:

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    MMOV32更新负(NF)和零(ZF)标志、因此它自动执行=0、!=0、比较<0和>=0。 由于指令名称中没有"F"字母、我希望 NF 和 ZF 根据 与零的整数比较进行更新、但在用户手册中进行更新

    MMOV32 MRA、mem32{、CNDF}条件32位移动

    (笑声)

    if (CNDF = UNCF)

    NF = MRA(31);

    ZF = 0;

    if (MRA (30:23)=0){ZF = 1;NF = 0;}

    看起来它 是浮点与零进行比较、不支持 FP 逐渐下溢。 伪代码检查单精度数(MRA (30:23))的指数、如果它为零、则将数字视为零。

    我想检查情况是否如此。 我想您的_LED_IS 变量是整数、不是吗? 如果是、则说明文件错误或编译的代码错误。

    Edward

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    爱德华

    我怀疑 MMOV32指令是否更新 NF 和 ZF 标志。 我同意这是有条件的模式指示。 在 James shared 代码段中、这是一个无条件的 mov 指令。 我相信、它不会更新 MSTF 寄存器中的任何标志

    此致、
    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Veena、

    我自己试过。 28337 CLA 文档正确、MMOV32根据 FP 与0.0的比较更新 ZF 和 NF、并将指数为零的非零数字视为零。

    您之前的消息需要更正

    • 分支指令检查先前比较指令设置的 ZF 标志

    先前的比较指令设置、而不是之前的比较指令设置。 MABSF32和其他工具也会更新 ZF 和 NF 标志。

    编译器高效使用此功能

    易失性浮点状态;

    192              if (lstatus < 0)
    0000a978:  73C0804C   MMOV32    MR0、@0x804c、UNCF
    0000a97a:  7FA00000   MNOP       
    0000a97c:  7FA00000   MNOP       
    0000a97e:  7FA00000   MNOP       
    0000a980:  79830014   MBCNDD    0x14、GEQ
    0000a982:  7FA00000   MNOP       
    0000a984:  7FA00000   MNOP       
    0000a986:  7FA00000   MNOP       
    193                  lstatus++;
    0000a988:  73C0804C   MMOV32    MR0、@0x804c、UNCF
    0000a98a:  77C03F80   MADDF32   MR0、#0x3f80、MR0
    0000a98c:  74C0804C   MMOV32    @0x804c、MR0
    0000a98e:  7FA00000   MNOP       
    0000a990:  7FA00000   MNOP       
    0000a992:  7FA00000   MNOP       
    194              if (lstatus >= 0)
             C$L5:
    0000a994:  73C0804C   MMOV32    MR0、@0x804c、UNCF
    0000a996:  7FA00000   MNOP       
    0000a998:  7FA00000   MNOP       
    0000a99a:  7FA00000   MNOP       
    0000a99c:  79840014   MBCNDD    0x14、LT
    0000a99e:  7FA00000   MNOP       
    0000a9a0:  7FA00000   MNOP       
    0000a9a2:  7FA00000   MNOP       
    195                  lstatus+=2;
    0000a9a4:  73C0804C   MMOV32    MR0、@0x804c、UNCF
    0000a9a6:  77C04000   MADDF32   MR0、#0x4000、MR0
    0000a9a8:  74C0804C   MMOV32    @0x804c、MR0
    0000a9aa:  7FA00000   MNOP       
    0000a9ac:  7FA00000   MNOP       
    0000a9ae:  7FA00000   MNOP       
    196              if (lstatus!= 0)
             C$L6:
    0000a9b0:  73C0804C   MMOV32    MR0、@0x804c、UNCF
    0000a9b2:  7FA00000   MNOP       
    0000a9b4:  7FA00000   MNOP       
    0000a9b6:  7FA00000   MNOP       
    0000a9b8:  79810014   MBCNDD    0x14、EQ
    0000a9ba:  7FA00000   MNOP       
    0000a9bc:  7FA00000   MNOP       
    0000a9be:  7FA00000   MNOP       
    197                  lstatus+=3;
    0000a9c0:  73C0804C   MMOV32    MR0、@0x804c、UNCF
    0000a9c2:  77C04040   MADDF32   MR0、#0x4040、MR0
    0000a9c4:  74C0804C   MMOV32    @0x804c、MR0
    0000a9c6:  7FA00000   MNOP       
    0000a9c8:  7FA00000   MNOP       
    0000a9ca:  7FA00000   MNOP       
    198              if (lstatus =0)
             C$L7:
    0000a9cc:  73C0804C   MMOV32    MR0、@0x804c、UNCF
    0000a9ce:  7FA00000   MNOP       
    0000a9d0:  7FA00000   MNOP       
    0000a9d2:  7FA00000   MNOP       
    0000a9d4:  7980000E   MBCNDD    0xe、NEQ
    0000a9d6:  7FA00000   MNOP       
    0000a9d8:  7FA00000   MNOP       
    0000a9da:  7FA00000   MNOP       
    199                  lstatus+=4;
    0000a9dc:  73C0804C   MMOV32    MR0、@0x804c、UNCF
    0000a9de:  77C04080   MADDF32   MR0、#0x4080、MR0
    0000a9e0:  74C0804C   MMOV32    @0x804c、MR0


    Edward

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Edward、James、

    CLA 中的许多指令、包括 MMOV32指令、更新了标志。 MMOV32指令更新 ZF 和 NF 标志。 因此、在第二个示例中、分支将根据最近完成的标志更新(即 MMOV32指令)发生、也将不发生。

    您可以在 TRM 中看到这一点。

    Edward、我相信您的理解是正确的。

    希望这能有所帮助。

    此致、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢大家的帮助。

    James