我们如何在 c 中检查内联汇编中的寄存器值?

开始01

我想使用 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_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

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

肖恩·霍利汉

我有一种唠叨的感觉,你在这里尝试做的事情并不完整,进行软重置可能会更好。然而;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PowerPC 内联汇编:将 C 值加载到寄存器中

来自分类Dev

如何解决 C 中内联汇编中的错误:'在重新加载'asm'时找不到类'GENERAL_REGS'中的寄存器'

来自分类Dev

C /汇编:如何更改CPU寄存器中的单个位?

来自分类Dev

如何从内联汇编中的两个寄存器中检索值的高位和低位部分?

来自分类Dev

C ++中的扩展内联汇编:是否有必要保留易失性寄存器?

来自分类Dev

我们如何在C ++中从子类中调用父级重载的构造函数?

来自分类Dev

我们如何在源代码中检测所有指针比较?C ++

来自分类Dev

我们如何在C#Windows应用程序中访问动态创建的控件?

来自分类Dev

我们如何在源代码中检测所有指针比较?C ++

来自分类Dev

如何在扩展的GCC内联汇编中将输入操作数(C寄存器变量)标记为混乱的输入?

来自分类Dev

如何使用C的内联汇编器访问ARM Cortex M3的r11寄存器

来自分类Dev

C ++中功能钩子:获取寄存器值并跳回[Windows上的x86汇编]

来自分类Dev

如何从CSV文件(在C中)读写寄存器?

来自分类Dev

我们应该如何在ASP.NET C#应用程序中解析特定的JSON日期格式?

来自分类Dev

什么是可变类。我们如何在C#中创建一个可变且不可变的类

来自分类Dev

GCC ARM如何使用内联汇编将值分配给特定的fp寄存器?

来自分类Dev

我们如何在Swift中评估bool值?

来自分类Dev

我们如何在NSMutableDictionary中存储浮动值

来自分类Dev

如何在NASM汇编器中将寄存器bh中的值添加到ecx?

来自分类Dev

gcc如何知道用于内联汇编的寄存器大小?

来自分类Dev

gcc如何知道用于内联汇编的寄存器大小?

来自分类Dev

我们如何在迁移学习中为我们的培训设置标签?

来自分类Dev

如何在任何类中创建比较器函数,就像我们在C ++ STL中创建priority_queue一样

来自分类Dev

我们如何编写在C ++中返回多个值的函数

来自分类Dev

我们如何在GDB中完成函数调用?

来自分类Dev

我们如何在Liferay中创建后退按钮

来自分类Dev

我们如何在Ruby中做图表示

来自分类Dev

我们如何在sphinx文档中嵌入图像?

来自分类Dev

我们如何在VSCode中编辑Rust文件?

Related 相关文章

  1. 1

    PowerPC 内联汇编:将 C 值加载到寄存器中

  2. 2

    如何解决 C 中内联汇编中的错误:'在重新加载'asm'时找不到类'GENERAL_REGS'中的寄存器'

  3. 3

    C /汇编:如何更改CPU寄存器中的单个位?

  4. 4

    如何从内联汇编中的两个寄存器中检索值的高位和低位部分?

  5. 5

    C ++中的扩展内联汇编:是否有必要保留易失性寄存器?

  6. 6

    我们如何在C ++中从子类中调用父级重载的构造函数?

  7. 7

    我们如何在源代码中检测所有指针比较?C ++

  8. 8

    我们如何在C#Windows应用程序中访问动态创建的控件?

  9. 9

    我们如何在源代码中检测所有指针比较?C ++

  10. 10

    如何在扩展的GCC内联汇编中将输入操作数(C寄存器变量)标记为混乱的输入?

  11. 11

    如何使用C的内联汇编器访问ARM Cortex M3的r11寄存器

  12. 12

    C ++中功能钩子:获取寄存器值并跳回[Windows上的x86汇编]

  13. 13

    如何从CSV文件(在C中)读写寄存器?

  14. 14

    我们应该如何在ASP.NET C#应用程序中解析特定的JSON日期格式?

  15. 15

    什么是可变类。我们如何在C#中创建一个可变且不可变的类

  16. 16

    GCC ARM如何使用内联汇编将值分配给特定的fp寄存器?

  17. 17

    我们如何在Swift中评估bool值?

  18. 18

    我们如何在NSMutableDictionary中存储浮动值

  19. 19

    如何在NASM汇编器中将寄存器bh中的值添加到ecx?

  20. 20

    gcc如何知道用于内联汇编的寄存器大小?

  21. 21

    gcc如何知道用于内联汇编的寄存器大小?

  22. 22

    我们如何在迁移学习中为我们的培训设置标签?

  23. 23

    如何在任何类中创建比较器函数,就像我们在C ++ STL中创建priority_queue一样

  24. 24

    我们如何编写在C ++中返回多个值的函数

  25. 25

    我们如何在GDB中完成函数调用?

  26. 26

    我们如何在Liferay中创建后退按钮

  27. 27

    我们如何在Ruby中做图表示

  28. 28

    我们如何在sphinx文档中嵌入图像?

  29. 29

    我们如何在VSCode中编辑Rust文件?

热门标签

归档