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.
您好! 对于我的应用、我将尝试跳回 存储在复位矢量0xFFFE 中的地址。 我将`asm (" branch &0xFFFE")`执行此操作。 在正常操作中、这似乎可以正常工作、但如果我在指令之前暂停执行并尝试逐步执行(就像我尝试验证它是否有效时那样)、PC 始终 在_reset_vector 处加载20位而不是16位的内存。 即使我跳过仿真指令并直接使用`MOV.W`、情况也是如此。 例如、使用下面的存储器、我希望 PC 加载0x06EAE、但加载的是0xF6EAE。 这仅在我在分支指令处或刚好在分支指令之前暂停执行时发生。 如果我只是简单地连接到调试器并从 main 开始运行、就没有问题。 这不是我第一次被这种行为烧毁,我在这里缺少什么吗? 为什么即使使用小代码模型、分支指令也会加载20位 PC?
使用`asm volatile`似乎可以解析 this....no的原因。 希望能有一些见解。
您好、Jacob:
修复此问题的 volatile 关键字指出、编译器可能是问题的根源。 您正在使用哪个编译器/IDE?
如果是 CCS、您是否可以在调试时转到"View"->"Disassembly"、然后查看两种情况下的实际汇编指令?
此致、
布兰登·费舍尔
我没有看到"分支"助记符。 仅限"BR"和"BRA"。 第一个字符总是清除高4位、而"BRA"是扩展版本。
《MSP430x5xx 用户指南》的第6.6.2.8节的标题为"BR、branch"、适用于作为助记符的其他操作码。 我把这理解为"BR"或"branch"将会"分支到低64k 地址空间中的目标"。 我相信我尝试了全部三个"BR""BRA"和"branch",并得到了相同的结果。
我使用 CCS。 在不使用 Volatile 的情况下调试时、它会显示`BR &_RESET_VECTOR `及操作码` 0x0200 0xFFFE`。 使用 Volatile、它是相同的助记符、但操作码`0x4210 0xFFFE`
从零开始的操作码(例如0x0200)为 MOVA 指令、因此为20位。 以4开始的值为 MOV。
为什么使用 Volatile 会改变我不知道的事情。 借助 GNU 编译器、它禁用了一些可能会导致问题的优化。 docs 说出来。
我使用 GCC 尝试了它并检查了输出。 分支与之不符、BR 生成了 MOV 和 BRA MOVA。 都无需易失性标签。
在我看来、这只是与编译器优化此代码的方式相关的细微差别。 我会看看我们的工具团队能否发表评论。
我不一定希望编译器优化内联汇编语句(除非确定它们无法访问)、但这里我的预期可能不正确。
此致、
布兰登·费舍尔
有关包含 Problem asm 语句的源文件、 请按照 如何提交编译器测试用例一文中的说明进行操作。 创建预处理文件后、添加一条注释、以该文件工作的形式显示 asm 语句、即使用 volatile。
谢谢。此致、
-乔治