Search code examples
cassemblyarmstm32keil

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


I am trying to use sprintf standard C function in ARM assembler code, in Keil uVision, for STM32. Looking in example C project disassembly, I can see this:

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 code disassembly calls function __0sprintf.

In my assembly program, I write such code:

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

And it works well, but takes up to 11 kB. If I call __0sprintf function in my code:

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

it takes up much less, about 5 kB - but do not work.

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?


Solution

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

    Names beginning with two underscores are reserved for the implementation. That means you're not allowed to use them in your code, but it also means that if you see one, it's probably an internal implementation detail.

    Where can I read about these functions?

    If it's an implementation detail, all you can do is check the documentation for that implementation, ask the vendor or examine the source if it's available, or search to see if someone else has already investigated or decompiled this function.

    May be I can understand why it is not working?

    You can always try disassembling that function from your vendor's runtime library (assuming that doesn't breach some license), or try instruction-stepping into it if the platform has an interactive debugger.

    Otherwise, your best bet is to figure out how to write some regular C code that calls the same implementation, and compare the call sites.