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 代码,并比较调用站点。
我正尝试在 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 代码,并比较调用站点。