Keil 的 C 库中的 __0sprintf 是什么?与完整的 sprintf 相比,如何使用它来节省代码大小?

What is __0sprintf in Keil's C library? How to use it to save code size vs. full sprintf?

我正尝试在 Keil uVision 的 ARM 汇编代码中为 STM32 使用 sprintf 标准 C 函数。 查看示例 C 项目反汇编,我可以看到:

54:         sprintf( test_string, format_string, num); 
0x080028C2 F1000110  ADD      r1,r0,#0x10
0x080028C6 E9D02302  LDRD     r2,r3,[r0,#0x08]
0x080028CA 4810      LDR      r0,[pc,#64]  ; @0x0800290C
0x080028CC F7FFFB66  BL.W     __0sprintf (0x08001F9C)

C代码反汇编调用函数__0sprintf.

在我的汇编程序中,我写了这样的代码:

LDR     r0, =Data_string
LDR     r1, =Format_str
;r2 & r3 loaded above
BL      sprintf

它运行良好,但最多占用 11 kB。 如果我在代码中调用 __0sprintf 函数:

LDR     r0, =Data_string
LDR     r1, =Format_str
;r2 & r3 loaded above
BL      __0sprintf

占用更少,大约 5 kB - 但不起作用。

我在 Google 中找不到任何关于 __0sprintf 函数的信息。我在哪里可以了解这些功能?也许我能理解为什么它不起作用?

I can not find in Google any information about __0sprintf function or something about it.

以两个下划线开头的名称保留用于实现。 这意味着您不能在您的代码中使用它们,但这也意味着如果您看到一个,它可能是一个内部实现细节。

Where can I read about these functions?

如果它是一个实现细节,您所能做的就是检查该实现的文档,询问供应商或检查源代码是否可用,或者搜索以查看是否其他人已经调查或反编译了该函数。

May be I can understand why it is not working?

您始终可以尝试从您的供应商的运行时库中反汇编该函数(假设不​​违反某些许可),或者如果平台具有交互式调试器,则尝试指令单步执行。

否则,最好的办法是弄清楚如何编写一些调用相同实现的常规 C 代码,并比较调用站点。