【问题标题】:How can we check the register value in inline-assembly in c?我们如何在 c 中检查 inline-assembly 中的寄存器值?
【发布时间】:2018-02-23 11:54:37
【问题描述】:

我想在uVision中用STM32F做一个简单的内联汇编实验,代码如下。

但是我在编译时遇到了一些错误消息。

unsigned int bar(unsigned int r0)

{
  unsigned int r1;
  unsigned int r4 = 1234;
__asm
{


    MOVS  r0,#0
    LDR   r1,[r0]     ; Get initial MSP value
    MOV   SP, r1
    LDR   r1,[r0, #4] ; Get initial PC value
    BX    r1
}

  return(r1);

}

当我编译它时,我得到了以下错误消息。

*** Using Compiler 'V5.06 update 5 (build 528)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'STM32F429_439xx'
compiling main.c...
../main.c(79): error:  #3061: unrecognized instruction opcode
                                LDR   r1,[r0]     ; Get initial MSP value
../main.c(80): error:  #20: identifier "SP" is undefined
                                MOV   SP, r1
../main.c(81): error:  #3061: unrecognized instruction opcode
                                LDR   r1,[r0, #4] ; Get initial PC value
../main.c(82): error:  #1084: This instruction not permitted in inline assembler
                                BX    r1
../main.c(71): warning:  #177-D: variable "r4"  was declared but never referenced
    unsigned int r4 = 1234;
../main.c(82): error:  #114: label "r1"  was referenced but not defined
                                BX    r1
../main.c: 1 warning, 5 errors
"STM32F429_439xx\STM32F429_439xx.axf" - 5 Error(s), 1 Warning(s).
Target not created.
Build Time Elapsed:  00:00:01

我应该怎么做才能解决这个问题?

【问题讨论】:

    标签: arm inline-assembly keil


    【解决方案1】:

    我有一种挥之不去的感觉,即您在此处尝试执行的操作并不完整,因此进行软重置可能会更好。但是;

    http://www.keil.com/support/man/docs/armcc/armcc_chr1359124249383.htm

    内联汇编器不提供对物理的直接访问 ARM处理器的寄存器。如果将 ARM 寄存器名称用作 内联汇编指令中的操作数成为对 同名变量,而不是物理 ARM 寄存器。

    ...

    没有为 sp (r13)、lr (r14) 和 pc (r15) 声明变量 寄存器,它们不能被内联读取或直接修改 汇编代码。

    但是,CMSIS 提供以下功能: https://www.keil.com/pack/doc/CMSIS/Core/html/group__Core__Register__gr.html#gab898559392ba027814e5bbb5a98b38d2

    __STATIC_INLINE uint32_t __get_MSP(void)
    {
      register uint32_t __regMainStackPointer     __ASM("msp");
      return(__regMainStackPointer);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2019-01-31
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多