首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MIPS bne汇编指令在Microchip XC32下不能正确执行

MIPS bne汇编指令在Microchip XC32下不能正确执行
EN

Stack Overflow用户
提问于 2021-10-11 00:29:49
回答 1查看 40关注 0票数 1

因此,我使用XC32在MPLABX项目中编译了以下代码,目的是检查我是否需要更改实时操作系统实现的上下文:

代码语言:javascript
复制
    .extern OS_TaskRUNNING, 0x04 # Both of these are pointers in a C file
    .extern OS_TaskNEW, 0x04

CheckSwitch:
    la $1, OS_TaskRUNNING
    la $2, OS_TaskNEW
    lw $1, 0x00($1)
    lw $2, 0x00($2)
    xor $1, $1, $2
    bne $1, $0, ConfirmSwitch
AbortSwitch:
    # stuff happens...
ConfirmSwitch:
    # stuff happens...

当两个指针中的值不同时,程序执行不会转移到ConfirmSwitch,而是继续转移到AbortSwitch (非常细心的人请注意:我对此文件中的代码使用了'noat‘设置)。无论$1和$2的值是什么,分支都不会发生。我尝试过其他的变体,比如bne $1, $2, ConfirmSwitch,结果是一样的。我不知道我可能做错了什么,因为这个功能是如此基本。

EN

回答 1

Stack Overflow用户

发布于 2021-10-11 01:07:09

根据下面的注释解决了这个问题;在每个分支指令后添加nop解决了这个问题。在模拟器中,无论分支条件是否为真,执行都会转到nop,但随后会转到正确的位置。顺便说一下,我还使用了'noreorder‘指令来阻止汇编器重新组织我的代码。XC32汇编程序手册在提到上述指令时讨论了分支延迟槽:“默认情况下,汇编程序试图通过重新排序分支或延迟槽周围的指令来自动填充它。”这是整个手册中唯一真正提到延迟槽的地方--没有讨论什么分支指令需要这些指令,或者它们可能需要多大。我在网上找到了许多示例代码来研究这个问题,甚至都没有提到这件事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69519927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档