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.

[参考译文] MSP430FR5969:PUSHX。 imm20失败?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1423662/msp430fr5969-pushx-a-imm20-fails

器件型号:MSP430FR5969

工具与软件:

当我注意到一些奇怪的东西时、我正在尝试一些东西。 首先、GCC 实用程序 msp430-elf-objdump 显示出20位立即值为16位。

    441c:       80 18 70 12     pushx.a #-21846 ;#0xaaaa
    4420:       aa aa 

扩展字(0x1880)显然有位7被设定、所以值应该为0x1aaaa。

更糟糕的是、当我在 FR5969上执行该指令时、堆栈上的上部字是零、而不是1。 如果我在按下寄存器之前将立即值加载到寄存器中、我将获得预期的20位值。

我仔细检查了文档、结果发现大家可以通过 pushx 使用20位直接值。 汇编器会在不添加警告的情况下接受该行。 但反汇编器和 CPU 会忽略扩展字中的这些位。

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

    尊敬的 David:

    如何使用 TI 编译器发生瞬态? 比如 v21.6.0.LTS?  

    您能给我分享一个简单的项目来重现此问题吗? 我可以在 myside 上尝试它。

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

    我从未使用过、也没有任何其他编译器。 指令编码符合我对文档的期望、A/L 和 B/W 位对于20位是正确的。 我在 GNU 汇编器中发现的另一个奇怪之处是、它甚至将 pushx.w 的位放入扩展字中

    我从未将其用于 MSP430、但我删除了 AS 汇编器 、它生成了相同的编码。 如果操作数对于 pushx.w

    我没有要共享的源文件、因为这是使用 asm()语句提供的。  奇怪的反汇编促使我尝试使用 eFarth 系统执行它。 因为它在 C 编译器输出中没有太多出现。 或根本不是。

    但是,我发现了一个简单的例子。 在 NOP 上编译、设置断点、检查堆栈。

    #include <msp430.h>
    
    
    main(void)
    {
       WDTCTL = WDTPW | WDTHOLD;
       asm(" pushx.a #0xf1234\n");
       asm(" nop\n");
    
    
       while(1)
         LPM3;
    }
    

    有趣的是、mspdebug 会将指令显示为"PUSHX.?":

    04412:80 1F 70 12 34 12 PUSHX.? #0x1234

    当然、堆栈显示有32位被压入、但是前16位是零:

    (mspdebug) MD 0x23fa
    023fa: 34 12 00 00 0c 44 ff 3f ff 3f ff 3f ff 3f |4............?..

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

    我想你是对的,它似乎有些问题 gun 编译器,下面是我的测试  

    Gun v9.3.0.31.  

    但当我更改为 TI  v21.6.0.LTS 编译器时、它将像预期那样改变  

    我将把该线程更改为我们的编译器团队、看看是否有任何意见。

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

    我怀疑这种混淆是文档错误造成的。 图4-31 (slau367)中针对单操作数指令显示的格式没有显示源操作数的版本。 扩展字的低4位一直显示为一个目的。 pushx.a 也不会出现格式异常。

    保留图6-26所示的扩展字的一般形式以获得指导。