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.

[参考译文] MSP430FR6047:此汇编序列有什么作用?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1450272/msp430fr6047-what-does-this-assembly-sequence-do

器件型号:MSP430FR6047

工具与软件:

TI 编译器经常生成此序列、看起来什么也不做、结果始终被忽略(正如我所看到的那样)。 假设它有充分的理由生成它、我想了解为何包含它。 我在 RETA 语句之前以及函数中间看到过、此时输出值和 SR 位完全被忽略。

使用的两个寄存器会有所不同。 这将测试 R12中的符号位。 如果置位、R13 = 0xFFFF。 如果清除、则 R13 = 0x0000。 R13值从未在任何地方使用。 我甚至见过 CLR。 W R13表示为下一个语句。 它始终是一个0x8000的测试。

;如果 R12 & 0x8000否则为0x0000、则 R13 = 0xFFFF

位 W    #32768、R12           ;#0x8000
SUBC。 W   R13、R13
库存 W    R13

我在生成的汇编文件的许多位置都可以找到它。 通过查看 C 代码、我似乎无法识别导致生成此程序集的模式。

谢谢。

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

    类似于将16位整数扩展到32位的符号。 当我使用 GCC 测试该创意时:

    long __attribute__((noinline)) test(void)
    {
      return (int)PAIN;
    }
    

    我获得:

        c03e:       1c 42 00 02     mov     &0x0200,r12     ;0x0200
        c042:       3c b0 00 80     bit     #-32768,r12     ;#0x8000
        c046:       0d 7d           subc    r13,    r13     ;
        c048:       3d e3           inv     r13             ;
    

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

    啊。 我现在看到了。 谢谢你。