我们如何在c中检查内联程序集中的寄存器值



我想用STM32F在uVision中进行简单的内联组装实验,如下代码所示。

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

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_v5ARMARMCCBin'
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_439xxSTM32F429_439xx.axf" - 5 Error(s), 1 Warning(s).
Target not created.
Build Time Elapsed:  00:00:01

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

我有一种恼人的感觉,你在这里试图做的事情并不完整,所以进行软重置可能会更好。然而

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);
}

最新更新