内联asm - 如何读取和设置cpsr

时间:2014-06-02 08:01:57

标签: assembly inline-assembly keil

我正在尝试阅读cpsr并使用这些功能设置cpsr。但是这些功能在 eclipse 中运行良好,但我在keil uvision 4中使用它们时遇到了问题。

static inline unsigned __get_cpsr(void)
{
    unsigned long retval;
    asm volatile (" mrs %0, cpsr" : "=r" (retval) :  );
    return retval;
}

static inline void __set_cpsr(unsigned val)
{
    asm volatile (" msr cpsr, %0":  :"r" (val));
}

我收到此错误:

error:  #65: expected a ";"
error:  #20: identifier "asm" is undefined

因此我使用 __inline __asm ,现在我收到此错误:

source\main.c(94): error:  #18: expected a ")"
source\main.c(94): error:  #18: expected a ")"

有关如何修复它的任何想法?或者在单独的asm file中移动这些函数的步骤是什么,这似乎是一个解决方案,但不幸的是我不太熟悉汇编

1 个答案:

答案 0 :(得分:0)

旧版本 Keil uVision 通常带有自己的编译器和汇编器 (ARMCC 5)。 ARMCC 5 汇编器的汇编格式与 GCC 汇编器的汇编格式不同。

您需要查看差异。

将 ARMCC 6 与较新的 Keil 一起使用应该可以解决该问题,因为 AMRCC 6 使用与 GCC 相同的汇编格式。

虽然如果您需要在 ARMCC 5 中使用它,那么从 https://www.embeddedrelated.com/showthread/lpc2000/7010-1.php 开始,以下内容应该可以工作:

static inline unsigned __get_cpsr(void)
{
    __asm { MRS R0, CPSR }
}

static inline void __set_cpsr(unsigned val)
{
    __asm { MSR CPSR_cxfs, R0 }
}

我还没有研究为什么要添加 cxfs。可能只使用 CPSR

在 C 而不是 C++ 中,以下也应该适用:

static inline unsigned __get_CPSR(void)
{
    register unsigned regCPSR     __asm("cpsr");
    return(regCPSR);
}

static inline unsigned __set_CPSR(void)
{
    register unsigned regCPSR     __asm("cpsr");
    return(regCPSR);
}

https://www.keil.com/support/man/docs/armcc/armcc_chr1359125006491.htm

C++(至少从 17 开始)忽略了 register 关键字,这似乎需要使用汇编。这不太理想。