It is interesting and not something programmers see much these days.After some thought, I realised that converting the fractional part of a fixed point binary number is considerably easier than converting the integer part. It just needs a multiply from which the integer part is output and the fractional part goes on to the next stage, and UMULL will do that for you, outputting the top 32 bits in one register and the bottom 32 bits in another.
Applying that to a 32-bit integer doesn't work, because what you get is the number as a decimal fraction of 2^32.
However, multiplying the original number by 2^64/10^9 normalises it, and it gives the correct output, but I've not yet tested whether that number is big enough to avoid an error in the LSB for all numbers. In which case an extra shift would be required (but it would only be required ONCE for the whole conversion, not for every digit)
[EDIT] dividing by 10^9 by multiplying by 2^m/10^9 (where m=64) is a magic number division, and the theory says that m>(32+log2(n)).
Log2 of 10^9 is 29.9, so it suggests m=62 ought to be good enough.
The old mainframe language PL/I supported fixed point binary and decimal natively, Ada has fixed decimal as well. I guess one could use a lookup table too, to convert an arbitrary long binary number to packed BCD.