首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇编指令和编译器

汇编指令和编译器
EN

Stack Overflow用户
提问于 2017-05-27 03:20:50
回答 1查看 155关注 0票数 1

我想知道为什么不同的编译器使用不同的汇编指令。

例如,我使用TI的cc3200,它内部有Cortex-M4,这是一段来自SDK的真实代码:

代码语言:javascript
复制
#if defined(ewarm)
#define BACK_UP_ARM_REGISTERS() {             \
        __asm(" push {r0-r12,LR} \n" \
          " mov32 r1, vault_arm_registers \n" \
          " mrs  r0,msp \n" \
          " str  r0,[r1] \n" \
          " mrs  r0,psp \n" \
          " str  r0,[r1, #4] \n" \
          " mrs  r0,primask \n" \
          " str  r0,[r1, #12] \n" \
          " mrs  r0,faultmask \n" \
          " str  r0,[r1, #16] \n" \
          " mrs  r0,basepri \n" \
          " str  r0,[r1, #20] \n" \
          " mrs  r0,control \n" \
          " str  r0,[r1, #24] \n"); \
          }
#endif

#if defined(ccs)
#define BACK_UP_ARM_REGISTERS() {     \
        __asm(" push {r0-r12,LR} \n" \
          " movw r1, vault_arm_registers \n" \
          " movt r1, vault_arm_registers \n" \
          " mrs  r0,msp \n" \
          " str  r0,[r1] \n" \
          " mrs  r0,psp \n" \
          " str  r0,[r1, #4] \n" \
          " mrs  r0,primask \n" \
          " str  r0,[r1, #12] \n" \
          " mrs  r0,faultmask \n" \
          " str  r0,[r1, #16] \n" \
          " mrs  r0,basepri \n" \
          " str  r0,[r1, #20] \n" \
          " mrs  r0,control \n" \
          " str  r0,[r1, #24] \n"); \
          }
#endif 

正如你所看到的,这两个宏有不同的指令将32位移入寄存器。CCS支持两个16位指令movwmovt,而EWARM -一个用于32位移动mov32。根据经验,我发现GCC既不支持movw,也不支持movt (实际上它支持movwmovt,但由于错误constant expression required,此代码无法编译)。所以问题是为什么会这样呢?我以为处理器的指令集是固定的。而且我找不到专门针对GCC、EWARM或CCS的cortex M4指令,我怎么才能揭示它们呢?

EN

回答 1

Stack Overflow用户

发布于 2017-05-29 20:28:18

答案是,除了体系结构提供的指令之外,汇编器通常还会添加一些伪指令来简化语言。在本例中,mov32被汇编成一条movw指令,后跟一条movt。一个架构的不同汇编程序有时实现相同的伪指令,有时不实现。

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

https://stackoverflow.com/questions/44208796

复制
相关文章

相似问题

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