我想知道为什么不同的编译器使用不同的汇编指令。
例如,我使用内置Cortex-M4的TI cc3200,这里是SDK的真正代码:
#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位指令movw
和movt
,而EWARM ---一个用于32位移动mov32
。根据经验,我发现GCC不支持它们(实际上它支持movw
和movt
,但由于错误constant expression required
,此代码无法编译。所以问题是为什么会这样呢?我认为指令集对于处理器是固定的。此外,我无法找到特定于GCC,EWARM或CCS的cortex-m4指令,我该如何揭示它们?
答案 0 :(得分:1)
答案是,除了体系结构提供的指令外,汇编器通常还会添加一些伪指令来简化语言。在这种情况下,mov32
被组合为movw
指令,后跟movt
。有时,架构的不同汇编器确实实现了相同的伪指令,有时却没有。