Here are two assembly language functions which perform division of 32-bit and 16-bit numbers by values in the range 1…16 inclusive. Although the range of the divisor is very limited, these functions are significantly faster than conventional division functions. The 32-bit division requires about 25% of the time required by C51's 32-bit division and the 16-bit division requires about 60% of the time required by C51's 16-bit division. (Even though the Keil division functions seem to be well optimised.) The 32-bit division function is sufficiently fast that it may called more than once to divide a 32-bit value by a large value that has convenient factors. For example, dividing by 60 by first dividing by ten and then by six. This will still be significantly faster than conventional division. The functions also return a remainder and may find useful application in radix conversion by repeated division by the radix. These functions use the interesting trick of deriving a pointer into the current register bank. This allows the functions to loop through the dividend making the code much more compact although at the slight cost of speed.
I have posted updated versions of these functions here: http://www.programmersheaven.com/zone5/cat27/32144.htm The versions posted on the Keil forum contain a minor bug in that the remainder is not returned correctly. The versions at Programmers Heaven are correct and include a radix conversion function. I have posted some other nuggets which can be found here: http://www.programmersheaven.com/zone5/cat27/index.htm Each of my contributions has the epithet fast.