首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C语言中获取asm变量值?

如何在C语言中获取asm变量值?
EN

Stack Overflow用户
提问于 2019-01-04 23:00:28
回答 2查看 485关注 0票数 0

现在我正在尝试理解CM3固件代码。但我特别发现其中一些代码是由asm代码编写的,如下所示:asm code

代码语言:javascript
复制
// Uart string output 
void UartPuts(unsigned char * mytext)
{
  unsigned char CurrChar;
  do {
    CurrChar = *mytext;
    if (CurrChar != (char) 0x0) {
      UartPutc(CurrChar);  // Normal data
      }
    *mytext++;
  } while (CurrChar != 0); 
  return;
}   
#if defined ( __CC_ARM   )
/* ARM RVDS or Keil MDK */
__asm void FlashLoader_ASM(void)
{
   MOVS  R0,#0
   LDR   R1,[R0]     ; Get initial MSP value
   MOV   SP, R1
   LDR   R1,[R0, #4] ; Get initial PC value
   BX    R1
}

我想用UartPuts函数把MSP值和PC值打印出来。

你能指导我怎么把它打印出来吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-06 14:22:04

单向(gas语法):

代码语言:javascript
复制
.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr

extern unsigned int GET32 ( unsigned int );
unsigned int x;
...
x = GET32(0x00000000);
...
x = GET32(0x00000004);

另一种不需要asm的方式:

代码语言:javascript
复制
#define ZERO (*((volatile unsigned int *)0x00000000))
#define FOUR (*((volatile unsigned int *)0x00000004))
...
unsigned int x;
...
x = ZERO;
...
x = FOUR;

如果您有stdint.h或等效的类型,则可以使用uint32_t代替unsigned int。(将导致gcc和clang/llvm的无符号int )。

派生自您的代码/语法

代码语言:javascript
复制
__asm uint32_t read_zero(void)
{
   MOVS  R0,#0
   LDR   R0,[R0]
   BX LR
}

__asm uint32_t read_four(void)
{
   MOVS  R0,#4
   LDR   R0,[R0]
   BX LR
}
票数 0
EN

Stack Overflow用户

发布于 2019-02-26 17:27:01

一个小小的警告。如果您尝试使用'C‘从地址0x0读取,则很有可能会遇到编译时空指针陷阱,因为您的初始堆栈指针在C中被定义为不合法的指针。

因此,根据编译器的不同( gcc 4.9.3之前的版本不会这样做),您可能会在汇编的输出中看到完全意想不到的undef_opcode。在C中没有“干净”的方法来读取地址0,但是使用指针算术应该可以(除非你启用了运行时空指针检查)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54041413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档