ARM > Introduction to ARM > Task One - Answers
Previous topic:
Task One
ARM Blog RISC OS PrivateEye PhotoFiler Geminus IntroductionToARM Toolbar Site Project Containers GitHub Hardware iOS Optimisation Aha Retro Links Dump Spectrum Risc PC The Great Escape Reverse Engineering LEGO Wedding Acorn Doodle Blender 3D Isometric 2D Article Sinclair Ocean Disassembly Chase H.Q. Tip TargetedOptimisation Archimedes Logo BasicOptimisation Slide Trace Hard Disc Vector Recreation Pixel Art Groening Simpsons Futurama Disenchantment BBC Micro Electron MotionMasks Script Python Iyonix QuickFiler Game EfficientC
The routine turns an ASCII character lower-case. In C it would be written like this:
int mystery(int c)
{
unsigned int t;
t = c - 'A';
if (t <= 'Z' - 'A')
c += 'a' - 'A';
return c;
}
The tricky thing here is the coercion to unsigned int
which allows us to replace two comparisons with a single one. This trick, the unsigned range optimisation, is discussed in the Efficient C for ARM course.
We can write it in a more expected way like this:
int mystery2(int c)
{
if (c >= 'A' && c <= 'Z')
c += 'a' - 'A';
return c;
}