gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:23:56 24 4
gpt4 key购买 nike

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

关于c - Keil 的 C 库中的 __0sprintf 是什么?与完整的 sprintf 相比,如何使用它来节省代码大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58843387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com