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.

[参考译文] MSP430-GCC-opensource:GCC 中有错误?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/947629/msp430-gcc-opensource-errors-in-gcc

器件型号:MSP430-GCC-opensource

MSP430是简单而简洁的指令集的一个很好的示例、我在课堂中使用它来展示如何创建反汇编器。 为了测试反汇编器、我编写了一些汇编器代码来生成二进制文件、并发现了一些奇怪的问题:

swpb.b R5 ;汇编器接受而不发出警告,即使 B/W 位也相应设置
;在大多数指令集表中,显示为0和.b 的位没有意义。 硬件有什么作用?

sxt.b r6. ;相同的问题

RRC 0 (r0);生成:错误:RRC:尝试旋转 PC 寄存器
;虽然我知道0(r0)实际上指向操作码后面的字,而不是寄存器
;这类似于自修改代码,但:
RRC 2(r0);没有问题就被接受,这只是略好一些

我在这里弄错了吗?

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

    我可能已经提到了汇编器版本:

    GNU 汇编器(Mitto Systems Limited - MSP430-gcc 9.2.0.50) 2.34
    版权所有(C) 2020 Free Software Foundation、Inc.

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

    甚至 接受"call.b R5"! (B/W 位设置为1)

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

    请确切说明如何调用汇编器。  请复制并粘贴完整命令的文本、不要使用屏幕截图。

    谢谢、此致、

    乔治

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

    当我尝试将"swpb.b R6"作为测试用例时、气体在没有警告的情况下接受了它、但 objdump 将其呈现为".word 0x10c6"。

    至于 swpb.b (0x10c6)的作用、在我的测试中它不交换字节。 它可能会执行其他操作、但它不会执行该操作。

    但是、任何编写 swpb.b 的人都需要一些有用的东西、这会有其他问题。

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

    你好、George。

    我制作了如下所示的 makefile 文件:

    test.hex:test.asm
    msp430-elf-as -o test.obj test.asm -al=test.lst
    msp430-elf-ld -ttest.cmd -o test.out test.objcopy
    -O ihex test.out test.hex
    

    以及用于链接器的简单命令文件:

    内存
    {
    ROM (Rx): origin = 0xfc00、length = 1020
    RESET_Vector (r):origin = 0xfffe、length = 2
    }
    
    SECTIONS
    {
    .text:
    {
    } > ROM
    
    RESET_Vector:
    {
    SHORT (RESET)
    } > RESET_Vector
    }
    

    BTW、我还注意到 call.B 被接受、这毫无意义。

    谢谢、

    John

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

    感谢您的测试、David。

    是的、0x10C6将 B (yte)标志置1 (位6)。

    >但是任何编写 swpb.b 的人都需要一些有用的东西、这会有其他问题。

    也许、但我希望汇编器能够更彻底地检查语法。 尽管可能有99%的用户只是使用气体进行 C 后处理。

    此外、如果在'swpb.b'、'ti.b'、'call.b'和'xt.b'上弹出错误、则会在需要调试之前警告用户出现问题。

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

    气体只是 gcc 的后端。 独立使用是一件棘手的事情。 几年前、他们做了一个改动、打破了我的代码、需要做一些工作来找到一种新的方法来做同样的事情。 如果 gcc 维护人员决定使 gcc 的使用变得更容易、这可能会再次损坏。

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

    我已使用 TI 和 GCC 汇编器尝试了您的测试用例。  它们的行为方式不同。  我不确定哪一个是对的还是错的。  因此、我针对 TI 汇编器提交了问题 EXT_EP-10081。  根据此处发生的情况、我们可能会针对 GCC 汇编器提出另一个问题。  欢迎您使用我的签名中的以下链接关注此问题。

    关于直接调用 GCC 汇编器... 我绝对不会那样做。  我很确定调用 MSP430-elf-gcc (或正在使用的任何 GCC 变体)是一种常见的做法、然后根据文件扩展名根据需要处理文件。  扩展名.s 表示汇编文件。  有关更多详细信息、请参阅  GCC 在线文档中的选项控制输出类型。

    谢谢、此致、

    乔治

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

    我喜欢使用 gcc 而不是 gas 本身、因为它将首先通过预处理器运行扩展名为".S"(大写 S)的汇编语言文件。 因此、我可以将器件头文件与所有这些方便使用的特殊函数寄存器定义一起包含在内。

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

    要了解该主题为何被视为已解决、请参阅 《CCS 论坛使用指南》中的第一个常见问题解答。

    谢谢、此致、

    乔治

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

    我同意汇编器应该更彻底地检查语法。 即使其中一些测试是有争议的、汇编器也应该可以轻松地发现这些测试并发出警告。

    鉴于 MSP430是一个很好的简单指令集、人们编写汇编代码和直接调用 gas 的情况可能并不少见。

    我们的目标是在 MSP430-GCC 的未来版本中改进汇编器语法检查。

    此致、