现在我正在尝试理解CM3固件代码。但特别是我发现一些代码是由asm代码如下,asm code
// 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值。
请你指导我怎么把它打印出来好吗?
2条答案
按热度按时间mwecs4sa1#
单向(气体语法):
字符串
另一种方式不需要asm:
型
如果你有一个stdint. h或等效的,可以使用uint32_t而不是unsigned int。(对于gcc和clang/llvm,将得到unsigned int)。
从您的代码/语法派生
型
fquxozlt2#
一个小小的警告。如果你试图使用'C'从地址0x0读取,那么你很有可能会遇到编译时空指针陷阱,因为你的初始堆栈指针指针在C中被定义为不是法律的指针。
因此,根据编译器的不同(gcc 4.9.3之前的版本不会这样做),您可能会在汇编的输出中看到完全意外的
undef_opcode
。在C语言中,没有“干净”的方法从地址0读取,但使用指针算术应该可以工作(除非您启用运行时空指针检查)。